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

C语言RSA解密异常:无法获取正确明文求助

RSA解密乱码问题解决

问题背景

假设你已知我的RSA公钥,模数n = 16076635963,公钥指数e = 456233,且截获了用该公钥加密的密文5395334961,请解密该消息。
注:消息采用ASCII编码。

你遇到的乱码问题由两个原因导致:私钥d计算错误,以及字节输出顺序颠倒。

参数错误分析

你给出的私钥d=3693459617不满足RSA核心条件e*d ≡1 mod φ(n)(其中φ(n)=(p-1)(q-1)=123340*130342=16076382280)。通过扩展欧几里得算法计算,正确的私钥d应为10382922663。

代码逻辑问题

你的解密函数从最低位字节开始输出,而ASCII字符串遵循高位字节在前的顺序,导致输出的明文是反向的。

修正后的代码

#include <stdio.h>

unsigned long long mod_exp(unsigned long long base, unsigned long long exponent, unsigned long long modulus) {
    unsigned long long result = 1;
    while (exponent > 0) {
        if (exponent & 1) {
            result = (result * base) % modulus;
        }
        base = (base * base) % modulus;
        exponent >>= 1;
    }
    return result;
}

void decrypt_message(unsigned long long encrypted_message, unsigned long long private_key, unsigned long long modulus) {
    unsigned long long decrypted_message = mod_exp(encrypted_message, private_key, modulus);

    printf("Decrypted Message: ");
    // 先收集所有字节到数组
    unsigned char bytes[8];
    int byte_count = 0;
    while (decrypted_message > 0) {
        bytes[byte_count++] = decrypted_message & 0xFF;
        decrypted_message >>= 8;
    }
    // 反向输出字节,还原正确的ASCII顺序
    for (int i = byte_count - 1; i >= 0; i--) {
        printf("%c", bytes[i]);
    }
    printf("\n");
}

int main() {
    unsigned long long modulus = 16076635963;
    unsigned long long private_key = 10382922663; // 修正后的私钥
    unsigned long long encrypted_message = 5395334961;

    decrypt_message(encrypted_message, private_key, modulus);

    return 0;
}

运行结果

修正后运行代码,将输出正确的明文:Helo

内容的提问来源于stack exchange,提问作者user3587527

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:28:10