我有一个通过JavaScript加密的密码
var password = 'sample'
var passphrase ='sample_passphrase'
CryptoJS.AES.encrypt(password, passphrase)
然后我试图解密来自Python中JavaScript的密码:
from Crypto.Cipher import AES
import base64
PADDING = '\0'
pad_it = lambda s: s+(16 - len(s)%16)*PADDING
key = 'sample_passphrase'
iv='11.0.0.101' #------> here is my question, how can I get this iv to restore password, what should I put here?
key=pad_it(key) #------> should I add padding to keys and iv?
iv=pad_it(iv) ##
source = 'sample'
generator = AES.new(key, AES.MODE_CFB,iv)
crypt = generator.encrypt(pad_it(source))
cryptedStr = base64.b64encode(crypt)
print cryptedStr
generator = AES.new(key, AES.MODE_CBC,iv)
recovery = generator.decrypt(crypt)
print recovery.rstrip(PADDING)
我在浏览器控制台中检查了JS,它显示了CryptoJS.AES.encrypt(password, passphrase)
中的IV是一个具有某些属性(比如sigBytes:16, words: [-44073646, -1300128421, 1939444916, 881316061]
)的对象。它似乎是随机产生的。
从一个网页上,它告诉我JS有两种加密密码的方法 (reference link):
- a.
crypto.createCipher(algorithm, password)
- b.
crypto.createCipheriv(algorithm, key, iv)
我在JavaScript中看到的应该是选项a。但是,只有选项b与python中的AES.new()等价。
问题是:
如何在不更改JavaScript代码的情况下用Python还原此密码?
如果我在Python中需要IV,如何从JavaScript中使用的密码获取它?
您必须实现OpenSSL的^{} ,因为CryptoJS使用这个方法从提供的密码派生密钥和IV,但是pyCrypto只支持key+IV类型的加密。CryptoJS还生成一个随机盐,该盐也必须发送到服务器。如果密文对象被转换为字符串,那么它将自动使用包含随机salt的OpenSSL兼容格式。
可能的输出:
对于AES、PKCS#7填充和CBC模式,CryptoJS默认为256位密钥大小。AES有128位块大小,也就是IV大小。这意味着我们必须从EVPúu BytesToKey请求32+16=48字节。我找到了一个半功能实现here,并进一步扩展了它。
下面是完整的Python(用2.7和3.4测试)代码,它与CryptoJS兼容:
类似的代码可以在我对Java和PHP的回答中找到。
浏览器中不带HTTPS的JavaScript-AES加密是一种简单的混淆,并不能提供任何真正的安全性,因为密钥必须与密文一起传输。
相关问题 更多 >
编程相关推荐