AES算法
这个 AES 加密的主要坑就在于这些条件, 首先 aes 加密有一下几个参数
秘钥:加密的时候用秘钥,解密的时候需要同样的秘钥才能解出来
明文:需要加密的参数
模式:aes 加密常用的有 ECB 和 CBC 模式(我只用了这两个模式,还有其他模式)
iv 偏移量:这个参数在 ECB 模式下不需要,在 CBC 模式下需要
这几个参数的条件:
秘钥:必须是16位字节或者24位字节或者32位字节(因为python3的字符串是unicode编码,需要 encode才可以转换成字节型数据)
明文:字节长度需要是16位的倍数
下面我用python3简单的方法实现:
from Crypto.Cipher import AES
import base64
password = '1234567890123456' #秘钥
text = '1234567890123456' #需要加密的内容
model = AES.MODE_ECB #定义模式
aes = AES.new(password,model) #创建一个aes对象
en_text = aes.encrypt(text) #加密明文
print(en_text)
python3的字节码和字符码
在python3中,字节码和字符码发生了区分,即字节码是可以直接写入的二进制的内容,而字符码则是进过编码后写入磁盘,两者有很大的区别。
比如:
st1=b’12345678’
st2=“12345678”
其中,st1是字节码,st2是字符码,就是字符串,那么,计算如何保存他们呢,对于字节码,直接写入,也就是写入1的ascii码,然后写入2的ascii码,依次类推,每个字节都是8为,st1占据8个字节的长度。
而st2是字符串,计算在保存字符串的时候,首先是对其编码,而Python3默认的编码方式是Unicode编码方式utf-8,而这种编码方式正好和ascii编码方式重合,所以二者的保存方式一样,但如果用其他编码方式比如utf-16,或者gbk,则二者就不一样了。
python3 bytes与字符串互转
1、字符串转bytes
string to bytes
eg:
'0123456789ABCDEF0123456789ABCDEF'
b'0123456789ABCDEF0123456789ABCDEF'
'''
def stringTobytes(str):
return bytes(str,encoding='utf8')
2、bytes转字符串
bytes to string
eg:
b'0123456789ABCDEF0123456789ABCDEF'
'0123456789ABCDEF0123456789ABCDEF'
'''
def bytesToString(bs):
return bytes.decode(bs,encoding='utf8')
如何查看bytes的字节内容
st1=b'1234567890'
print(st1)
结果是:
b'1234567890'
print(st1.hex())
结果是:
31323334353637383930
如何选择AES算法的第一个参数
加密:在使用AES算法时,需要首先生成一个密钥,128位,192位,252位,很多人的想法是生成随机数字符串,比如"1462587569853625",让这个串作为密钥,对吗?计算机编码字符用UTF-8,其实前面就是Ascii,你把二进制的编码打开一看就知道错了,正确的方法是使用随机字节,在python3.9中,新添加了函数randbytes。一一感谢狗曰的强大的python。