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

RSA加解密后隔位字符丢失及长串乱码问题求助

RSA解密后字符丢失/乱码问题修复

问题根源

你的代码中字符串与BigInt互转的两个函数逻辑不兼容,导致验证后解析字符串时出现字符丢失或乱码:

  • stringToBigInt 处理字符时,将每个码点按2字节(或4字节)的长度进行移位存储
  • bigIntToString 却按单字节(8位)逐位读取并解析,这就把原本2字节的字符拆成了两个单字节值,其中一个是无效的空字符(显示为空格),看起来就是每隔一位字符消失;长字符串则因字节错位出现乱码。

修复方案

让两个函数的字节处理逻辑统一,以下是两种可行的修复方式:

方式1:统一按单字节(ASCII)处理(适合仅ASCII字符的场景)

修改stringToBigInt,每个字符按单字节存储:

function stringToBigInt(str) {
    let result = 0n;
    for (let i = 0; i < str.length; i++) {
        const codePoint = str.codePointAt(i);
        // 每个字符按单字节(8位)处理
        result = result * 256n + BigInt(codePoint);
        // 处理UTF-16代理对(支持Emoji等扩展字符)
        if (codePoint > 0xFFFF) {
            i++;
        }
    }
    return result;
}

bigIntToString 保持不变即可,它原本就是按单字节读取的逻辑。

方式2:正确处理UTF-16码点(支持所有Unicode字符)

修改bigIntToString,使其匹配stringToBigInt的码点长度存储逻辑:

function bigIntToString(value) {
    let result = '';
    let current = value;
    const bytes = [];

    // 先提取所有字节
    while (current > 0n) {
        bytes.push(Number(current & 255n));
        current = current >> 8n;
    }
    bytes.reverse();

    // 按码点长度解析
    let i = 0;
    while (i < bytes.length) {
        // 处理4字节的扩展码点
        if (i + 3 < bytes.length && bytes[i] >= 0xF0) {
            const codePoint = (bytes[i] << 24) | (bytes[i+1] << 16) | (bytes[i+2] << 8) | bytes[i+3];
            result += String.fromCodePoint(codePoint);
            i += 4;
        } else {
            // 处理2字节的普通码点
            const codePoint = (bytes[i] << 8) | bytes[i+1];
            result += String.fromCodePoint(codePoint);
            i += 2;
        }
    }
    return result;
}

验证修复

修改后测试消息"1234567",验证后的bigIntToString(verifiedMessage)会正确输出"1234567";长字符串也不会再出现乱码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:00:26