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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 15:24:04