AES加密 填充方式

本文深入解析AES加密算法,阐述如何使用16byte数据进行加密过程,包括密钥(key)与初始向量(IV)的作用,以及当数据不是16的倍数时如何运用不同填充模式(PKCS5Padding, PKCS7Padding, PaddingMode.Zeros等)进行数据扩张,确保数据符合AES加密要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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个地方都非常好。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值