大佬教程收集整理的这篇文章主要介绍了执行 AES CBC 128 无法获得与在线工具相同的结果,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用从第三方服务器获取加密消息。
我正在使用 ENter link description here 中的工具
测试其正确性
The Encrypted Text =
"WiI9g5qo+ztSlqHMbpIEzHZ2dBkQ2gprGJZyWtwcMTWPoxzLsMmuje9xDeFK4XymfBdZGh2naMwP3LfbPy/06mazRSS66WRM1oxhz56L2UzTKyCWCl+ld7RlN7aPwfEw2j9VN50YCkMLfQRfIAXTspKQb6o5QQw8ey0cINdtWSHClz/uXiCFqiYJfItxY1rAZkE1Qj0b0izGQFJ9/44Zfw0dJtzCXYgXTPZftPeGTdoX/HnZJpUvfqmliAdgAyoXi5BxL5bgSs30yaB4bRxJJj7DKpVbAgZmx0ecjmiGDh7t78A16pZ2kz+OIUkuc/hxvUaVehsH1pVdqycpuJfbgy+to0AY/+BBd38GGvv8YdTCa99bSHRGaZuUglLKN/2J0pZmfrIARIDgrV2yDK+IN4hTVKf1jprtfvhvkG+eRyDfolL9rg8+ZEtdYUdZgDdF3ftmHKTzgxI6leMWX7WFRTHjxVYFVk0yWA9xXk6s/WcG6IFeGYPVF94IcLeC2eAjaMasusF+C6qyFWi6nuyFK2Gr1utvG6kg84Hu0KKYg42MHXIR1AtQW3MWaqosb54y0GutQtnD47l84/PdJvUhuE/a7uyfCjjtyh2sRRLX3WDosyRZsqjLea9EIX6oNmQMZd1WRxM86Ggt6bVOc9KY5Z7HLpLyb0lLF4sdyzfBNJB7u7vqkBzsEss1Yq+sXD0N"
Key = "1234567812345678"
结果 AES 解密输出 (Base64) 后: 和解码纯文本后 结果是:
{"upPacketSN":-1,"updataSN":-1,"topic":"v1/up/ad","timestamp":1619672797621,"tenantID":"2000034792","servicEID":"","protocol":"lwm2m","productID":"15044315","payload":{"APPDAta":"MTIzNDU2NzgsNTM0OCwwNywwOCwyNTusmtc5LDEyOCwwMDAwLDQyNTksMSw2LDAsMCwwLDAsMCwwLDI0LDMuNzAsMy43MCwxLDEsNiwsMCwwLDAsMCwwLDAsMCwwLDAsMCwtMjU1LC0yNTUsLTI1NSwxLjY5LDEuOCw0OTk4LDYwLDE0NDAsNjA="},"messageType":"dataReport","deviCEType":"","devicEID":"523ede8bb7e34dd4a1bd74028d63749e","assoCassetID":"","imsI":"undefined","IMEI":"864162041961023"}
其中一件事是 IV 必须为 NulL 才能得到正确答案。
因此,如果我使用 pycryptodome 库在 Python AES CBC 中实现,如下所示:
class AES_CBC:
def add_to_16(self,value):
while len(value) % 16 != 0:
value += '\0'
return str.encode(value) # 返回bytes
#解密方法
def decrypt_oralce(self,key,text):
# 初始化加密器
# 偏移量 16个0
iv = "0000000000000000"
aes = AEs.new(self.add_to_16(key),AEs.MODE_CBC,self.add_to_16(iv))
#优先逆向解密base64成bytes
base64_decrypted = base64.decodebytes(text.encode(enCoding='utf-8'))
#
decrypted_text = str(aes.decrypt(base64_decrypted),enCoding='utf-8') # 执行解密密并转码返回str
unpad = lambda s : s[0:-ord(s[-1])]
#padding = '\0'
#print decrypted_text.rStrip(padding) #zeropadding只见诶去掉结尾\0
# print(unpad(decrypted_text))
return unpad(decrypted_text)
if __name__ == '__main__':
aes = AES_CBC()
#加密
key = "1234567812345678"
enc_msg = "WiI9g5qo+ztSlqHMbpIEzHZ2dBkQ2gprGJZyWtwcMTWPoxzLsMmuje9xDeFK4XymfBdZGh2naMwP3LfbPy/06mazRSS66WRM1oxhz56L2UzTKyCWCl+ld7RlN7aPwfEw2j9VN50YCkMLfQRfIAXTspKQb6o5QQw8ey0cINdtWSHClz/uXiCFqiYJfItxY1rAZkE1Qj0b0izGQFJ9/44Zfw0dJtzCXYgXTPZftPeGTdoX/HnZJpUvfqmliAdgAyoXi5BxL5bgSs30yaB4bRxJJj7DKpVbAgZmx0ecjmiGDh7t78A16pZ2kz+OIUkuc/hxvUaVehsH1pVdqycpuJfbgy+to0AY/+BBd38GGvv8YdTCa99bSHRGaZuUglLKN/2J0pZmfrIARIDgrV2yDK+IN4hTVKf1jprtfvhvkG+eRyDfolL9rg8+ZEtdYUdZgDdF3ftmHKTzgxI6leMWX7WFRTHjxVYFVk0yWA9xXk6s/WcG6IFeGYPVF94IcLeC2eAjaMasusF+C6qyFWi6nuyFK2Gr1utvG6kg84Hu0KKYg42MHXIR1AtQW3MWaqosb54y0GutQtnD47l84/PdJvUhuE/a7uyfCjjtyh2sRRLX3WDosyRZsqjLea9EIX6oNmQMZd1WRxM86Ggt6bVOc9KY5Z7HLpLyb0lLF4sdyzfBNJB7u7vqkBzsEss1Yq+sXD0N"
#解密
dec_text = aes.decrypt_oralce(key,enc_msg)
print(key)
print(dec_text)
编辑: 我使用相同的 IV 16'0' 得到了不同的结果 和 来自网络的结果是
{"upPacketSN":-1,"timestamp":1619687373640,"payload":{"APPDAta":"MTIzNDU2NzgsNTM0OCwwNywwOCwyNTusmtc5LDEyOCwwMDAwLDQ1MDQsMSw2LDAsMCwwLDAsMCwwLDI0LDMuNzAsMy43MCwxLDEsNiwsMCwwLDAsMCwwLDAsMCwwLDAsMCwtMjU1LC0yNTUsLTI1NSwxLjY5LDEuOCw0OTk4LDYwLDE0NDAsNjA="},"IMEI":"864162041961023"}
而我的代码的结果是:
KE@`QS[UDc~
1,"IMEI":"864162041961023"}
谁能帮我看错了哪一部分?
谢谢
当前代码不使用“null-IV”,这意味着数组填充了设置为零的字节。相反,它使用一个由 '0'
字符填充的数组,其值为 0x30
十六进制或 48 十进制;显然不是零。
要创建一个 null-IV,请查看 here 如何在 Python 中的字节数组中指示字节值。在 add_to_16
循环中使用了相同的技巧,其中 \0
转义符用于指示零字节。
请注意,填充键或 IV 是非常糟糕的做法。那些需要由随机字节组成。请注意,工作加密代码与安全加密代码不同,这可能是您的目标。
以上是大佬教程为你收集整理的执行 AES CBC 128 无法获得与在线工具相同的结果全部内容,希望文章能够帮你解决执行 AES CBC 128 无法获得与在线工具相同的结果所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。