我试图在CryptoJS上解密,在PyCrypto中加密。
我看到了这非常好的答案,它的作用类似于魅力,唯一的问题是它调整了PyCrypto以与CryptoJS一起工作,我更喜欢定义规则--如何期望输入,并尽可能少地对默认的PyCrypto进行调整。
我想请你送静脉,然后用零填充。
我用JS (ES6)编写了以下内容:
const iv = CryptoJS.enc.Hex.parse("1234567889012345");
const key = 'aR1h7EefwlPNVkvTHwfs6w=='
const encrypted = AES.encrypt(
password,
key,
{
iv,
padding: CryptoJS.pad.NoPadding
}
);
const payload = {password: encrypted, iv: iv};
// make HTTPS POST callPython:
def decrypt_from_cryptoJS(encrypted, iv):
key = "aR1h7EefwlPNVkvTHwfs6w==".encode()
aes = AES.new(key.encode(), AES.MODE_CBC, iv)
encrypted = aes.decrypt(base64.b64decode(encrypted)))然而,我得到了ValueError:raise TypeError("Object type %s cannot be passed to C code" % type(data))
如果我尝试通过:CryptoJS.lib.WordArray.random(16)创建VI并通过JS的toString()方法发送它,我得到:
Incorrect IV length (it must be 16 bytes long)用于启动AES
如何在CryptoJS中解密,并在PyCrypto中进行最小的代码调整?我不确定我是否走对了路。
发布于 2020-01-11 15:43:27
WordArray-objects [1]传递.CryptoJS提供用于将字符串转换为WordArray-objects的编码器,反之亦然的[2]。如果将密钥作为字符串传递,则将其视为密码,而实际的键和IV则从它派生出来(在引用的答案中,用于此操作的算法是在Python[3]上实现的)。WordArray,必须使用CryptoJS端的be 64编码器。在Python方面,键必须是Base64 64解码的(这仍然需要添加到已发布的代码中)。注意:在已发布的代码中,键被视为Utf8 8-字符串,因此密钥的长度为24个字节,使用的是AES-192。如果这是有意的,Utf8 8编码器必须使用在密码端,而不是Base64 64编码器。在Python方面,密钥的Base64 64解码就没有必要了。WordArray#concat进行连接。在Python方面,分离是通过切片来完成的(仍然需要添加到发布的代码中)。padding: CryptoJS.pad.ZeroPadding显式地指定它。PyCrypto不会自动删除填充,也就是说必须手动完成(这仍然需要添加到已发布的代码中)。注意,与PyCrypto不同,PyCryptodome支持填充[6]。一个可能的JavaScript代码是:
var password = "The quick brown fox jumps over the lazy dog";
var iv = CryptoJS.lib.WordArray.random(16); // Generate a random 16 bytes IV
var key = CryptoJS.enc.Base64.parse('aR1h7EefwlPNVkvTHwfs6w=='); // Interpret key as Base64 encoded
var encrypted = CryptoJS.AES.encrypt(password, key, {iv: iv}); // Use CBC-mode and PKCS7-padding
var joinedData = iv.clone().concat(encrypted.ciphertext); // Concat IV and Ciphertext
var joinedDataB64 = CryptoJS.enc.Base64.stringify(joinedData);
console.log(joinedDataB64.replace(/(.{64})/g, "$1\n"));<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.min.js"></script>
适当的Python代码可以是:
from Crypto.Cipher import AES
import base64
def decrypt_from_cryptoJS(encrypted, iv):
key = base64.b64decode("aR1h7EefwlPNVkvTHwfs6w==") # Interpret key as Base64 encoded
aes = AES.new(key, AES.MODE_CBC, iv) # Use CBC-mode
encrypted = aes.decrypt(encrypted) # Remove Base64 decoding
return encrypted
def unpadPkcs7(data):
return data[:-ord(data[-1])]
#return data[:-data[-1]] #Python 3
joinedDataB64 = "sbYEr73hZVKviuQ2rt5RcJ5ugpn7XBLTtZIKKk5JjTXmGojFkAS+dK0D8NNAET6bC/Ai4sx+El5Bzu4igT1S9g=="
joinedData = base64.b64decode(joinedDataB64)
iv = joinedData[:16] # Determine IV from concatenated data
encrypted = joinedData[16:] # Determine ciphertext from concatenated data
decrypted = unpadPkcs7(decrypt_from_cryptoJS(encrypted, iv)) # Decrypt and remove PKCS7-padding manually
print decrypted
#print(decrypted) #Python 3https://stackoverflow.com/questions/59678348
复制相似问题