Javascript 使用WebCryptoAPI加密大型文件

Javascript 使用WebCryptoAPI加密大型文件,javascript,encryption,webcrypto-api,Javascript,Encryption,Webcrypto Api,我正在尝试使用加密工具加密大文件(>1GB) 加密小文件效果很好,但当我尝试加密大文件时,我的浏览器挂起,加密似乎从未完成 我认为最好的选择是读取并加密文件的块,而不是在完成读取时将这些块合并在一起 这里有人有加密和合并块的经验吗?如果是这样的话,如果有人能给我举个例子或给我指出正确的纠正方法,我将不胜感激 提前谢谢 显然,高级WebCryptoAPI的设计并没有考虑流式/大型消息。然而,如果你看看常见的密码操作模式,你会发现你可以使用不同的模式,这样你就可以连接不同的密文,得到完整的密文 您可

我正在尝试使用加密工具加密大文件(>1GB)

加密小文件效果很好,但当我尝试加密大文件时,我的浏览器挂起,加密似乎从未完成

我认为最好的选择是读取并加密文件的块,而不是在完成读取时将这些块合并在一起

这里有人有加密和合并块的经验吗?如果是这样的话,如果有人能给我举个例子或给我指出正确的纠正方法,我将不胜感激


提前谢谢

显然,高级WebCryptoAPI的设计并没有考虑流式/大型消息。然而,如果你看看常见的密码操作模式,你会发现你可以使用不同的模式,这样你就可以连接不同的密文,得到完整的密文

您可以将AES-CBC用于1 MiB区块(或16字节的任意倍数),并使用从第一个到最后16个字节的密文作为IV来加密下一个区块。您必须排除最后一个块,因为它包含除最后一个块之外的任何块的加密填充。不幸的是,这不是一种完整性/身份验证模式,其结果是容易受到填充oracle攻击的攻击,因此我仍然不推荐使用它。此外,在取消填充时,不能使用相同的方法进行解密

类似地,您可以对计数器使用计数器(CTR)模式,从计数器值开始,然后在1个MiB之后继续使用计数器值进行加密(因为1个MiB包含65536个块),然后在2个MiB之后使用
|00000000000
。。nonce是先前IV/初始计数器块中唯一的8字节值。此密码在加密和解密之间具有完美的对称性,并且不使用填充。然而,它很容易受到对手改变的影响;基本上,对手可以翻转密文中的任何字节,从而翻转明文中的任何位。这也可能导致进一步的明文预言,并泄露更多信息

请注意,不能对AEAD密码(如GCM)执行相同的操作。在这种情况下,您需要使用nonce和身份验证标记扩展密文。但您仍然可以加密,比如说,1个MiB,并将其扩展为12字节的nonce、1个MiB的密文和16字节的身份验证标记。然后,您可以使用较大的块大小进行解密,并获得1个MiB明文块。请注意,您仍然必须在身份验证标记上执行MAC,否则攻击者可能会对1 MiB+28B大小的块重新排序。一种方法是使用身份验证标记作为AAD输入执行0字节的GCM加密

哦,我想这就是你在API的初衷之外使用它所得到的。这是完全可能的,但我想是的,需要一些研究



这里使用1 MiB表示1024 x 1024字节,或1024 KiB。Mega的意思是百万,不是-嗯,我又忘了确切的金额。

非常感谢您的详细解释。我目前正在使用AES-CBC。我能做些什么来防止oracle攻击吗?另外,当我消除填充时,我可以使用什么方法来解密数据。是的,你可以对所有字节执行HMAC。但是,如果该函数也只允许完整的消息输入,那么您可能需要使用例如Merkle列表在块上创建哈希,然后在哈希值上执行HMAC。2.您只会忽略块之间的虚假填充。上述方案的结果将与普通CBC密文相同。所以接收者可以使用任何提供(逐段)CBC解密的函数。@Maarten,学术界有没有关于CTR模式的明文甲骨文示例?不确定,但设计一个假设的是相当简单的,对吗?