我在尝试使用 RSA-OAEP 加密某些消息时遇到了此问题。
令我惊讶的是(作为加密领域的初学者),在某些情况下 SHA-256
可以工作,而 SHA-512
则不行。
我在 https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt#rsa-oaep 中找不到任何有用的信息
下面是来自 https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey 的一些修改后的演示代码
let message = `{"url":"https://stackoverflow.com/questions/8936984/uint8array-to-string-in-javascript","title":"Uint8Array to string in Javascript - Stack Overflow"}`
let message2 = `just some tree`; // If using SHA-512, this shorter message works but above doesn't
let enc = new TextEncoder()
let dataArray = enc.encode(message)
let keyPair = await window.crypto.subtle.generateKey(
{
name: "RSA-OAEP",
modulusLength: 2048,
publicExponent: new Uint8Array([1, 0, 1]),
hash: "SHA-512", // If switched to SHA-256 everything works
},
true,
["encrypt", "decrypt"]
)
let ciphertext = await window.crypto.subtle.encrypt(
{
name: 'RSA-OAEP',
},
keyPair.publicKey,
dataArray
)
let buffer = new Uint8Array(ciphertext, 0, 5);
console.log(`Successful, First 5 bytes: ${buffer}`);
在上面的演示代码中,如果哈希函数切换为 SHA-256
一切正常,但如果是 SHA-512
则无法执行
我尝试了较短的message2
。令我惊讶的是,它适用于 SHA-256
和 SHA-512
我已经测试了 async
await
和 .then
风格。这似乎不是问题。
我认为这与某种长度或字符限制有关?那么这是否意味着我必须使用SHA-256
?还想知道这是否是一个错误或预期的功能,如果是预期的,官方的长度限制是什么?
最佳答案
使用 RSA,只能加密短消息。最大消息长度由 key 大小(模数大小)减去取决于填充的值得出。
对于 OAEP,后者取决于所使用的摘要,以字节为单位:2 * (hLen + 1)
,其中 hLen
是摘要的输出大小字节(参见 here )。
因此,对于 SHA-256,对于 2048 位(256 字节) key ,最大消息长度(以字节为单位)为:256 - 2 * (32 + 1) = 190
对于 SHA-512 :256 - 2 * (64 + 1) = 126
。
在您的示例中,message
是 UTF-8 编码的 150 字节,因此只能应用 SHA-256,而不能应用 SHA-512。相比之下,message2
采用 UTF-8 编码,长度为 14 字节,因此可以使用两种摘要:SHA-256 和 SHA-512。
请注意,较长的明文不是使用 RSA 加密的,而是使用 hybrid encryption 加密的。 .
关于javascript - 为什么 Web 加密 SHA-256 会加密消息,而 SHA-512 有时会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75634547/