美文网首页菜鸟
python加解密常用几种写法

python加解密常用几种写法

作者: hugoren | 来源:发表于2018-02-05 11:39 被阅读397次

    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加解密常用几种写法

        本文链接:https://www.haomeiwen.com/subject/qwubzxtx.html