c - C 加密和解密中的凯撒密码,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] != '\0') {
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;
推荐阅读
- python - Keras 错误:dense_3 层的输入 0 与层不兼容::预期 min_ndim=2,发现 ndim=1。收到的完整形状:[16]
- algorithm - 如何设计使用 A* 寻路算法找到 FASTEST 路线的成本函数和启发式函数?
- ios - 嵌套的 UICollectionView 为每个部分返回相同的值 - Swift
- python-3.x - 为每个列表列表造一个词
- algorithm - 最长回文子串。以下 DP + Recursive 方法的运行时间可能是多少。是 O(n^2) 还是 O(n^3)
- swift - 如何解决 WKWebView 较小的内容高度值问题?
- java - 如何在 Spring Boot 中将字符串列表传递给 @Query
- laravel - 如何将变量填充到所有查看登录用户
- javascript - Javascript - 帮助更新我的计算器的显示以显示按下按钮的数量
- assembly - 在装配体中对齐数据