python加解密常用几种写法

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

你可能感兴趣的:(python加解密常用几种写法)