【问题标题】:AES - Convert Javascript decryption algorithm to PythonAES - 将 Javascript 解密算法转换为 Python
【发布时间】:2021-08-07 11:01:52
【问题描述】:

我正在尝试将 Javascript 解密算法转换为 Python,但得到 ValueError: Incorrect AES key length (64 bytes)

Javascript 版本:

<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
<script>
//------------------------------------------------------------------------------------------------------------
//JS compatible decryption algo
//------------------------------------------------------------------------------------------------------------
function decrypt(cypher_text, keyIn, IVIn){
var iv = CryptoJS.enc.Hex.parse(IVIn);

var key = CryptoJS.enc.Hex.parse(keyIn);

var ct = CryptoJS.enc.Base64.parse(cypher_text);

var decrypted = CryptoJS.AES.decrypt({ciphertext: ct, salt: ""}, key, {iv: iv}).toString(CryptoJS.enc.Utf8);
return decrypted;
}

var key = "3166626465356135633961303634353662393166363430306633656365366162";
var ciphertext = "WCJcIFWu+3gC3nesXiiVcvXsVB104J10ZBVky2KIg1pXO9AWoI45ClkWg5EkW/3aBHGPcE5F7bXf8W0dtn8UcrJv7reR1dETQX9cgO7qYPonmNNrbdJprxR/2Z/e3AJGUGrhsjZC8IaiL3mM7+sHSAIm1lsusk9ZjJchpxm00CHQh698ILdG9+8/FCSNTJ3QTm9vy8BDmt8XmGl95ORcryUleBLfI2VpY9cNKzXLIYBBBD8OoDH8ASqh5LSb/PQTr96cYJJQG+3P+xvg623pJxuzMXgoqZuDXaoY082fzWGuaU6Pr8zKI6DxMjBX4j6sCo2Csilma6MG6zJWMQ6QWdG+ulilvLluolwiCECLqd4qbEeCBBJ7oagjr5sdCz2lNX/E";
var IV = "111d8a663094d022a548d5e79670be37";
var decrypted = decrypt(ciphertext, key, IV);
</script>

<!DOCTYPE html>
<html>
<body>

<script>
document.write(decrypted);
</script>

</body>
</html>

输出(Javascript 版本):

"[{\"record_index\":15145877,\"unit_id\":\"AWTIRDMVAPU397\",\"tag_id\":3461

Python 版本:

# decrypting the data

# decryption
key = "3166626465356135633961303634353662393166363430306633656365366162"
iv = "111d8a663094d022a548d5e79670be37"
ciphertext = "WCJcIFWu+3gC3nesXiiVcvXsVB104J10ZBVky2KIg1pXO9AWoI45ClkWg5EkW/3aBHGPcE5F7bXf8W0dtn8UcrJv7reR1dETQX9cgO7qYPonmNNrbdJprxR/2Z/e3AJGUGrhsjZC8IaiL3mM7+sHSAIm1lsusk9ZjJchpxm00CHQh698ILdG9+8/FCSNTJ3QTm9vy8BDmt8XmGl95ORcryUleBLfI2VpY9cNKzXLIYBBBD8OoDH8ASqh5LSb/PQTr96cYJJQG+3P+xvg623pJxuzMXgoqZuDXaoY082fzWGuaU6Pr8zKI6DxMjBX4j6sCo2Csilma6MG6zJWMQ6QWdG+ulilvLluolwiCECLqd4qbEeCBBJ7oagjr5sdCz2lNX/E"
#print(ciphertext)

cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(ciphertext)
decryptedUnpad = unpad(decrypted, AES.block_size)
# print(decryptedUnpad)
content = decryptedUnpad

print(str(content))

输出(Python - ValueError: Incorrect AES key length (64 bytes)):

Traceback (most recent call last):
  File "C:/Users/Admin/Desktop/TestProp/main.py", line 192, in <module>
    cipher = AES.new(key, AES.MODE_CBC, iv)
  File "C:\Users\Admin\Desktop\TestProp\venv\lib\site-packages\Crypto\Cipher\AES.py", line 232, in new
    return _create_cipher(sys.modules[__name__], key, mode, *args, **kwargs)
  File "C:\Users\Admin\Desktop\TestProp\venv\lib\site-packages\Crypto\Cipher\__init__.py", line 79, in _create_cipher
    return modes[mode](factory, **kwargs)
  File "C:\Users\Admin\Desktop\TestProp\venv\lib\site-packages\Crypto\Cipher\_mode_cbc.py", line 274, in _create_cbc_cipher
    cipher_state = factory._create_base_cipher(kwargs)
  File "C:\Users\Admin\Desktop\TestProp\venv\lib\site-packages\Crypto\Cipher\AES.py", line 93, in _create_base_cipher
    raise ValueError("Incorrect AES key length (%d bytes)" % len(key))
ValueError: Incorrect AES key length (64 bytes)

我在这里错过了什么?

【问题讨论】:

    标签: javascript python python-3.x encryption cryptography


    【解决方案1】:

    您缺少从hexb64 准备数据的相应python 步骤

    var iv = CryptoJS.enc.Hex.parse(IVIn);    
    var key = CryptoJS.enc.Hex.parse(keyIn);    
    var ct = CryptoJS.enc.Base64.parse(cypher_text);
    
    key = bytearray.fromhex(key)
    iv = bytearray.fromhex(iv)
    ciphertext = b64decode(ciphertext)
    

    您的数据似乎被截断了,所以我删除了最后 4 个 b64 字符,以便能够正确解密

    from base64 import b64decode
    
    from Crypto.Cipher import AES
    from Crypto.Util.Padding import pad, unpad
    
    key = "3166626465356135633961303634353662393166363430306633656365366162"
    iv = "111d8a663094d022a548d5e79670be37"
    ciphertext = "WCJcIFWu+3gC3nesXiiVcvXsVB104J10ZBVky2KIg1pXO9AWoI45ClkWg5EkW/3aBHGPcE5F7bXf8W0dtn8UcrJv7reR1dETQX9cgO7qYPonmNNrbdJprxR/2Z/e3AJGUGrhsjZC8IaiL3mM7+sHSAIm1lsusk9ZjJchpxm00CHQh698ILdG9+8/FCSNTJ3QTm9vy8BDmt8XmGl95ORcryUleBLfI2VpY9cNKzXLIYBBBD8OoDH8ASqh5LSb/PQTr96cYJJQG+3P+xvg623pJxuzMXgoqZuDXaoY082fzWGuaU6Pr8zKI6DxMjBX4j6sCo2Csilma6MG6zJWMQ6QWdG+ulilvLluolwiCECLqd4qbEeCBBJ7oagjr5sdCz2l"
    
    key = bytearray.fromhex(key)
    iv = bytearray.fromhex(iv)
    ciphertext = b64decode(ciphertext)
    
    cipher = AES.new(key, AES.MODE_CBC, iv)
    decrypted = cipher.decrypt(ciphertext)
    print(decrypted)
    
    # b'"[{\\"record_index\\":15145877,\\"unit_id\\":\\"AWTIRDMVAPU397\\",\\"tag_id\\":3461,\\"alarms\\":{\\"Track Mode\\":false,\\"Battery\\":false,\\"Geofence\\":false,\\"Coverage\\":true,\\"Memory\\":false,\\"CBit\\":false,\\"Moveme
    # nt\\":\\"Unknown\\",\\"Tamperfoil\\":false},\\"batt\\":3.6800000000000002,\\"temperature\\":2'
    

    该代码只有在数据在加密之前被填充时才有用

    decryptedUnpad = unpad(decrypted, AES.block_size) 
    print(decryptedUnpad)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-16
      • 1970-01-01
      • 2023-03-18
      • 2011-03-27
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      • 2019-09-21
      相关资源
      最近更新 更多