搜索
bottom↓
回复: 77

AES加密解密源码及算法详解资料。

  [复制链接]

出0入4汤圆

发表于 2018-9-24 19:50:45 | 显示全部楼层 |阅读模式
一份非常不错的AES加密解密原理及算法学习的资料。所附源码经本人实测,完全无误。并且可移植性强,可移植到任意平台运行,从而为系统添加AES加密解密的功能。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入76汤圆

发表于 2018-9-24 20:16:52 | 显示全部楼层
不错,感谢分享

出0入0汤圆

发表于 2018-9-24 20:19:00 | 显示全部楼层
谢谢分享,中秋快乐!

出0入0汤圆

发表于 2018-9-24 20:28:55 | 显示全部楼层
谢谢分享,中秋快乐!

出0入0汤圆

发表于 2018-9-24 20:32:46 | 显示全部楼层
收藏了   

出0入0汤圆

发表于 2018-9-24 20:35:02 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2018-9-24 20:35:57 | 显示全部楼层
谢谢分享,中秋快乐!

出0入0汤圆

发表于 2018-9-24 20:51:25 来自手机 | 显示全部楼层
谢谢分享,中秋快乐!

出400入0汤圆

发表于 2018-9-24 20:52:22 | 显示全部楼层
谢谢分享,中秋快乐

出0入0汤圆

发表于 2018-9-24 20:57:22 | 显示全部楼层
下载备用,感谢lz

出0入4汤圆

 楼主| 发表于 2018-9-24 21:15:15 | 显示全部楼层
AES还有一些其它方面需要研究。比如:五种模式。填充方式,还有AES-192,AES-256等等。但有了这个基础,其它应该都不难。

出0入0汤圆

发表于 2018-9-24 21:44:20 | 显示全部楼层
上次用了一个开源的,能用,不过原理还是稀里糊涂

出0入0汤圆

发表于 2018-9-24 22:56:38 | 显示全部楼层
好資料,感謝分享。

出0入0汤圆

发表于 2018-9-24 23:30:53 | 显示全部楼层
本帖最后由 kinsno 于 2018-9-24 23:32 编辑
BS_good200xy 发表于 2018-9-24 21:15
AES还有一些其它方面需要研究。比如:五种模式。填充方式,还有AES-192,AES-256等等。但有了这个基础, ...


楼主,咨询几个问题:
1、你的test.c里,那个密钥为啥要定义为[17]呢,是当时随手一击,还是有指定含义?
2、aes加密,是不是加密后的数据,还是会保留在原数组内,当然也就覆盖了原来的数据了?那么同理,DEAES就是解密后的数据,和AES操作方式一样吗?
3、假如实际中的数据,根本不是16的倍数,并且这种情况才是最普遍的情况,该怎么操作,补全吗?如果是补全,那么补什么数字呢,FF,还是00?



出140入115汤圆

发表于 2018-9-24 23:36:11 | 显示全部楼层
谢谢分享,中秋快乐!

出0入4汤圆

发表于 2018-9-25 02:09:09 | 显示全部楼层
收藏一下

出0入0汤圆

发表于 2018-9-25 07:46:20 来自手机 | 显示全部楼层
多谢分享

出0入0汤圆

发表于 2018-9-25 08:04:54 | 显示全部楼层
打卡留存。。。谢谢分享。

出0入0汤圆

发表于 2018-9-25 08:28:24 | 显示全部楼层
多谢,已收藏

出0入12汤圆

发表于 2018-9-25 08:40:28 | 显示全部楼层
收藏备用,感谢分享。

出0入0汤圆

发表于 2018-9-25 08:49:04 | 显示全部楼层
下载备用,感谢分享

出0入4汤圆

 楼主| 发表于 2018-9-25 08:53:20 | 显示全部楼层
本帖最后由 BS_good200xy 于 2018-9-25 08:57 编辑
kinsno 发表于 2018-9-24 23:30
楼主,咨询几个问题:
1、你的test.c里,那个密钥为啥要定义为[17]呢,是当时随手一击,还是有指定含义? ...


1.因为用到了C语言的库函数strlen(),所以将原本16个字节的密钥后加一个0,构成一个字符串,以便strlen()正确运行。如果不用此方式检查密钥长度,完全可改为[16].
2.传入aes()和deAes()的原始数据会被加解密后的数据所覆盖。当然,你完全可以改成不覆盖的方式。
3.传入的数据必须是16字节的整数倍。如果不是,则必须最后一批数据填充到16字节的整数倍。AES有不同的填充方式。

出0入0汤圆

发表于 2018-9-25 08:55:39 | 显示全部楼层
BS_good200xy 发表于 2018-9-25 08:53
1.因为用到了C语言的库函数strlen(),所以将原本16个字节的密钥后加一个0,构成一个字符串,以便strlen() ...

你答复的第3点,是不是指必须把数组的字节数填到16的倍数,我是指这些我们自行添加的数据,用0xFF还是0x00呢?还是无所谓。。你的习惯做法呢,毕竟非16倍才是实际使用中最常碰到的情况啊。




出0入4汤圆

 楼主| 发表于 2018-9-25 09:04:19 | 显示全部楼层
kinsno 发表于 2018-9-25 08:55
你答复的第3点,是不是指必须把数组的字节数填到16的倍数,我是指这些我们自行添加的数据,用0xFF还是0x0 ...

AES填充方式我也是正在研究,下面是我网上查到的相关描述:

AES加密支持多种填充方式,NoPadding,PKCS5Padding,ISO10126Padding,ZerosPadding,PKCS7Padding。

其中PKCS7Padding 就是数据个数最后少几个就填充多少个数,具体的做法可以:数据的个数先取余16,然后16减去余数。

例如{1,2,3,4,5,6,7,8,9},总共9个数值,取余16后是9,需要补充7个7,则最后数据变为{1,2,3,4,5,6,7,8,9,7,7,7,7,7,7,7}

需要特别注意一种情况:如果数据的个数刚好是16的倍数,那就要在补充16个字节(一定要)。例如{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},填充后的数据是{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}

ZerosPadding就是缺少多少位就补充多少个0,基本流程相同。

出0入0汤圆

发表于 2018-9-25 09:21:11 | 显示全部楼层
BS_good200xy 发表于 2018-9-25 09:04
AES填充方式我也是正在研究,下面是我网上查到的相关描述:

AES加密支持多种填充方式,NoPadding,PKCS5 ...

晕啊,我是咨询您这个代码里的填充方式啊,不足16的部分,应该填充什么东西,这个您应该清楚啊,我仅仅想要知道这个啊。。
PS:我看到你举例中有一个16个数据,还要补充16个,这是为何,您现在提供的这个代码,也要这样操作吗,不足16的补齐16,刚好16的则直接补16吗?

出0入4汤圆

 楼主| 发表于 2018-9-25 09:41:17 | 显示全部楼层
kinsno 发表于 2018-9-25 09:21
晕啊,我是咨询您这个代码里的填充方式啊,不足16的部分,应该填充什么东西,这个您应该清楚啊,我仅仅想 ...

你是想问对以下数组的填充方式吗?
unsigned char DataBuf[16]={0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70};

出0入4汤圆

 楼主| 发表于 2018-9-25 09:48:59 | 显示全部楼层
kinsno 发表于 2018-9-25 09:21
晕啊,我是咨询您这个代码里的填充方式啊,不足16的部分,应该填充什么东西,这个您应该清楚啊,我仅仅想 ...

我提供的源码,主要是帮助对AES算法的理解。要用于实际项目,则还需加入加密模式及填充方式等细节。

出0入0汤圆

发表于 2018-9-25 09:53:52 | 显示全部楼层
感谢分享!收下了

出0入4汤圆

 楼主| 发表于 2018-9-25 10:07:30 | 显示全部楼层
看到有这么多坛友都对AES感兴趣,我再分享一个AES验证工具给大家吧。

高级加密标准(英语:Advanced Encryption Standard,缩写:AES)。
AES计算工具,支持128,192,256长度的秘钥,支持长度大于16字节的AES 加密和解密,还有支持AES-CMAC的计算。
AES算法工具。支持初始向量。 支持AES-cmac。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-9-25 11:17:34 | 显示全部楼层
以后可能会用到,学习一下!

出0入0汤圆

发表于 2018-9-25 12:19:40 | 显示全部楼层
谢谢分享, 收藏了

出0入0汤圆

发表于 2018-9-25 12:37:47 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2018-9-26 07:54:40 | 显示全部楼层

感谢分享!收下学习。

出0入0汤圆

发表于 2018-9-26 08:11:10 | 显示全部楼层
谢谢分享

出50入0汤圆

发表于 2018-9-26 13:05:16 来自手机 | 显示全部楼层
不错,感谢分享

出0入0汤圆

发表于 2018-9-26 15:08:34 | 显示全部楼层
收藏备用,估计会用到

出0入0汤圆

发表于 2018-9-26 17:51:16 | 显示全部楼层
AES加密,标记一下。

出0入0汤圆

发表于 2018-9-26 20:04:37 | 显示全部楼层
谢谢 拿走。。。。

出0入0汤圆

发表于 2018-9-26 21:33:30 | 显示全部楼层
标记一下,谢谢分享

出0入0汤圆

发表于 2018-9-27 09:37:23 | 显示全部楼层
BS_good200xy 发表于 2018-9-25 09:48
我提供的源码,主要是帮助对AES算法的理解。要用于实际项目,则还需加入加密模式及填充方式等细节。 ...

恕我直言,楼主也是好心气。楼上请教就请教嘛,看着还有点不耐烦的样子。我表示有点看不过去了……

PKCS7Padding这个算是AES里面填充的主流了吧。随便网上一搜就有的东西,好像说的楼主欠他一样。醉了……

出0入4汤圆

 楼主| 发表于 2018-9-28 17:21:29 | 显示全部楼层
代码中有一个问题。要将unsigned char w[44]; 改为unsigned long w[44];

出0入0汤圆

发表于 2018-9-28 17:51:01 | 显示全部楼层
感謝分享!節日快樂!

出0入4汤圆

 楼主| 发表于 2018-9-29 08:47:01 | 显示全部楼层
AES(Rijndael算法)
Rijndael算法首先是一个密钥分组加密的算法,通过置换(permutations )和替换(substitutions)迭代加密,进过多轮操作形成密文。AES算是Rijndael算法的一种特殊实现,选的分组为128bit(16字节),密钥可以使用128、192 和 256bit三种。
分组
上面已经说了AES分组为16个字节,下面说说他的排列,其实就是一个4x4的矩阵,不过要注意是竖着排的。
AES原文:a1a2a3a4 a5a6a7a8 a9a10a11a12 a13a14a15a16...
a1    a5    a9    a13
a2    a6    a10  a14
a3    a7    a11  a15
a4    a8    a12  a16
密钥
AES的密钥虽然有三种,但是并不意味着这三种密钥的AES差异很大,相反加密过程其实完全一样,只是种子密钥是128,192,256bit三种而已。密钥在AES与分组数据并没有做非常复杂的变化,其实只是简单的&(与)操作而已。不过又因为AES算法有很多轮,所有单单的种子密钥是不够的,所有AES有自己的扩展密钥的方法。还要提一下,密钥扩展后也是竖着排成方阵的。
key:k1k2k3k4 k5k6k7k8 k9k10k11k12 k13k14k15k16...
k1    k5    k9    k13
k2    k6    k10  k14
k3    k7    k11  k15
k4    k8    k12  k16
轮数
轮数主要跟种子密钥长度有关。
一般习惯用Nk表示密钥所含的数据字数,一字表示32bit,也就是4字节,也就是一竖排。
128,192,256bit对应Nk=4,6,8
一般习惯用Nr表示轮数
Nr = Nk+6也就是10,12,14
密钥扩展(KeyExpansion)
对与密钥扩展其实只要关心两点:一是扩展成多长,这个其实跟加密过程有关,暂时只要知道密钥总长度为(分组大小=16个字节)*(Nr+1),也就是4*(Nr+1)字,下面讲过程的时候就会明白为什么要这么长。二是密钥扩展的算法,密钥的算法其实比较复杂,但是却不难理解。
注:Nk密钥字数,字为4字节也就是一竖排。
算法步骤如下:
Nk ≤ 6 的密钥扩展
1)最前面的 Nk 个字是由种子密钥填充的。
2)之后的每一个字 W[j] 等于前面的字 W[j-1] 的与 Nk 个位置之前的字 W[j-Nk]的异或。
3)而且对于 Nk 的整数倍的位置处的字,在异或之前,对 W[j-1] 的进行如下变换:
      .字节的循环移位 RotByte->即当输入字为 (a,b,c,d) 时,输出字为 (b , c, d, a )
      .用 S 盒进行变换次位元组
      .异或轮常数 Rcon[i/Nk]
伪代码
KeyExpansion (byteKey[4*Nk] , W[Nb*(Nr+1)])
{
    for (i =0; i < Nk; i ++)
        W[i]=(Key[4* i],Key[4* i +1],Key[4* i +2],Key[4* i +3] );
//扩展密钥的前面4个字由种子密钥组成

    for (i =Nk; i <Nb*(Nr+1); i ++)
    {
        temp=W[i-1];
        if (i % Nk= =0)            
   temp=SubByte (RotByte (temp))^Rcon[i /Nk];
        //i是NK的整数倍是要特殊处理
       W[i]=W[i-Nk]^ temp;
    }
}
Nk > 6 的密钥扩展
KeyExpansion (byte  Key[4*Nk] , W[Nb*(Nr+1)])
{
        for (i=0; i < Nk; i ++)
        W[i]=(Key[4* i], Key[4* i +1], Key[4* i +2], Key[4* i +3] );
 //扩展密钥的前面4个字由种子密钥组成
for (i =Nk; i <Nb*(Nr+1); i ++)
    {
        temp=W[i -1];
        if (i % Nk= =0)
            temp=SubByte (RotByte (temp))^Rcon[i /Nk];
    //i是NK的整数倍是要特殊处理
         else if (i % Nk==4)
                 temp=SubByte (temp);
     //i是4的整数倍是要特殊处理
        W[i]=W[i - Nk]^ temp;
    }
}
异或轮常数 Rcon[i/Nk] :Rcon[i/Nk]=(RC[i/Nk]],’00’,’00’,’00’)(i一定会大于Nk)
                                          RC[1]=‘01’
                                          RC[x]=2⊙RC[x-1]
(其实我也不懂Rcon,不过有人已经算好了如下
RC[1]=(01, 00, 00, 00),
RC[2]=(02, 00, 00, 00),
RC[3]=(04, 00, 00, 00),
RC[4]=(08, 00, 00, 00),
RC[5]=(10, 00, 00, 00),
RC[6]=(20, 00, 00, 00),
RC[7]=(40, 00, 00, 00),
RC[8]=(80, 00, 00, 00),
RC[9]=(1b, 00, 00, 00),
RC[10]=(36, 00, 00, 00))

出0入0汤圆

发表于 2018-9-29 09:01:58 | 显示全部楼层
上次弄了一个例程运行一段时间会死机,可能是没有释放内存。

出0入0汤圆

发表于 2018-9-29 12:40:11 | 显示全部楼层
感谢分享,备用。

出0入0汤圆

发表于 2018-9-29 23:26:38 | 显示全部楼层
楼主无私精神,值得学习!

出0入4汤圆

 楼主| 发表于 2018-9-30 19:28:51 | 显示全部楼层
希望能多多交流,共同进步!也希望大家能把在AES学习及应用方面碰到的问题及收获在此分享。

出0入8汤圆

发表于 2018-9-30 20:34:43 来自手机 | 显示全部楼层
如果是单片机里面用的话
1. 16字符变数组没必要
2. sbox,rcon节约rom可以动态生成,比如空间紧张的bootloader
3. 那几个GFMul其实有关联,可以优化

出0入4汤圆

 楼主| 发表于 2018-10-1 15:10:52 | 显示全部楼层
本帖最后由 BS_good200xy 于 2018-10-1 15:14 编辑
canspider 发表于 2018-9-30 20:34
如果是单片机里面用的话
1. 16字符变数组没必要
2. sbox,rcon节约rom可以动态生成,比如空间紧张的bootloa ...


多谢指导!现在又在研究一个比较实用的开源AES项目,现贴出来分享。

在此项目中:AES128 AES192 AES256及ECB CBC CTR模式都可自定义。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-10-1 16:10:34 | 显示全部楼层
AES加密。感谢分享

出0入0汤圆

发表于 2018-10-1 16:28:56 | 显示全部楼层
多谢楼组分享AES加密好资料!

出0入0汤圆

发表于 2018-10-3 15:17:38 | 显示全部楼层
谢谢分享,国庆快乐!

出0入0汤圆

发表于 2018-10-3 18:02:54 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2018-10-3 18:09:30 | 显示全部楼层
学习了                  

出0入0汤圆

发表于 2018-10-5 11:56:20 来自手机 | 显示全部楼层
学习了,感觉很不错~~~~

出0入0汤圆

发表于 2018-10-5 14:47:39 | 显示全部楼层
收藏了, 备用,谢谢

出0入0汤圆

发表于 2018-10-8 22:11:30 | 显示全部楼层
谢谢分享,下载看看

出0入0汤圆

发表于 2018-10-8 23:51:44 | 显示全部楼层
AES加密解密 收藏了

出0入0汤圆

发表于 2018-10-10 10:46:42 | 显示全部楼层
学习下,谢谢分享!

出0入70汤圆

发表于 2018-11-21 10:45:29 | 显示全部楼层
十年前做过,现在都忘了

出0入0汤圆

发表于 2018-12-3 15:54:06 | 显示全部楼层

学习下,谢谢分享!

出0入0汤圆

发表于 2018-12-3 22:30:41 | 显示全部楼层
不知道在51里要多久

出10入95汤圆

发表于 2019-7-14 11:39:32 | 显示全部楼层
BS_good200xy 发表于 2018-10-1 15:10
多谢指导!现在又在研究一个比较实用的开源AES项目,现贴出来分享。

在此项目中:AES128 AES192 AES256 ...

多谢楼主分享!

出0入0汤圆

发表于 2019-9-10 16:07:12 | 显示全部楼层
AES加密,收藏

出0入0汤圆

发表于 2019-9-11 11:08:46 | 显示全部楼层
openssl和wolfssl也都有不错的开源实现

出0入0汤圆

发表于 2019-10-14 17:22:38 | 显示全部楼层
谢谢分享!!

出0入0汤圆

发表于 2019-10-28 11:52:40 | 显示全部楼层
谢谢分享,下载看看

出0入0汤圆

发表于 2019-10-28 13:30:14 | 显示全部楼层
mark            

出0入0汤圆

发表于 2019-10-28 14:10:58 | 显示全部楼层
AES 加解密, mark

出5入4汤圆

发表于 2019-10-28 23:03:17 | 显示全部楼层
请问大哥AES计算时间大概是什么数量级的?我的MCU 是120M CM4带硬浮点

出0入0汤圆

发表于 2019-10-29 08:27:34 | 显示全部楼层
非常感谢分享!

出0入0汤圆

发表于 2019-12-25 21:01:40 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2020-6-1 08:50:09 | 显示全部楼层
AES 加密,谢谢分享

出0入0汤圆

发表于 2021-1-6 18:15:33 来自手机 | 显示全部楼层
这个资料不错,谢谢了!

出0入0汤圆

发表于 2021-1-14 16:20:25 | 显示全部楼层
谢谢分享楼主好人一生平安

出0入0汤圆

发表于 2021-1-14 16:40:09 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2021-4-24 16:53:38 | 显示全部楼层
谢谢楼主分享,很好的资料
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 12:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表