为什么WebCryptoAPI RSA-OAEP加密功能无法在给定密钥大小下使用预期的最大块大小?

时间:2019-05-18 06:51:23

标签: encryption rsa webcryptoapi

我正在尝试使用crypto.subtle.encrypt来加密某些数据,并且一次我可以加密的数据量遇到麻烦。使用链接maxChunkSizeInBytes = keySizeInBytes – 42的链接crypto.stackexchange.comstackoverflow.com中指出,使用RSA-OAEP的2048位密钥的最大块大小为214Bytes。

使用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算法时是否缺少某些内容?

1 个答案:

答案 0 :(得分:1)

使用公式modulus size - 2 - 2*hash size,对于SHA256(32字节)它可以正常工作。似乎您要应用SHA1大小(20字节)

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

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