最近项目里用到加密解密,本来有过一点儿这方面的经验,然而这次并没有非常顺利,反而还浪费了好几天的时间。于是趁热打铁,记录总结下这方面的知识。当然,都只是使用,具体的算法没去了解。
不管什么语言的加密算法网上有很多了,项目里采用的是后端Python
加密,客户端Android(Java)
解密。Python
中有加密解密的库Crypto
,java
中有封装好的Cipher
,具体使用如下:
Python加密
Python
中有加密解密的库Crypto
,可以直接导入AES
,先安装Crypto
模块:
pip install pycryptodome
注意:网上大多数都是使用pip install pycryto
这个模块的,但是这个库已经停止维护了,而且安装过程还是报error: Microsoft Visual C++ 14.0 is required.
的错误。如果没错的话,应该也可以用吧,项目紧,没仔细研究过。
然后导入AES
from Crypto.Cipher import AES
最终的代码:
#! -*- coding:utf-8 -*-
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
PADDING = '\0'
# 加密的内容必须是16的倍数,不够就用\0补全
def pad_text(text):
return text + (16 - len(text) % 16) * PADDING
# 加密
def encrypt(text, key, iv):
text = pad_text(text)
cryptor = AES.new(key, AES.MODE_CBC, iv)
encrypted_text = b2a_hex(cryptor.encrypt(bytes(text, 'utf-8')))
# 因为AES加密时候得到的字符串不一定是ascii字符集的,保存时候可能存在问题,所以转化为16进制字符串
return encrypted_text
# 解密
def decrypt(text, key, iv):
cryptor = AES.new(key, AES.MODE_CBC, iv)
# 将16进制字符串转化为二进制字符串再进行解密
decrypted_text = cryptor.decrypt(a2b_hex(text))
return decrypted_text
if __name__ == '__main__':
result = encrypt('qwerasdfzxcv1234', b'1234567890123456', b'1234567890123456')
print(result)