Chinaunix首页 | 论坛 | 博客
  • 博客访问: 852290
  • 博文数量: 286
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1980
  • 用 户 组: 普通用户
  • 注册时间: 2014-05-04 16:41
文章分类

全部博文(286)

文章存档

2020年(2)

2018年(5)

2017年(95)

2016年(69)

2015年(15)

2014年(100)

我的朋友

分类: 嵌入式

2018-07-02 11:11:03

源地址:http://blog.sina.com.cn/s/blog_60cf051301015orf.html


其实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

我也再说一下PKCS7 就是数据少几个就填充几个。

比如数据{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。

祝大家好运

这是C#写的。大家可以参考下。

C++的程序 

这2个地方都非常好。

总之遇到困难,觉得不能退缩。要一步一步往前走,相信前途一定会是光明的。

我就是这样从一点也不知道然后在把C,和C#的加密解密方法给统一对应起来。C#都是集成的,引用非常简单。C里面就必须彻底搞清楚,才能用C加密的东西在C#下可以正常解密!!!

阅读(7900) | 评论(0) | 转发(0) |
0

上一篇:[BLE]低功耗蓝牙之GAP、GATT

下一篇:没有了

给主人留下些什么吧!~~