我正在尝试使用crypto.subtle.encrypt
来加密某些数据,并且一次我可以加密的数据量遇到麻烦。使用链接maxChunkSizeInBytes = keySizeInBytes – 42
的链接crypto.stackexchange.com和stackoverflow.com中指出,使用RSA-OAEP的2048位密钥的最大块大小为214Bytes。
使用crypto.subtle.encrypt
和2048位密钥以及RSA-OAEP算法,我只能加密190字节。小于190字节的任何数量都可以正常工作,而大于190字节的任何数量都将导致错误。我不能完全确定错误的类型(因为我无法捕获它),但是我认为它是OperationError
,引用为developer.mozilla.org。
在此处显示的TypeScript示例中,有两个数据块d1
和d2
,其大小分别为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算法时是否缺少某些内容?
答案 0 :(得分:1)
使用公式modulus size - 2 - 2*hash size
,对于SHA256(32字节)它可以正常工作。似乎您要应用SHA1大小(20字节)
SHA256:256 - 2 - 2*32 = 190
SHA1:256 - 2 - 2*20 = 214