loopyCryptor:简洁的加解密Python对象

Encrypt & Decrypt Most Types of Python Objects

代码仓库: loopyCryptor

加密一切!

loopyCryptor最近进入了0.1.0版本的时代,现在它具有了加密大部分python中对象的能力.它能够使用对称(AES)或非对称(RSA)的方式正常加解密以下类型的对象:

  • None
  • 布尔变量TrueFalse
  • 整数(int),长整数(long int),浮点数(float)
  • 普通的或Unicode编码的字符串(str)
  • 仅包含可加密对象的元组(tuple),列表(list),集合(set)和字典(dic)
  • 在模块顶层定义的函数(function),以及内置函数(built-in function)
  • 在模块顶层定义的类(class)
  • 当类的__dict__成员或__getstate__()返回值是可加密时,实例化出的类对象

同时,你加密时输入的是什么类型的对象,解密后输出也将会是那个类型.(实际上会得到一个深拷贝的原对象)

实现与依赖

主要依赖于两个轮子:

  • pycryptodome:强大的加密解密工具
  • pickle:强大的对象序列化和反序列化工具

loopyCryptor中:

  • pycryptodome中AES,RSA加解密的C风格的接口wrap了一层,使其符合python的一致风格,并对加解密的各种要求(比如byte boundary)进行了自动调整,使得用户无需考虑底层加解密的各种要求
  • pycryptodome中AES,RSA密钥的生成wrap了一层,使其简洁易用
  • 使用pickle将待加密的python对象序列化,使得用户无需考虑对象的类型

总的来说,我把加解密轮子的一部分改得符合(我认为的)python哲学,使用时无需考虑对象类型或者输入对象的各种要求.

加密分三步:

  1. 引入加密函数
  2. 把对象和密钥丢进加密函数里
  3. 把密文取出来

解密也分三步:

  1. 引入解密函数
  2. 把密文和密钥丢进加密函数里
  3. 把对象取出来

示例

  • RSA
      import loopyCryptor
    
      obj = [123,"HELLO",None,{"How are you?":b"I am fine and you?"}]
    
      # 生成一对密钥
      public_key, private_key = loopyCryptor.generate_RSA_key()
    
      # 加密
      cipher_byte = loopyCryptor.RSA_encrypt(obj,public_key)
    
      # 解密
      decrypt_obj = loopyCryptor.RSA_decrypt(cipher_byte,private_key)
    
      # 输出结果
      print(decrypt_obj)
      # [123, 'HELLO', None, {'How are you?': b'I am fine and you?'}] 
      print(decrypt_obj==obj)
      # True
      print(list(map(type, decrypt_obj)))
      # [<class 'int'>, <class 'str'>, <class 'NoneType'>, <class 'dict'>]
    
  • AES
     import loopyCryptor
    
     obj = [123,"HELLO",None,{"How are you?":b"I am fine and you?"}]
    
     # 生成一个密钥
     AES_key = loopyCryptor.generate_AES_key()
    
     # 加密
     cipher_byte = loopyCryptor.AES_encrypt(obj,AES_key)
    
     # 解密
     decrypt_obj = loopyCryptor.AES_decrypt(cipher_byte,AES_key)
    
     # 输出结果
     print(decrypt_obj)
     # [123, 'HELLO', None, {'How are you?': b'I am fine and you?'}] 
     print(decrypt_obj==obj)
     # True
     print(list(map(type, decrypt_obj)))
     # [<class 'int'>, <class 'str'>, <class 'NoneType'>, <class 'dict'>]
    
  • 也可以使用更简洁的方式来调用
     from loopyCryptor import encrypt, decrypt, generate_AES_key
    
     my_obj = [1,2,3]
       
     # 生成密钥并设置为默认密钥
     key_pair = generate_RSA_key(set_default=True)
    
     # 加密my_obj
     cipher_byte = encrypt(my_obj, method = "RSA")
    
     # 解密回原来的对象
     decrypt_obj = decrypt(cipher_byte, method = "RSA")
    

我主要的我就是三件事情,很惭愧,就做了一点微小的工作,谢谢大家.

本文总字数: 1968