我正在使用 Zend2 Crypt module加密数据。这是我的代码。
$cipher = BlockCipher::factory('mcrypt', array(
'algorithm' => 'aes',
));
$cipher->setKey('mypassphrase');
$encrypted = $cipher->encrypt('Hey, I am the secret data');
太棒了,效果很好!现在,我需要用 Python 解密 $encrypted 数据(嘿,我是 secret 数据)。
我正在使用 pycrypto 来做到这一点。在我的 PHP 环境之外解密数据的步骤是什么?
from Crypto.Cipher import AES
import base64
import hashlib
password = 'mypassphrase'
key = hashlib.sha256(password).digest()
decoded = base64.standard_b64decode(encrypted)
cipher = AES.new(key, AES.MODE_CBC)
data = cipher.decrypt(decoded)
我需要指定一个 IV 因为 Zend 默认使用 MODE_CBC。如何在我的 Python 代码中指定它?
这是 Zend2 文档:
The output of the encryption is a string, encoded in Base64 (default), that contains the HMAC value, the IV vector, and the encrypted text. The encryption mode used is the CBC (with a random IV by default) and SHA256 as default hash algorithm of the HMAC. The Mcrypt adapter encrypts using the PKCS#7 padding mechanism by default. You can specify a different padding method using a special adapter for that (Zend\Crypt\Symmetric\Padding). The encryption and authentication keys used by the BlockCipher are generated with the PBKDF2 algorithm, used as key derivation function from the user’s key specified using the setKey() method.
有人可以帮助我调整我的 Python 代码来解密数据吗? 谢谢
请您参考如下方法:
我找到了一种方法来解密 Zend2 加密的数据。这是我的代码:
from base64 import b64decode
from Crypto import Random
from Crypto.Cipher import AES
from Crypto.Hash import SHA256, HMAC
from Crypto.Protocol.KDF import PBKDF2
# The hmac starts from 0 to 64 (length).
hmac_size = 64
hmac = data[:hmac_size]
# The cipher text starts after the hmac to the end.
# The cipher text is base64 encoded, so I decoded it.
ciphertext = data[hmac_size:]
ciphertext = b64decode(ciphertext)
# The IV starts from 0 to 16 (length) of the ciphertext.
iv = ciphertext[:16]
# The key size is 256 bits -> 32 bytes.
key_size = 32
# The passphrase of the key.
password = 'mypassphrase'
# The key is generated using PBKDF2 Key Derivation Function.
# In the case of Zend2 Crypt module, the iteration number is 5000,
# the result length is the key_size * 2 (64) and the HMAC is computed
# using the SHA256 algorithm
the_hash = PBKDF2(password, iv, count=5000, dkLen=64, prf=lambda p, s:
HMAC.new(p, s, SHA256).digest())
# The key starts from 0 to key_size (32).
key = the_hash[:key_size]
# The hmac key starts after the key to the end.
key_hmac = the_hash[key_size:]
# HMAC verification
hmac_new = HMAC.new(key_hmac, 'aes%s' % ciphertext, SHA256).hexdigest()
if hmac_new != hmac:
raise Exception('HMAC verification failed.')
# Instanciate the cipher (AES CBC).
cipher = AES.new(key, AES.MODE_CBC, iv)
# It's time to decrypt the data! The ciphertext starts after the IV (so, 16 after).
data = cipher.decrypt(ciphertext[16:])
任务成功!
