gpt4 book ai didi

javascript - RSA 加密字符串长于 key

转载 作者:行者123 更新时间:2023-11-30 17:13:45 25 4
gpt4 key购买 nike

嘿伙计们,

我正在用 JS 和公钥加密字符串。我使用 JSBN 代码,但问题在于创建 BigInt。

RSA.js 可以:

// Copyright (c) 2005  Tom Wu
var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3); // getting the Bigint
if(m == null) return null; // nullcheck
var c = this.doPublic(m); // encrypting the BigInt

问题出在“pkcs1pad2”。如果文本较长,则该函数会检查 key 的 BitLength。如果是,则返回,否则创建一个 BigInt。

// Copyright (c) 2005  Tom Wu
if(n < s.length + 11) { // TODO: fix for utf-8
alert("Message too long for RSA");
return null;
}
var ba = new Array();
var i = s.length - 1;
while(i >= 0 && n > 0) {
var c = s.charCodeAt(i--);
if(c < 128) { // encode using utf-8
ba[--n] = c;
} else if((c > 127) && (c < 2048)) {
ba[--n] = (c & 63) | 128;
ba[--n] = (c >> 6) | 192;
} else {
ba[--n] = (c & 63) | 128;
ba[--n] = ((c >> 6) & 63) | 128;
ba[--n] = (c >> 12) | 224;
}
}
ba[--n] = 0;
var rng = new SecureRandom();
var x = new Array();
while(n > 2) { // random non-zero pad
x[0] = 0;
while(x[0] == 0) rng.nextBytes(x);
ba[--n] = x[0];
}
ba[--n] = 2;
ba[--n] = 0;
return new BigInteger(ba);

我不明白作者用“//TODO: fix for utf-8”是什么意思。谁能解释一下? &/给出有效的答案?

最佳答案

这会尝试实现 PKCS#1 中定义的 PKCS#1 v1.5 填充.用于加密的 PKCS#1 v1.5 填充输入 must be 11 bytes smaller than the size of the modulus :

M : message to be encrypted, an octet string of length mLen,where mLen <= k - 11

如果消息较大,则 RSA 加密无法继续。通常这不是问题:您使用带有随 secret 钥的对称密码进行加密,然后使用 RSA 对该随 secret 钥进行加密。这称为 hybrid cryptosystem .

之所以会有评论,是因为 JavaScript 与许多脚本语言一样,在区分字节和文本方面存在一些问题。如果 s 是文本,那么 s.length 可能会返回字符数而不是字节数。这是为实现 weak typing 的语言特意设计的,但它并没有使在 JavaScript 中创建和使用加密算法变得更容易。

如果您使用 UTF-8 等多字节编码,则编码为 2 个字节的字符会增加明文的总大小(以字节为单位)。所以计算可能会在那个时候失败。要么,要么你会丢失不能用单个字节编码的字符 - 如果我快速看一下代码,如果你超出 ASCII(7 位,值 0..127)范围可能会发生什么字符。

关于javascript - RSA 加密字符串长于 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26493756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com