我使用Zend2密码模块加密数据。这是我的密码。
$cipher = BlockCipher::factory('mcrypt', array(
'algorithm' => 'aes',
));
$cipher->setKey('mypassphrase');
$encrypted = $cipher->encrypt('Hey, I am the secret data');
太棒了,效果很好!现在,我需要解密Python中的$encrypted
数据(嘿,我是秘密数据)。
我是用墓穴来做这个的。在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文档:
加密的输出是一个字符串,以Base64 (默认)编码,包含HMAC值、IV向量和加密文本。使用的加密模式是CBC (默认情况下是随机IV )和SHA256作为HMAC的默认哈希算法。默认情况下,Mcrypt适配器使用PKCS#7填充机制进行加密。您可以使用特殊的适配器指定不同的填充方法(Zend\Crypt\对称\填充)。BlockCipher使用的加密和身份验证密钥是使用PBKDF2算法生成的,该算法用作使用setKey()方法指定的用户密钥的密钥派生函数。
有人能帮我修改我的Python代码来解密数据吗?谢谢
发布于 2013-02-11 10:56:57
我找到了一种方法来解密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:])
任务成功了!
https://stackoverflow.com/questions/14775464
复制相似问题