C语言自定义加密程序ASCII值计算异常 解密结果错误如何修复?
问题根因
- 核心问题1:整数除法截断丢失信息
你加密步骤中temp = (temp - 30)/2使用C语言整数除法,当temp-30为奇数时会直接丢弃小数部分向下取整,该过程不可逆,解密时乘2就会比原始值少1,出现字符偏移。
举个实际的例子对应你的输入:第一个明文字符HASCII值为72,密码首字符mASCII值为109,相加得181,减30得151,151除以2是75.5,整数除法截断为75;解密时75乘2得150,加30再减109得到71,对应字符G,刚好和你解密输出的第一个字符偏移情况完全吻合。 - 核心问题2:字符串缺少终止符
你定义的res数组长度仅为输入字符串的长度,没有预留\0作为字符串结束标识,printf("%s")读取时会越界访问内存,可能输出随机垃圾字符甚至程序崩溃。
修复方案
方案1:保留原有加解密逻辑框架,修复截断和结束符问题
直接移除会导致信息丢失的除法步骤,同时补充字符串结束符即可:
#include <stdio.h> #include <string.h> void encrypt(char word[], char password[]) { int word_len = strlen(word); int pwd_len = strlen(password); // 多留1位存储字符串结束符 char res[word_len + 1]; int temp; for (int i = 0; i < word_len; i++){ temp = (int) word[i]; temp = temp + (int) password[i % pwd_len]; // 移除除法避免信息截断 temp = temp - 30; res[i] = (char) temp; } // 补充字符串结束符 res[word_len] = '\0'; printf("%s\n", res); } void decrypt(char word[], char password[]) { int word_len = strlen(word); int pwd_len = strlen(password); char res[word_len + 1]; int temp; for (int i = 0; i < word_len; i++){ temp = (int) word[i]; // 对应加密逻辑移除乘2步骤 temp = temp + 30; temp = temp - (int) password[i % pwd_len]; res[i] = (char) temp; } res[word_len] = '\0'; printf("%s\n", res); } int main(void) { encrypt("Hello World", "main"); // 替换为encrypt输出的新加密串测试即可 decrypt("替换为实际加密输出的字符串", "main"); return 0; }
方案2:改用无精度丢失的异或流加密逻辑
如果希望加密结果都是可打印字符,用异或加模映射的逻辑更稳定,加解密天然对称无信息丢失:
#include <stdio.h> #include <string.h> void encrypt(char word[], char password[]) { int word_len = strlen(word); int pwd_len = strlen(password); char res[word_len + 1]; for (int i = 0; i < word_len; i++){ // 异或后映射到可打印ASCII范围(32-126) res[i] = (word[i] ^ password[i % pwd_len]) % 94 + 32; } res[word_len] = '\0'; printf("%s\n", res); } void decrypt(char word[], char password[]) { int word_len = strlen(word); int pwd_len = strlen(password); char res[word_len + 1]; for (int i = 0; i < word_len; i++){ res[i] = ((word[i] - 32) % 94) ^ password[i % pwd_len]; } res[word_len] = '\0'; printf("%s\n", res); } int main(void) { encrypt("Hello World", "main"); decrypt("替换为encrypt输出的加密串", "main"); return 0; }
内容的提问来源于stack exchange,提问作者yawad
相关产品推荐
相关产品推荐

