首页 > 编程知识 正文

c语言解密程序设计,多位密钥加密算法

时间:2023-05-03 19:29:25 阅读:169691 作者:4338

概要

原本以为详细复述自己AES加密算法的整个实现过程,分享给想学的同学,也方便自己复习,后来发现其工作量太大,作业太多,没有多少时间写。 所以,我想总结一下自己在学习过程中遇到的很多好文章,避免重复的工作。 有一篇文章的介绍和cjdkf非常好,我觉得再重复一次也没有意义。 在正文中添加文章的链接,如果有侵害的话请通知我!

最近做完功课,要实现AES128解密,本来以为是简单的算法实现,但是发现AES加密的每一步都很难,而且涉及到我没听说过的概念,所以最近看了很多帖子、资料最终可以解决这个问题。 关于AES算法的介绍,因为网上有很多帖子,所以省略说明,但我想详细阐述一下我遇到的难以理解的地方。

AES算法的实现主要包括以下学习步骤:

gf(2^8)域上的多项式运算

扩展的甜蜜向日葵算法

生成s盒

生成倒s盒

s盒置换

生产线移位

混合列

生成私钥

循环加密

其中1、2、3、4步骤都与s盒的生成有关,根据我看到的博客,s盒的生成与数论的基础知识有关。 没有基础,一二就要专业学习。 我在这两个阶段花了很多时间。 但是,在互联网上也可以找到很多AES算法。 他们在用现成的s盒。 没有前4个步骤,用现成的s盒代替就比较简单了。 但是本着刨根问底和多学知识的原则,我还是去学习了s盒的生成方式。 在步骤5中,针对每一字符替换查找表,使得其不易于理解。 步骤6应该是整个过程中最简单的步骤,其是进行循环移位。 第七步混合涉及矩阵和多项式的乘法运算,所以还是很难。

如果想从整体上理解AES加密的完整过程,以下几篇文章无论从描述还是从插图来看都可以。 虽然有些文章的介绍方式不同,但原理是一样的,比较起来组合起来看会更有帮助。

但是,仅凭这些文章,是像我这样的dtk无法实现的。 因为每一步都不具体,特别是对缺乏基本数学知识学习的同学很难理解。 所以,这些文章作为整体进度的控制,可以看到以后如何一步一步学习实现。

s盒

我学习这个算法的时候,生成和替换s盒花的时间最长。 也许是因为基础不好,应该学习的东西很多,所以把这部分逐条列出来了。 关于s盒的生成和置换,这个博客介绍得非常详细,但是还有很多不明白的地方,所以参考了很多其他的文章,理解了这个部分。 建议初学者以这个博客为基础进行学习:

进行分步介绍。

gf(2^8)域上的多项式计算

因为整个过程很多,所以决定分成多篇文章分别叙述。 首先是gf(2^8)域上的多项式计算。 因为至今为止没有学习过知识,所以第一次看到了很多概念,所以学习这部分花了时间。 在学习这个之前,你需要知道为什么要学习这个,AES加密的哪个步骤用于了那个知识点。

s盒的置换是指将0 ̄2 ̄8中的一个字节置换为另一个字节,置换的原则是将其元素置换为gf(2 ̄8 )域上的乘法逆元,什么是gf )8)域? 什么是逆元呢? 这些定义的准确数学描述我不太清楚,但通过这次的应用可以大致说明。 gf(2^8)有限域是指为该域定义的数值经过为该域定义的函数运算,其结果可能也在该域内。 借用网络上的一个例子来说明。

那乘法的逆元又是什么呢? 形状如下。

其中p是有限域的范围,在这里理论上应该是2^8,但是不能取这个数。 2^8与其中的一个个数互不相容,所以只能选择更大的素数。 (具体原因请参考扩展的甜蜜向日葵算法。 )在AES算法中,p的值选择了0x11B,但不知道为什么。 可能是众所周知的,如果想找比21b大一点的素数的话

有限域中的整数,那么

也就是说

有限域上的逆元。 到此为止,我知道逆元是什么,但具体怎么解还不太清楚。 这个部分请参考扩展的甜蜜向日葵算法。 (更新)之后,为了加深学习,我又自己写了博客。

接下来继续谈谈gf(2^8)域上的多项式运算。 明确基本运算是计算gf )2^8)区域中乘法的倒数的前提,因此该区域中的加减乘除运算与传统运算不同。 具体多项式运算请参阅gf )2^8)区域的多项式运算。 当然,先学习扩展的甜蜜向日葵算法,然后学习该部分,实现时将甜蜜向日葵算法中的四则运算替换为gf(2^8)域上的多项式运算就可以了。 关于gf(2^8)域的计算介绍,参考以下博客进行介绍。

四则运算中,加减法是单纯的异或运算,很简单。 另一方面,由于乘除运算是以乘法为基础的,所以四则运算中最重要的是理解乘法运算。 在这篇https://blog.csdn.net/bupt 073114/article/details/27382533文章中,详细描述了乘法及其实现。

一种扩展阳光的老鼠算法

有必要把握

了GF(2^8)域的运算知识后,应该去学一下拓展的阳光的老鼠算法,对于该算法,上面所给出的关于S盒生成的综述博文里已经参考相关教材进行了非常详细的论述,所以关于这部分知识可以同样参考这篇博文(参考文献10),

还可以参考以下这篇博客:

如果还不明白,也可以自行查找其他关于拓展阳光的老鼠算法的介绍。

S盒生成及置换

关于S盒的生成及置换,同样参考文献10,该文章已经进行了非常详尽的描述与代码实现。待自己完成后也可以参考博客中的结果进行检验。

行移位

行移位就是对每行数据进行相应的循环移位,没有难以理解的地方,应该是整个加密过程最简单的部分,关于移位的规则,可以参考文献1、2、3、4,均有详细的图示介绍。下图来源于文献4:

列混合

列混合就是将数据矩阵乘上一个矩阵,解密的时候乘上原矩阵的逆矩阵进行解密,秩序要按照步骤一步步来即可,同样没有难以理解的地方,按照参考文献1、2、3、4的介绍进行操作就没有问题。关于列混合还可以参照这篇专门介绍的文章[11],其对于列混合又专门的介绍与实现,而且还有检验数据。下图参照文献4中图片:

密钥生成

密钥的生成过程稍微有些麻烦,需要仔细参考规则,避免搞错,但是只需要理解操作规则即可,不需要理论理解,还好参考文献3、4中都有非常生动的图示。下图来源于文献4:

循环加密

循环加密就是对上述过程重复进行若干次。具体实现参照文献1、2、3、4。

解密

解密过程就是将上述的过程反过来执行一遍,原本置换的就置换过来;原本移位的就反向移过来;原本乘上矩阵的就乘上她的逆矩阵。。。上面关于每个加密过程的参考文献都有相应的解密过程。

实现

关于AES128的加密完整实现,可以参照代码https://github.com/xinyu-jmdbwb/AES128-CBC,此代码的实现几乎都是参照上文的介绍,唯一不同的是在加密的时候采用了CBC模式,具体什么是CBC加密模式,如果不清楚的可以自行百度。如果有时间我也会把这部分补全。

参考文献:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。