加密算法简述 以及 pycryptodome模块的使用

加密算法简述[python]

        • 前言:
        • 加密算法的分类:
          • DES加密:
          • AES加密:[Advanced EncryptionStandard]
            • CBC模式:
          • RSA加密:
        • 模块使用
            • base64模块:
            • pycrypto模块:
            • Python-maketrans()方法
        • 参考文献:

——引子:本文主要针对python使用密码学算法原理的简单表述,主要说明了几种加密算法的主要原理和特点;python相关库的安装、说明和使用。可以解决如下问题:1.from Crypto.Cipher import DES要安装pycrypto库。2.pycrypto安装不上怎么办。3.pycryptodome和pycryptodomex有什么区别

前言:

  • 版本:python3.7, pycryptodome3.9

  • 安装: pip install pycryptodome

  • 涉及模块说明: pycrypto、pycryptodome、pycryptodomex
    pycrypto: 原始密码学模块,无人维护(已废弃)
    pycryptodome: 强制替代pycrypto模块,用法相同,其安装在Crypto包下

    All modules are installed under the Crypto package.
    Check the pycryptodomex project for the equivalent library that works under the Cryptodome package.

    pycryptodomex: 同pycryptodome功能,但与pycrypto模块可以共存,都安装在Cryptodome包下

    All modules are installed under the Cryptodome package.
    Check the pycryptodome project for the equivalent library that works under the Crypto package.
    In this case, all modules are installed under the Cryptodome package. PyCrypto and PyCryptodome can coexist.

加密算法的分类:

  • 对称加密算法 具有更高的加密速度,但双方都需要事先知道秘钥,秘钥在传输过程中可能会被窃取,因此安全性没有非对称加密高。 如:‘DES’, ‘AES’, ‘3DES’

  • 非对称加密算法 加密速度低于对称加密算法,但安全性更高。 如:RSA, DSA, ECC

  • 利用字典的格式转换加密。 MAKETRANS()

DES加密:
  • 即数据加密标准,是一种使用秘钥加密的块算法,入口参数有三个:key, Data, Mode
    key为7个字节共56位,是DES算法的工作秘钥;
    Data为DES的工作方式,有两种:加密和解密
  • ‘3DES’:
    是DES向AES过渡的加密算法,使用两个秘钥,执行三次DES算法,
    加密的过程是加密-解密-加密
    解密的过程是解密-加密-解密
#DES加密示例:

from Crypto.Cipher import DES
key = b'abcdefgh' # 密钥 8位或16位,必须为bytes

def pad(text):
    """加密函数,如果text不是8的倍数【加密文本text必须为8的倍数!】,那就补足为8的倍数
    """
    while len(text) % 8 != 0:
        text += ' '
    return text

des = DES.new(key, DES.MODE_ECB) # 创建一个DES实例
text = 'Python rocks!'
padded_text = pad(text)
encrypted_text = des.encrypt(padded_text.encode('utf-8')) # 加密
print(encrypted_text)
#rstrip(' ')返回从字符串末尾删除所有字符串的字符串(默认空白字符)的副本
plain_text = des.decrypt(encrypted_text).decode().rstrip(' ') # 解密
print(plain_text)
AES加密:[Advanced EncryptionStandard]
  • 高级加密标准,这个标准用来替代原先的DES, AES的区块长度固定为128 比特,密钥key长度必须是16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.
  • 大致步骤:
    1、密钥扩展(KeyExpansion),
    2、初始轮(Initial Round),
    3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,
    4、最终轮(Final Round),最终轮没有MixColumns。
#示例:ECB模式, 比CBC少一个key, 其他用法等同
from Cryptodome.Cipher import AES
from binascii import b2a_hex, a2b_hex

key = 'abcdefgh'   # 秘钥,此处需要将字符串转为字节
def pad(text):   # 加密内容需要长达16位字符,所以进行空格拼接
    while len(text) % 16 != 0:
        text += ' '
    return text

aes = AES.new(key.encode(), AES.MODE_ECB)  # 进行加密算法,模式ECB模式

text = 'hello'   # 加密内容,此处需要将字符串转为字节

encrypted_text = aes.encrypt(pad(text).encode())  # 进行内容拼接16位字符后传入加密类中,结果为字节类型
encrypted_text_hex = b2a_hex(encrypted_text)
print(encrypted_text_hex)
#用aes对象进行解密,将字节类型转为str类型,错误编码忽略不计
de = str(aes.decrypt(a2b_hex(encrypted_text_hex)), encoding='utf-8',errors="ignore")
print(de[:len(text)])   # 获取str从0开始到文本内容的字符串长度。
CBC模式:
  • 描述:
    AES只是个基本算法,实现AES有若干模式。其中的CBC模式因为其安全性而被TLS(就是https的加密标准)和IPSec(win采用的)作为技术标准。
    简单地说,CBC使用密码和salt(起扰乱作用)按固定算法(md5)产生key和iv。然后用key和iv(初始向量,加密第一块明文)加密(明文)和解密(密文)。
#示例:
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

def pad(text):
    """加密文本text必须为16的倍数!
    """
    while len(text) % 16 != 0:
        text += '\0'.encode('utf-8')   # \0 可以被decode()自动清除,并且不会影响本来的字符0
    return text

def encrypt(text):
    cryptor = AES.new(key.encode('utf-8')), AES.MODE_CBC, key.encode('utf-8'))   # 此变量是一次性的(第二次调用值会变)不能作为常量通用
    ciphertext = cryptor.encrypt(pad(text.encode('utf-8')))   # encode()转换是因为十六进制用的是字节码
    return b2a_hex(ciphertext).decode('utf-8')   # 因为AES加密时候得到的字符串不一定是ascii字符集的,所以使用十六进制转换才能print来储存

def decrypt(text):
    cryptor = AES.new(key.encode('utf-8'), AES.MODE_CBC, key.encode('utf-8'))
    plain_text = cryptor.decrypt(a2b_hex(text.encode('utf-8')))
    return plain_text.decode('utf-8').rstrip('\0')   # 去除凑数补全的\0

================================================================================

RSA加密:
  • 公钥加密算法,一种非对称密码算法,公钥加密,私钥解密
  • 共有三个参数:rsa_n, rsa_e 用于生成公钥,message:需要加密的消息
#示例:
import rsa
from binascii import b2a_hex, a2b_hex
class rsacrypt():
    def __init__(self, pubkey, prikey):
        self.pubkey = pubkey
        self.prikey = prikey
    def encrypt(self, text):
        self.ciphertext = rsa.encrypt(text.encode(), self.pubkey)
        # 因为rsa加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
        # 所以这里统一把加密后的字符串转化为16进制字符串
        return b2a_hex(self.ciphertext)
    def decrypt(self, text):
        decrypt_text = rsa.decrypt(a2b_hex(text), prikey)
        return decrypt_text
if __name__ == '__main__':
    pubkey, prikey = rsa.newkeys(256)
    rs_obj = rsacrypt(pubkey,prikey)
    text='hello'
    ency_text = rs_obj.encrypt(text)
    print(ency_text)
    print(rs_obj.decrypt(ency_text))
"""
b'7cb319c67853067abcd16aad25b3a8658e521f83b1e6a6cf0c4c2e9303ad3e14'
b'hello'
"""

模块使用

base64模块:
  • 优点:方法简单
  • 缺点:不保险,别人拿到密文可以解密出明文
  • 编码原理:将3个字节转换成4个字节((3 X 8)=24=(4X6)),先读入3个字节,每读一个字节,左移8位,再右移四次,每次6位,这样就有4个字节了。
  • 解密原理:将4个字节转换成3个字节,先读入4个6位(用或运算),每次左移6位,再右移3次,每次8位,这样就还原了。
#示例:
s1 = base64.encodestring('hello world')   # aGVsbG8gd29ybGQ=
s2 = base64.decodestring(s1)   # hello world
print s1, s2
pycrypto模块:
#示例:
from Crypto.Cipher import AES
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
message = "The answer is no"
ciphertext = obj.encrypt(message)
print(ciphertext)
#'\xd6\x83\x8dd!VT\x92\xaa`A\x05\xe0\x9b\x8b\xf1'
obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
decryptext = obj2.decrypt(ciphertext)
print(decryptext)
#'The answer is no'
Python-maketrans()方法
  • 描述:用于创建字符串映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标
  • 注:两个字符串的长度必须相同,为一一对应的关系
  • 语法:str.maketrans(in_tab, out_tab)
  • 参数:
    in_tab - 字符串中要替换的字符串组成的字符串
    out_tab - 相应的映射字符的字符串
#示例:
from string import maketrans   # 必须调用 maketrans 函数。
intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)
str = "this is string example....wow!!!"
print(str.translate(trantab))

参考文献:

https://www.pycryptodome.org/en/latest/src/installation.html
https://pypi.org/project/pycryptodomex/#description
https://pypi.org/project/pycryptodome/
https://pypi.org/project/pycrypto/
网络

tips:如有疑问,欢迎留言

你可能感兴趣的:(Python,密码学,python,加密解密)