C加密和解密中的Caesar Cipher,ASCII值太高



我正在为C编写加密/解密代码。虽然我有足够好的代码加密和解密仍然有一些错误。我希望用户输入介于"!"之间(ASCII值32(和"~"(ASCII值126(,但是,当用户输入具有相当高偏移量/键值的字符(如"~"(时,输出在扩展的ASCII字符范围内。是否有任何方法可以强制输出不在扩展字符范围内,并且仍然正确解密/加密?

我一直在修改"密码"的值,但这并没有起到太大的作用。

下面是我的代码

void Encryption(char* OriginalText, int offset) {
int i = 0;
int cipher;
char encrypt;
printf("Encrypted string: n");
while (OriginalText[i] != '') {
if (OriginalText[i] == ' ') {
encrypt = ' ';
printf("%c", encrypt);
i = i + 1;
}
cipher = ((int)OriginalText[i] + (offset % 26) % -26);
encrypt = (char)(cipher);
printf("%c", encrypt);
i = i + 1;
}
printf("n");
}

"%"运算符的优先级高于"+"运算符。因此,它首先应用于表达式offset % 26的结果,然后添加到OriginalText[i]

为了解决这个问题,您应该在密码分配中添加另一对括号:

cipher = (((int)OriginalText[i] + (offset % 26)) % -26);

此外,当您处理ASCII字符时,为了安全起见,防止恼人和不必要的错误,您应该将I/O视为无符号字符,因此:

unsigned char cipher;
unsigned char encrypt;
...
cipher = ((OriginalText[i] + (offset % 26)) % 26);
encrypt = cipher;

您应该首先将字符转换为介于0和字母表大小(不包括(之间的索引,即ABC从0到25。只有这样才能进行模块化加法/减法运算。最后,转换回来。最好的方法是简单地执行character - 'a'(当然是小写字符(。不要对ASCII值本身执行模块化操作。

最新更新