You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

字符串密钥Caesar cipher解密函数公式错误问题求助

问题分析
  • 映射逻辑反向错误:加密逻辑为「明文字符在letters数组的下标j → 取key[j % 密钥长度]作为密文字符」,解密时应该先找到密文字符在生成后的key数组中的下标,再用该下标去letters数组取对应字符得到明文,现有代码仍然去letters中匹配密文字符的下标,逻辑完全反向。
  • 计算公式非法:解密代码中k = j%strlen(key) - k % 26存在两个问题,一是赋值号右侧的k未初始化就参与计算,属于未定义行为;二是该公式完全不符合凯撒解密的逆运算逻辑,没有实际意义。
  • 边界隐患:enc数组仅定义了25字节长度,若输入待解密字符串长度超过24会发生缓冲区溢出,存在崩溃风险。
修正方案

正确解密逻辑如下:

  1. 同加密流程,先输入密钥并调用CSK_keygen生成去重后的密钥串
  2. 遍历每个待解密的密文字符
  3. 找到当前密文字符在生成后的key数组中的下标pos
  4. 明文字符直接取letters[pos]即可
  5. 输出所有明文字符

修正后的解密代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:45:07