AES就是对16byte(128bit)数据进行加密的过程。说白了就是把128位通过一系列的变化变成另一个128数据。
这里主要用到2个关键的东西。
密钥(key)
----这个是绝对不能省的。key要先扩张,然后进行10次的行列变化,与数据进行抑或操作。最终才能得到加密后的数据。另一个,就是
初始向量(IV)
。
u8 data[16]={ 0x00,0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,0x0c, 0x0d, 0x0e, 0x0f};
u8IV[16]={ 0x30, 0x31, 0x32, 0x33,
0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x61, 0x62,
0xd63, 0x64, 0x65,0x66};
只要把
for(i=0;i<16;i++)
{
data[i]=data[i]^IV[i];
}
然后再把data作为新的数据加密就OK了。
当然你也可以不用他。
那么如果数据不是16的倍数改怎么办呢。这里我们就用到的数据扩张
AES支持支持几种填充:NoPadding,PKCS5Padding,ISO10126Padding,PaddingMode.Zeros,PaddingMode.PKCS7;
PKCS5Padding和PKCS7Padding是一样的。
详细大家可以参考http://www.cnblogs.com/midea0978/articles/1437257.html
PKCS #7 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。
下面的示例演示这些模式的工作原理。假定块长度为 8,数据长度为 9,则填充用八位字节数等于 7,数据等于 FF FF FF FF FF FF FF FF FF:
比如数据{1,2,3,4,5,6,7,8,9,10}
少了6个
那么就填充6个6(注意是0x06,而不是字符6,字符6实际上是0x36)
{1,2,3,4,5,6,7,8,9,10,6,6,6,6,6,6}
注意一定要是16个数据(1个数据是8位,这样就是128位)这样才能进行AES加密。
PaddingMode.Zeros
这个填充方式,个人比较喜欢。就是在后面补充0.
无论缺多少就补多少个0。
再提醒一下就是如果刚满16个,那就要在补充称16个字节。一定要比原先的多。(每种补充都要满足这样。这里非常容易被忽略).
也就是说如果{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}
PaddingMode.Zeros模式
就要补充称{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
PKCS7Padding模式就要{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16}.这样再代入加密算法才是最正直的AES。
http://www.oschina.net/code/snippet_242957_9931
这是C#写的。大家可以参考下。
C++的程序
https://hi.baidu.com/mallor/item/89dad214d1f1fe0dd1d66d33
这2个地方都非常好。
其实AES就是对16byte(128bit)数据进行加密的过程。说白了就是把128位通过一系列的变化变成另一个128数据。这里主要用到2个关键的东西。密钥(key)----这个是绝对不能省的。key要先扩张,然后进行10次的行列变化,与数据进行抑或操作。最终才能得到加密后的数据。另一个,就是初始向量(IV)。u8 data[16]={ 0x00,0x01, 0x02, 0x03, 0x04, ...
本小结的密码学术语如
填充
,模式,等等,均以
AES
为例进行说明。举一反三,其他算法涉及的相同术语,大致也就理解是怎么回事了,,,吧。
(1)
AES
https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.197.pdf
AES
标准是神马鬼东西,USA的PDF写的非常详尽,在此个人用 ‘小白话术 + Python环境’ 理解一下。
AES
算法,大致上:就是将一段16字节的数据(不妨将这一段数据取个代号叫 input),在另一段16字节(或24字节,或32字节)数据的辅
AES
加解密
AES加密
方式
的全称是Advanced Encryption Standard,这里的Advanced当然是相对于DES来说的。
AES加密
根据其使用的密钥长度又细分成
AES
-128、
AES
-192和
AES
-256这三种
AES加密
方式
,其中
AES
-128对应128bit密钥长度,
AES
-192对应192bit,
AES
-256对应256bit,从道理上说密钥长度越长,机密的安全等级就越高,但是密钥越长加解密对硬件的性能消耗就越厉害。
本文以
AES
-256为例来讲解
AES加密
方式
为什么需要
填充
?
RSA和
AES
虽然属于两种截然不同的加密类型,但它们都属于块密码的应用范畴。
1.
AES
的块大小是固定的16字节,RSA的块大小根据密钥长度和
填充
方式
而定。由于
AES
每次只能处理固定长度的数据(即一个块大小),当数据大小不是块大小的整数倍时,就需要对原始数据进行
填充
,因此
填充
对
AES
来说是技术原理上的需求。因为无法保证数据一定是对齐的。
2.RSA则不
# 将密钥和明文转换为字节类型
key_bytes = bytes(key, encoding='utf-8')
text_bytes = bytes(text, encoding='utf-8')
# 使用PKCS7
填充
方式
,将明文补齐为
AES
块大小的整数倍
pad = 16 - len(text_bytes) % 16
text_bytes += bytes([pad] * pad)
# 创建
AES加密
器对象
cipher =
AES
.new(key_bytes,
AES
.MODE_ECB)
ciphertext_bytes = cipher.encrypt(text_bytes)
# 将密文转换为Base64编码的字符串
ciphertext_str = base64.b64encode(ciphertext_bytes).decode('utf-8')
return ciphertext_str
key = '1234567890123456'
text = 'hello world'
ciphertext =
aes
_encrypt(key, text)
print(ciphertext)
输出结果为:
JvLsJ3q3LcJw+JvzJvLsJw==
注意:这里使用的是ECB模式,不够安全,实际应用中应该使用更安全的模式,如CBC、CFB、OFB等。另外,密钥长度应该为16、24或32字节,不足时需要进行
填充
。