带计数器的 CryptoJS 解密
CryptoJS decryption with counter
我有以下 python 使用 pycryptodome 进行 AES 解密的代码,我验证了它并且可以正常工作。
key = "password"
key = hashlib.sha256(key.encode("utf-8")).digest()
iv = b'This is an IV456' #Random.new().read(AES.block_size)
iv_int = int(binascii.hexlify(iv), 16) # Convert the IV to a Python integer.
ctr = Counter.new(AES.block_size * 8, initial_value=iv_int) # Create a new Counter object with IV = iv_int.
aes = AES.new(key, AES.MODE_CTR, counter=ctr)
decryptData = aes.decrypt(encryptedData) # Decrypt and return the plaintext.
现在我需要使用 CryptoJS 在 python 中转换此代码,我已经完成了一些编码但不知道计数器 ctr
是如何生成的。
var i8a = new Uint8Array(data);
var password = "password";
var key = CryptoJS.SHA256(password);
var input = CryptoJS.lib.WordArray.create(i8a);
var output =CryptoJS.AES.decrypt(input, key, { mode: CryptoJS.mode.CTR});
var str = output.toString(CryptoJS.enc.Base64);
但是 str
总是 none。
编辑:
根据下面的评论,我在配置中添加了 iv
和 noPadding 选项,但解密 return 仍然为空。
var iv = "112197289293498629157884805399637669174";
//iv = CryptoJS.enc.Base64.parse(iv); //enable this doesn't make any changes.
var output =CryptoJS.AES.decrypt(input, key,{ mode: CryptoJS.mode.CTR,iv:iv,padding: CryptoJS.pad.NoPadding});
我从 python 方 iv_int
获得 iv 值的地方。
并且无法从 python 脚本中删除 counter
,我会在其中出现错误,例如,
'counter' keyword parameter is required with CTR mode
注意:我正在通过webRTC数据通道从python发送加密数据到js。
编辑2:
我在python,
中实际使用的python中的加密代码
def encrypt(row):
key = "password"
key = hashlib.sha256(key.encode("utf-8")).digest()
iv = b'This is an IV456' #Random.new().read(AES.block_size)
iv_int = int(binascii.hexlify(iv), 16)
ctr = Counter.new(AES.block_size * 8, initial_value=iv_int)
cipher = AES.new(self.key, AES.MODE_CTR,counter=ctr)
return base64.b64encode(cipher.encrypt(raw))
加密输入数据
fp = open(filepathFull, "rb")
while (True) and not done_reading:
data = fp.read(16384)
encrypted = encrypt(data)
sendWebrtcDataChannel(encrypted)
CryptoJS 代码中需要进行以下更改:
- 计数器的初始值必须用作IV。由于 IV 由 ASCII 字符组成,因此可以使用 Latin1 编码器对其进行解析,或者使用十六进制编码器将其解析为十六进制字符串。 IV 必须在
decrypt
. 中传递
decrypt
期望密文作为 CipherParams
对象。
- CryptoJS 默认使用 CBC 和 PKCS7。其他值必须在
decrypt
中明确指定。由于CTR模式不使用padding,所以必须指定mode和padding。
以下 JavaScript 代码与 Python 代码相同:
// Testdata: Ciphertext as Array
var data = [0xa6, 0x8a, 0x3c, 0x0d, 0xeb, 0x9a, 0xfc, 0x9d, 0xb1, 0x83, 0xb0, 0x47, 0x9c, 0x63, 0x65, 0x1d, 0x16, 0x6e, 0x53, 0xac, 0xf4, 0xda, 0x0f, 0xac, 0xe3, 0x56, 0xf4, 0xfe, 0x2e, 0xf5, 0x1a, 0x19, 0xd5, 0x50, 0x5f, 0x1a, 0x85, 0x34, 0x6c, 0xac, 0x47, 0xd6, 0x2c];
var i8a = new Uint8Array(data);
var password = "password";
var key = CryptoJS.SHA256(password);
var iv = CryptoJS.enc.Latin1.parse("This is an IV456"); // Parse the IV with Latin1 encoder
//var iv = CryptoJS.enc.Hex.parse('5468697320697320616e204956343536'); // or with Hex encoder
var input = CryptoJS.lib.WordArray.create(i8a);
var output = CryptoJS.AES.decrypt(
{
ciphertext: input // Pass the ciphertext as CipherParams object
},
key,
{
iv: iv, // Pass IV
mode: CryptoJS.mode.CTR, // Specify mode
padding: CryptoJS.pad.NoPadding // Specify padding
});
var str = output.toString(CryptoJS.enc.Base64);
console.log(str);
var str = output.toString(CryptoJS.enc.Utf8);
console.log(str);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
如果在Python代码中
encryptedData = binascii.unhexlify("a68a3c0deb9afc9db183b0479c63651d166e53acf4da0face356f4fe2ef51a19d5505f1a85346cac47d62c")
用于密文,明文结果相同
我有以下 python 使用 pycryptodome 进行 AES 解密的代码,我验证了它并且可以正常工作。
key = "password"
key = hashlib.sha256(key.encode("utf-8")).digest()
iv = b'This is an IV456' #Random.new().read(AES.block_size)
iv_int = int(binascii.hexlify(iv), 16) # Convert the IV to a Python integer.
ctr = Counter.new(AES.block_size * 8, initial_value=iv_int) # Create a new Counter object with IV = iv_int.
aes = AES.new(key, AES.MODE_CTR, counter=ctr)
decryptData = aes.decrypt(encryptedData) # Decrypt and return the plaintext.
现在我需要使用 CryptoJS 在 python 中转换此代码,我已经完成了一些编码但不知道计数器 ctr
是如何生成的。
var i8a = new Uint8Array(data);
var password = "password";
var key = CryptoJS.SHA256(password);
var input = CryptoJS.lib.WordArray.create(i8a);
var output =CryptoJS.AES.decrypt(input, key, { mode: CryptoJS.mode.CTR});
var str = output.toString(CryptoJS.enc.Base64);
但是 str
总是 none。
编辑:
根据下面的评论,我在配置中添加了 iv
和 noPadding 选项,但解密 return 仍然为空。
var iv = "112197289293498629157884805399637669174";
//iv = CryptoJS.enc.Base64.parse(iv); //enable this doesn't make any changes.
var output =CryptoJS.AES.decrypt(input, key,{ mode: CryptoJS.mode.CTR,iv:iv,padding: CryptoJS.pad.NoPadding});
我从 python 方 iv_int
获得 iv 值的地方。
并且无法从 python 脚本中删除 counter
,我会在其中出现错误,例如,
'counter' keyword parameter is required with CTR mode
注意:我正在通过webRTC数据通道从python发送加密数据到js。
编辑2:
我在python,
中实际使用的python中的加密代码 def encrypt(row):
key = "password"
key = hashlib.sha256(key.encode("utf-8")).digest()
iv = b'This is an IV456' #Random.new().read(AES.block_size)
iv_int = int(binascii.hexlify(iv), 16)
ctr = Counter.new(AES.block_size * 8, initial_value=iv_int)
cipher = AES.new(self.key, AES.MODE_CTR,counter=ctr)
return base64.b64encode(cipher.encrypt(raw))
加密输入数据
fp = open(filepathFull, "rb")
while (True) and not done_reading:
data = fp.read(16384)
encrypted = encrypt(data)
sendWebrtcDataChannel(encrypted)
CryptoJS 代码中需要进行以下更改:
- 计数器的初始值必须用作IV。由于 IV 由 ASCII 字符组成,因此可以使用 Latin1 编码器对其进行解析,或者使用十六进制编码器将其解析为十六进制字符串。 IV 必须在
decrypt
. 中传递
decrypt
期望密文作为CipherParams
对象。- CryptoJS 默认使用 CBC 和 PKCS7。其他值必须在
decrypt
中明确指定。由于CTR模式不使用padding,所以必须指定mode和padding。
以下 JavaScript 代码与 Python 代码相同:
// Testdata: Ciphertext as Array
var data = [0xa6, 0x8a, 0x3c, 0x0d, 0xeb, 0x9a, 0xfc, 0x9d, 0xb1, 0x83, 0xb0, 0x47, 0x9c, 0x63, 0x65, 0x1d, 0x16, 0x6e, 0x53, 0xac, 0xf4, 0xda, 0x0f, 0xac, 0xe3, 0x56, 0xf4, 0xfe, 0x2e, 0xf5, 0x1a, 0x19, 0xd5, 0x50, 0x5f, 0x1a, 0x85, 0x34, 0x6c, 0xac, 0x47, 0xd6, 0x2c];
var i8a = new Uint8Array(data);
var password = "password";
var key = CryptoJS.SHA256(password);
var iv = CryptoJS.enc.Latin1.parse("This is an IV456"); // Parse the IV with Latin1 encoder
//var iv = CryptoJS.enc.Hex.parse('5468697320697320616e204956343536'); // or with Hex encoder
var input = CryptoJS.lib.WordArray.create(i8a);
var output = CryptoJS.AES.decrypt(
{
ciphertext: input // Pass the ciphertext as CipherParams object
},
key,
{
iv: iv, // Pass IV
mode: CryptoJS.mode.CTR, // Specify mode
padding: CryptoJS.pad.NoPadding // Specify padding
});
var str = output.toString(CryptoJS.enc.Base64);
console.log(str);
var str = output.toString(CryptoJS.enc.Utf8);
console.log(str);
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
如果在Python代码中
encryptedData = binascii.unhexlify("a68a3c0deb9afc9db183b0479c63651d166e53acf4da0face356f4fe2ef51a19d5505f1a85346cac47d62c")
用于密文,明文结果相同