cryptography库
https://github.com/hugoren/cryptography
cryptography 库是在pycrypto基础上继续维护开发的一个库
使用
class EnDecrypt:
# 传参,返回都是str
# 加解密需要bytes格式, 中间需要做格式转换
# key = Fernet.generate_key()
def __init__(self):
self.key = b'fadfsafaksjfajsfja989843qffdfsafjasajffaf'
self.f = Fernet(self.key)
def encrypt(self, s):
if not isinstance(s, str):
return "Parameter is not a string format"
encrypt_data = self.f.encrypt(bytes(s, encoding="utf-8"))
return str(encrypt_data, encoding="utf-8")
def decrypt(self, s):
if not isinstance(s, str):
return "Parameter is not a string format"
decrypt_data = self.f.decrypt(bytes(s, encoding="utf-8"))
return str(decrypt_data, encoding="utf-8")
pycrypto库
https://github.com/dlitz/pycrypto
AES的介绍可以参看Wikipedia: 高级加密标准。这种加密方式需要指定Key(密钥)和IV(初始化向量),解密时使用同样的Key和IV进行解密。其次需要padding(填充字符),网上一些代码是用空格或者大括号做padding,解密后再用rstrip/rtrim/replace清掉,但用标准的PKCS会更好。
- 使用256位的AES,Python会根据传入的Key长度自动选择,在PHP5在mcrypt里是MCRYPT_RIJNDAEL_128,Nodejs/PHP7.1是aes-256-cbc。
- 使用AES的CBC模式,因为ECB模式用不到IV。
- 使用PKCS的方式来padding,因为NodeJS的库在auto_padding的状态下使用的也是PKCS。Key用AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA(32个,256位),IV用AAAAAAAAAAAAAAAA(16个,128位)。
- Python使用pycrypto(pip install pycrypto),NodeJS使用crypto(npm install crypto),PHP需要mcrypt模块。
使用
from Crypto.Cipher import AES
def _pad(s): return s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)
def _cipher():
key = 'afddsafafafdafsa'
iv = 'afddsafafafdafsa'
return AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
def encrypt_token(data):
"""
:param data:
:return: bytes
"""
return _cipher().encrypt(_pad(data))
def decrypt_token(data):
"""
:param data: bytes
:return: str
"""
r = _cipher().decrypt(data)
# 如果不转str, 将会用padding填充,不太直观
return str(r, encoding="utf-8")
d = encrypt_token("hugo")
print(decrypt_token(d))from Crypto.Cipher import AES
def _pad(s): return s + (AES.block_size - len(s) % AES.block_size) * chr(AES.block_size - len(s) % AES.block_size)
def _cipher():
key = 'afddsafafafdafsa'
iv = 'afddsafafafdafsa'
return AES.new(key=key, mode=AES.MODE_CBC, IV=iv)
def encrypt_token(data):
"""
:param data:
:return: bytes
"""
return _cipher().encrypt(_pad(data))
def decrypt_token(data):
"""
:param data: bytes
:return: str
"""
r = _cipher().decrypt(data)
# 如果不转str, 将会用padding填充,不太直观
return str(r, encoding="utf-8")
d = encrypt_token("hugo")
print(decrypt_token(d))
参考:
http://dmyz.org/archives/673http://dmyz.org/archives/673
https://github.com/hugoren/cryptography