最新消息:这里是最新消息

对称加密和非对称加密

python benty 322浏览 0评论

先上一个AES加密的备用,之后再把对称非对称好好的总结一下.

 

from Crypto.Cipher import AES
import base64,time
from Crypto import Random
# key = Random.new().read(32)#返回32位bytes
# print(key)
”’学习python crypto加密模式”’
#先定义函数补足字符串长度为16的倍数
def add16(s):
    ”’字符串不是16的倍数就自动补0”’
    while len(s.encode())%16 !=0:
        s+=’\0′
    #将结果以bytes类型返回
    return s.encode(‘utf8’)
block_size = AES.block_size
def pad(plain_text):
    “””解密时候需要用到此函数
    func to pad cleartext to be multiples of 8-byte blocks.
    If you want to encrypt a text message that is not multiples of 8-byte blocks,
    the text message must be padded with additional bytes to make the text message to be multiples of 8-byte blocks.
    “””
    number_of_bytes_to_pad = block_size – len(plain_text) % block_size
    ascii_string = chr(number_of_bytes_to_pad)
    padding_str = number_of_bytes_to_pad * ascii_string
    padded_plain_text =  plain_text + padding_str
    return padded_plain_text
key = ‘123456789trinity’ #密钥,可以16,24,32位
# key = ‘facd81g656fcd8p7a7lkh6dfa81gf4ik’ #密钥,可以16,24,32位
iv=’123456789trinity’ #偏移量16位是aes-128 24是192 32是256
# iv=”\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000″
t=time.time()
aes=AES.new(key.encode(“utf8”), AES.MODE_CBC,iv.encode(“utf8”))#初始化加密器
aes2=AES.new(key.encode(“utf8”), AES.MODE_CBC,iv.encode(“utf8”))#初始化解密器
# text=text#将要操作的文本自动对齐
text=”我” #测试文本,注意不支持中文!!!!!字符串钥匙16的倍数,不是就要填充
print(text)
print(text.encode(‘utf8’))
print(“加密后:”)
res=aes.encrypt(add16(text))#字符不够16后面加\0
res=str(base64.encodebytes(res),encoding=’utf-8′)#将加密的二进制数据转换为base64然后转为字符串
print(res)
# jiemi=”kl6mFwzxu6wKOMKFKxHsc14v7sggGfhEtV70NjLpg4lAl+927Bso/5tJyi0a7X/1″
jiemi=res
print(“解密后:”)
jstr=aes2.decrypt(base64.decodebytes(jiemi.encode()))
print(str(jstr,encoding=’utf8′))

上面注意中文加密解密需要len(s.encode())否则中文就不能解密,这是一个坑

加密要先初始化一个aes对象

aes=AES.knew(key.encode(),AES.MODE_CBC,iv.encode())

加密的原理就是将明文以16的倍数补齐,不足16补\0,然后用调用aes.encrypt(明文补齐16)来生成一个字节串,此时不能直接转换字符串会报错,需要使用base64.encodebytes(加密字节串)来生成可读的编码,然后在str(可读编码)就是一个正常加密过的一个密文了.

解密的原理相反,先将密文字符串编码为bytes,然后用base64.decodebytes(密文.encode())进行解码为不可读的字节串,然后在调用aes.decrypt(不可读字节串)进行解密为一个byte,然后用str函数转换为字符串就是明文了.

 

转载请注明:稻香的博客 » 对称加密和非对称加密

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址