18910140161

如何在Python中解密来自JavaScript CryptoJS.AES.encrypt的密码

顺晟科技

2021-06-16 10:58:38

500

我有一个密码,可以通过Java脚本语言加密

var password='sample '

定义变量密码='示例_密码'

CryptoJS .AES.encrypt(密码、密码短语)

然后我尝试解密密码来自计算机编程语言中的JavaScript:

来自加密。密码导入俄歇电子能谱

导入base64

PADDING='\0 '

pad _ it=lambda s 3360s(16-len(s))*padding

密钥='示例_密码'

iv='11.0.0.101' # -这是我的问题,怎么才能让这个输入阀交互式视讯自变量(Independent Variable)恢复密码,这里应该放什么?

key=pad_it(key) # -应该给键和输入阀交互式视讯自变量(Independent Variable)加填充吗?

iv=pad_it(iv) ##

source='sample '

生成器=AES.new(密钥,AES .模式_CFB,四)

crypt=发电机。加密(pad _ it(源))

cryptedStr=base64。b64编码(crypt)

打印加密字符串

生成器=AES.new(密钥,AES .模式_CBC,iv)

恢复=发电机。解密(加密)

print recovery.rstrip(PADDING)

我从浏览器控制台检查了JS,它在CryptoJS中显示了四. AES.encrypt(密码,密码)是一个具有一些属性的对象(如信号字节:16,单词:[ 44073646,-1300128421,1939444916,881316061]).它似乎随机生成。

从一个网页,它告诉我射流研究…有两种加密密码的方法

(参考链接):

a.crypto.createCipher(算法,密码)

b.crypto.createCipheriv(算法,密钥,iv)

我在Java脚本语言中看到的应该是选项a.但是,只有选项b相当于大蟒中的AES.new().

问题是:

如何在不更改Java脚本语言代码的情况下在计算机编程语言中恢复此密码?

如果我需要计算机编程语言中的四、我如何从Java脚本语言中使用的密码中获取它?

更佳答案

您必须实现心脏出血的EVP_BytesToKey,因为这是CryptoJS用来从提供的密码派生密钥和静脉的的内容,但加密工具仅支持密钥静脉的类型加密密码还生成一个随机盐,也必须发送到服务器。如果将密文对象转换为字符串,则它会自动使用包含随机盐的心脏出血兼容格式。

定义变量数据='测试用的一些半长文本;

var password='某些密码;

var ctObj=CryptoJS .AES.encrypt(数据,密码);

var CTstr=Ctobj。ToString();

out.innerHTML=ctStr

脚本src=' https://cdn。生饭桶。com/crypto store/crypto-js/3。1 .2/构建/卷起/AES。js '/脚本

div id='out'/div

可能的输出:

u2fsdgvkx 1 ath 716 dgsfpgjzmvhr 7 pzyfuzer 25u 0 d7z 5 lw 04 ij LMvpxjmpz

对于AES,PKCS#7填充和加拿大广播公司模式,CryptoJS默认为256位密钥大小。俄歇电子能谱具有128位块大小,也是静脉的大小。这意味着我们必须从EVP_BytesToKey请求32 16=48字节。我找到了一个半功能的实现这里并进一步扩展了它。

这是完整的Python(使用2.7和3.4测试)代码,它与CryptoJS兼容:

从加密导入随机

来自加密。密码导入俄歇电子能谱

导入base64

从摘要算法导入讯息摘要5

块大小=16

def pad(数据):

长度=块大小-(长度(数据)%块大小)

返回数据(chr(长度)*长度)。编码()

def unpad(数据):

返回数据[:-(data[-1]if type(data[-1])==int else order(data[-1])]

def bytes_to_key(data,salt,output=48):

#从https://gist.github.com/gsakkis/4546068延伸

assert len(salt)==8,len(salt)

数据=盐

key=md5(数据)。摘要()

final_key=key

而len(final_key)输出:

key=md5(密钥数据)。摘要()

final_key=key

返回final_key[:output]

def加密(消息,密码):

salt=Random.new().阅读(8)

key_iv=bytes_to_key(密码,盐,32 ^ 16)

key=key_iv[:32]

iv=key_iv[32:]

aes=aes.new(密钥,AES .模式_CBC,iv)

返回base64。b64编码(b ' salated _ _ '盐AES。加密(pad(消息)))

极好的解密(加密密码):

encrypted=base64.b64decode(加密)

断言加密[0:8]==b ' salad _ _ '

盐=加密[8:16]

key_iv=bytes_to_key(密码,盐,32 ^ 16)

key=key_iv[:32]

iv=key_iv[32:]

aes=aes.new(密钥,AES .模式_CBC,iv)

返回未封装(AES。解密(加密[16:])

密码='一些密码。编码()

CT _ b64=' u2fsdgvkx 1 aths 716 dgsfpgjzmvhr 7 pzyfuzer 25u 0 d7z 5 lw 04 ij LMvpxjmpz '

pt=解密(ct_b64,密码)

打印(' pt ',pt)

打印(' pt ',解密(加密(pt,密码),密码))

类似的代码可以在我的Java和PHP答案里找到。

没有HTTPS的浏览器中的JavaScript AES加密是一种简单的混淆,不能提供任何真正的安全性,因为密钥必须与密文一起传输。

相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航