我正在创建一个简单的加密程序。 我将字符添加到字符以创建新字符。
到目前为止,新的“char”通常由“?”表示。
我的假设是 char 变量有一个最大和,一旦它被传递,它就会循环回 0。
假设逻辑:
如果字符 a == 1 && 字符 z == 255 那么 256 应该 == a。
事实似乎并非如此。
<小时/>此代码片段将一个字符添加到一个字符。 它经常打印出类似的内容:
for (int i = 0; i < half; ++i) {
halfM1[i] = halfM1[i] + halfP1[i];
halfM2[i] = halfM2[i] + halfP2[(half + i)];
}
printf("\n%s\n", halfM1 );
printf("%s\n", halfM2);
返回:
a???
3d??
<小时/>
此代码片段删除了添加的字符,字符串恢复正常。
for (int i = 0; i < half; ++i) {
halfM1[i] = halfM1[i] - halfP1[i];
halfM2[i] = halfM2[i] - halfP2[(half + i)];
}
printf("\n%s\n", halfM1 );
printf("%s\n", halfM2);
返回:
messagepart1
messagepart2
<小时/>
代码在技术上是有效的,但我希望加密以字符为单位。
如果质疑为什么“一半”无处不在。 消息和 key 被分成两半,因此消息的前半部分和后半部分有单独的加密。
最佳答案
首先,常见的char
不存在“环绕”这样的东西。 。常见char
是 x86 中的有符号类型,有符号整数没有环绕。相反,溢出会导致未定义的行为。此外,char
的范围s 可以是 -128 ... 127,甚至是其他值
出于加密目的,您需要使用无符号字符,或者更好的是,使用 uint8_t
的原始八位字节(<stdint.h>
)。
第二个问题是您使用 %s
进行打印。可能的 256 个结果字符之一是 \0
。如果它进入结果字符串,它将提前终止该字符串。而不是使用 %s
,你应该用 fwrite(halfM1, buffer_size, 1, stdout)
输出它。当然,问题是输出仍然是一些二进制垃圾。为此,许多 Unix 加密程序将写入文件,或者可以选择输出 ASCII-armoured file 。一个简单的 ASCII 装甲将输出为 hex instead of binary.
第三个是,有一种操作比加密目的的加法/减法要好得多:XOR ,或halfM1[i] = halfM1[i] ^ halfP1[i];
- 其美妙之处在于它是它自己的逆!
关于C:如何将字符添加到字符,并在达到最大字符时循环回 'a' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54758874/