【问题标题】:Why WebCryptoAPI RSA-OAEP encrypt function is unable to use the expected maximum chunk size for a given key size?为什么 WebCryptoAPI RSA-OAEP 加密功能无法使用给定密钥大小的预期最大块大小?
【发布时间】:2019-05-18 06:51:23
【问题描述】:

我正在尝试使用crypto.subtle.encrypt 加密一些数据,但我一次可以加密的数据量遇到了麻烦。使用 RSA-OAEP 的 2048 位密钥的最大块大小为 214 字节,如链接 crypto.stackexchange.comstackoverflow.com 中使用关系 maxChunkSizeInBytes = keySizeInBytes – 42 所示。

使用crypto.subtle.encrypt 和 2048 位密钥和 RSA-OAEP 算法,我只能加密 190 字节。低于 190 字节的任何数量都可以正常工作,高于 190 字节的任何数量都会导致错误。我不完全确定错误的类型(因为我无法捕捉到它),但我认为它是 OperationError ,参考 developer.mozilla.org

在此处显示的 TypeScript 示例中,有两个数据块 d1d2,大小分别为 190 字节和 214 字节。数据块d1 加密得很好,但是d2 没有。

const MSG_LEN_1 = 190;
const MSG_LEN_2 = 214;

const d1 = (window.crypto.getRandomValues(new Uint8Array(MSG_LEN_1))).buffer;
const d2 = (window.crypto.getRandomValues(new Uint8Array(MSG_LEN_2))).buffer;

let encData = async (data: ArrayBuffer) => {
    const key = await crypto.subtle.generateKey(
        {
            name: "RSA-OAEP",
            modulusLength: 2048,
            publicExponent: new Uint8Array([1, 0, 1]),
            hash: "SHA-256",
        },
        true,
        ["encrypt", "decrypt"]
    );
    const enc = await crypto.subtle.encrypt(
            {
              name: "RSA-OAEP"
            },
            key.publicKey,
            data
          );
    return enc;
};

encData(d1).then(
    (enc : ArrayBuffer) => {
        alert("Success working on d1");
    }
);

encData(d2).then(
    (enc : ArrayBuffer) => {
            alert("Success working on d2");
    }
);

在 Firefox 和 Chrome 中编译和运行上述 TypeScript 时(通过包含在一个简单的 html 页面中),我注意到第一个警报后开发者控制台中出现了 Uncaught (in promise) DOMException 错误。

在使用 crypto.subtle.encrypt 或错误地使用 RSA-OAEP 算法时,我是否遗漏了什么?

【问题讨论】:

  • 可能是我使用了错误的关系,我应该使用maxChunkSizeInBytes = keySizeInBytes - hashSizeInBytes * 2 – 2,所以对于带有 SHA-256 哈希的 2048 位密钥,它的 2048/8-256/8*2-2=190 字节?
  • 没错,一个 SHA-256 哈希的大小是 256 位 / 32 字节

标签: encryption rsa webcrypto-api


【解决方案1】:

使用公式modulus size - 2 - 2*hash size,它适用于 SHA256(32 字节)。看来您正在应用 SHA1 大小(20 字节)

  • SHA256:256 - 2 - 2*32 = 190

  • SHA1:256 - 2 - 2*20 = 214

【讨论】:

  • 是的,刚刚使用 SHA-512 测试了示例,最大大小为 126Bytes 。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2020-04-07
  • 1970-01-01
  • 2014-02-21
  • 2017-07-11
  • 2011-12-10
  • 1970-01-01
  • 2019-04-26
相关资源
最近更新 更多