凯撒加密和解密C ++

时间:2016-10-20 09:10:56

标签: c++ encryption caesar-cipher

我想知道如何将加密的ASCII范围限制在32 - 126之间。

对于我们的任务,我们应该将字符串转换为char并加密/解密每个字符。

我目前正在使用此加密

int value = (value-32+shift)%95+32 //value is the current ascii value of a                 
                                   //character
                                   //the first shift is given by the user with regards 
                                   //to how many shifts he wants to do to the right

这用于解密

int value = (value-32-shift)%95+32

我的加密工作完美(当我引用解密功能时)但我的解密工作方式不正常。

额外注意:我们只需要在编码时进行右移,为整个程序提供单个字符串进行加密和解密("这是C ++")

Give shift: 3
Wklv#lv#F..
DECODE 
Wklv#lv#F..  //must be 'THIS is C++'
ENCODE       //shift=15
This is C++  //must be 'cwx#/x#/R::'  
DECODE 
EYZdpZdp4{{  //must be 'THIS is C++'
ENCODE      //shift=66
cwx#/x#/R::  //must be "8LMWbMWb'mm"
DECODE 
This is C++
ENCODE       //shift=94
cwx#/x#/R::  //must be 'SGHR~hr~B**'
DECODE 
This is C++

注意:在添加更多代码描述的过程中

2 个答案:

答案 0 :(得分:2)

Modulo operator with negative values解释了您的问题。我不确定这是完全重复的。问题是解码一个密码字符,如'!'转移超过一个(说" 3")

int value = (value-32-shift)%95+32
          = ('!'-32-3)%95+32
          = (33-32-3)%95+32
          = (-2)%95 + 32
          = -2 + 32
          = 30

糟糕。你需要使用:

int value = (value-32+(95-shift))%95+32

答案 1 :(得分:2)

问题是(value-32-shift)可能变为负面。模运算不会包围,但实际上反映了'大约为零(如果你想知道原因,请参见this question and answer)。 要确保您的值保持正值,请在执行模运算之前添加95:

int value = (value-32-shift+95)%95+32