javascript - 为什么 Web 加密 SHA-256 会加密消息,而 SHA-512 有时会失败?

标签 javascript cryptography webcrypto-api subtlecrypto

我在尝试使用 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-256SHA-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/

相关文章:

java - 加密函数每次返回不同的输出

javascript - 在 Nodejs 中加密并使用 WebCrypto API 在客户端解密

javascript - 提交表单后如何留在页面上

javascript - 如何使用 javascript 将文本框的值赋予 ngModel 文本框

javascript - 在 Javascript 上实现 Diffie Hellman key 交换?

java - Blob 算法不起作用

rsa - 无法使用 SubtleCrypto Web Crypto API 解密使用 PyCryptodome 加密的 RSA-OAEP 消息

javascript - WebCryptoAPI 是否在浏览器或远程服务器上运行

javascript - date.setHours() 不起作用

javascript - 当容器有选择框时 jQuery mouseleave 触发的问题