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
相关产品推荐
相关产品推荐

