今天在官网下载了一个Kali虚拟机的压缩包, 解压缩后直接在VM中打开,点了好多次打开发现都打不开,查了一下说是没有关闭共享虚拟机,于是操作了一番: 编辑→项→共享虚拟机
顺晟科技
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加密是一种简单的混淆,不能提供任何真正的安全性,因为密钥必须与密文一起传输。
28
2021-08
16
2021-06
16
2021-06
16
2021-06
16
2021-06
16
2021-06