gpt4 book ai didi

javascript - 使用 WebCrypto 进行 AES 加密数据长度

转载 作者:行者123 更新时间:2023-12-03 04:48:39 29 4
gpt4 key购买 nike

我想做的是在网络浏览器中使用 SubtleCrypto.encrypt() 提供的 128 位 AES-CBC 加密来加密 16 字节数据包。

我期望找到 16 字节输入的 16 字节加密数据。

我实际上发现 16 字节的输入有 32 字节的加密数据。

具体来说,15 字节的输入产生 16 字节的输出,16 字节的输入产生 32 字节的输出,17 字节的数据产生 32 字节的输出。

我的问题是,为什么 16 字节的输入数据会产生 32 字节的输出?我怀疑只有 > 16 字节的输入数据才会发生这种情况,而不是 >= 16 字节。

将以下测试代码保存到文件并使用网络浏览器打开。

<html>
<head>
<script>

var myKey = window.crypto.getRandomValues(new Uint8Array(16));
console.log("Raw key = " + myKey);
var keyObj = {};
var keyFormat = "raw";
var extractable = false;
var usages = ["encrypt", "decrypt"];
window.crypto.subtle.importKey(keyFormat, myKey, "AES-CBC", extractable, usages)
.then(function(importedKey) {
keyObj = importedKey;
console.log("Encryption/Decryption key object = " + keyObj);

var vector = window.crypto.getRandomValues(new Uint8Array(16));

var encryptThis15 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
var encryptThis16 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]);
var encryptThis17 = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]);

var decryptSuccess = function(decrypted) {
var decryptedData = new Uint8Array(decrypted);
console.log("Decrypted data = " + decryptedData.length + " bytes: " + decryptedData);
};

var decryptFail = function(error) {
// Fail.
console.log("Failure decrypting data. Error: " + error);
};

var encryptSuccess = function(encData) {
var encryptedData = new Uint8Array(encData);
console.log("Encrypted data = " + encryptedData.length + " bytes: " + encryptedData);
return encData;
};

var encryptFail = function(error) {
console.log("Failure encrypting data. Error: " + error);
};

console.log("15 byte data array as input = " + encryptThis15);

window.crypto.subtle.encrypt({name: "AES-CBC", iv: vector}, keyObj, encryptThis15)
.then(encryptSuccess)
.then(function(encrypted){return window.crypto.subtle.decrypt({name: "AES-CBC", iv: vector}, keyObj, encrypted);})
.then(decryptSuccess)
.catch(decryptFail);

console.log("16 byte data array as input = " + encryptThis16);

window.crypto.subtle.encrypt({name: "AES-CBC", iv: vector}, keyObj, encryptThis16)
.then(encryptSuccess)
.then(function(encrypted){return window.crypto.subtle.decrypt({name: "AES-CBC", iv: vector}, keyObj, encrypted);})
.then(decryptSuccess)
.catch(decryptFail);

console.log("17 byte data array as input = " + encryptThis17);

window.crypto.subtle.encrypt({name: "AES-CBC", iv: vector}, keyObj, encryptThis17)
.then(encryptSuccess)
.then(function(encrypted){return window.crypto.subtle.decrypt({name: "AES-CBC", iv: vector}, keyObj, encrypted);})
.then(decryptSuccess)
.catch(decryptFail);

})
.catch(function(err){
console.log("Key generation error = " + err);
});

</script>
<title>WebCrypto encrypt test</title>
</head>
<body>
<p>See console log.</p>
</body>
</html>

最佳答案

PKCS#5/7 填充规定 block 必须将字节 aa 字节附加到明文,直到 block 完成。也就是说,如果您尝试加密:

  • 15字节:填充变为01
  • 14 字节:填充变为 02 02
  • 13 字节:填充变为 03 03 03

如果您正在使用此填充模式(您就是这样)并且您加密的数据大小与 block 大小相同(您的大小为 16 字节),则该 block 不会被填充,并且使用相同的填充模式解密将失败。因此,您必须在明文末尾添加 16 字节的 0x10

关于javascript - 使用 WebCrypto 进行 AES 加密数据长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42757686/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com