字符串密钥Caesar cipher解密函数公式错误问题求助
问题分析
- 映射逻辑反向错误:加密逻辑为「明文字符在
letters数组的下标j→ 取key[j % 密钥长度]作为密文字符」,解密时应该先找到密文字符在生成后的key数组中的下标,再用该下标去letters数组取对应字符得到明文,现有代码仍然去letters中匹配密文字符的下标,逻辑完全反向。 - 计算公式非法:解密代码中
k = j%strlen(key) - k % 26存在两个问题,一是赋值号右侧的k未初始化就参与计算,属于未定义行为;二是该公式完全不符合凯撒解密的逆运算逻辑,没有实际意义。 - 边界隐患:
enc数组仅定义了25字节长度,若输入待解密字符串长度超过24会发生缓冲区溢出,存在崩溃风险。
修正方案
正确解密逻辑如下:
- 同加密流程,先输入密钥并调用
CSK_keygen生成去重后的密钥串 - 遍历每个待解密的密文字符
- 找到当前密文字符在生成后的
key数组中的下标pos - 明文字符直接取
letters[pos]即可 - 输出所有明文字符
修正后的解密代码:
void CSK_decrypt(char msg[]) { // 扩大明文缓冲区避免溢出,重命名为dec更易区分 char key[26], dec[256]; int i, j, key_len; printf("Key: "); // 数组名本身就是指针,去掉多余的取地址符& scanf("%s", key); CSK_keygen(key); key_len = strlen(key); for(i=0; i<strlen(msg); i++) { // 查找密文字符在key中的对应下标 for(j=0; j<key_len; j++) { if(msg[i] == key[j]) { dec[i] = letters[j]; break; } } } printf("Denc: "); for (i=0; i<strlen(msg); i++) printf("%c", dec[i]); printf("\n"); }
内容的提问来源于stack exchange,提问作者Josan Veronica
相关产品推荐
相关产品推荐

