我是靠谱客的博主 老实蓝天,最近开发中收集的这篇文章主要介绍c语言实现idea加密算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  

IDEA数据加密算法及实现

 

 作者:孤独剑

 

IDEA对称数据加密算法,是我写的第一个关于加解密方面的算法,在大学宿舍里弄了差不多将近二十个小时终于搞懂了。刚开始受到了“不良”资料的误导走了很长时间的弯路,后来在图书馆看到了正确的介绍才终于把这个算法给弄出来了。

 

1   简介

 

  IDEA,即国际数据加密算法

 

  是旅居瑞士中国青年学者来学嘉和著名密码专家J.Massey1990年提出的。它在1990年正式公布并在以后得到增强。这种算法是在DES算法的基础上发展出来的,类似于三重DES,和DES一样IDEA也是属于对称密钥算法。发展IDEA也是因为感到DES具有密钥太短等缺点,已经过时。IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。

类似于DESIDEA算法也是一种数据块加密算法,它设计了一系列加密轮次,每轮加密都使用从完整的加密密钥中生成的一个子密钥。与DES的不同处在于,它采用软件实现和采用硬件实现同样快速。

 

由于IDEA是在美国之外提出并发展起来的,避开了美国法律上对加密技术的诸多限制,因此,有关IDEA算法和实现技术的书籍都可以自由出版和交流,可极大地促进IDEA的发展和完善。但由于该算法出现的时间不长,针对它的攻击也还不多,还未经过较长时间的考验。因此,尚不能判断出它的优势和缺陷。

 

  在PGP(pretty good privacy)中,IDEA算法被采用。

 

2   算法详解:

 

2.1产生密钥

 

算法用了52个子密钥。首先,将128-位源密钥分成816-位子密钥。源密钥再次向左环移25位产生另外8个子密钥,如此进行直到产生完52个密匙。具体是:

 

IDEA总共进行8轮迭代操作,每轮需要6个子密钥,另外还需要4个额外子密钥,所以总共需要52个子密钥,这个52个子密钥都是从128位密钥中扩展出来的。

 

 

2.2加、解密过程

输入的64-位数据分组被分成416-位子分组:xlX2x3x4。这4个子分组成为算法的第一轮的输入,总共有8轮。在每一轮中,这4个子分组相互相异或,相加,相乘,且与616-位子密钥相异或,相加,相乘。在轮与轮间,第二和第三个子分组交换。最后在输出变换中4个子分组与4个子密钥进行运算。

注意上面的加法运算是对模216次方的加法运算,即求两个数的和对65536的余数,

乘法运算是对模216次方加1的乘法运算,即两个数的积对65537的余数。

 

  在每一轮中,执行的顺序如下:

 

  (1)X1和第一个子密钥相乘。

 

  (2)x2和第二个子密钥相加。

 

  (3)X3和第三个子密钥相加。

 

  (4)x4和第四个子密钥相乘。

 

  (5)将第(1)步和第(3)步的结果相异或。 ·

 

  (6)将第(2)步和第(4)步的结果相异或。

 

  (7)将第(5)步的结果与第五个子密钥相乘。

 

  (8)将第(6)步和第(7)步的结果相加。

 

  (9)将第(8)步的结果与第六个子密钥相乘。

 

  (10)将第(7)步和第(9)步的结果相加。

 

  (11)将第(1)步和第(9)步的结果相异或。

 

  (12)将第(3)步和第(9)步的结果相异或。

 

  (13)将第(2)步和第(10)步的结果相异或。

 

  (14)将第(4)步和第(10)步的结果相异或。

 

  每一轮的输出是第(11)(12)(13)(14) 步的结果形成的4个子分组。将中间两个分组分组交换(最后一轮除外)后,即为下一轮的输入。

 

  经过8轮运算之后,有一个最终的输出变换:

 

  (1) X1和第一个子密钥相乘。

 

  (2) x2和第二个子密钥相加。

 

  (3) x3和第三个子密钥相加。

 

  (4) x4和第四个子密钥相乘。

 

最后,这4个子分组重新连接到一起产生密文。

 

2.3加密密匙及解密密钥对应图

 

 

 

 

2.4加密过程图

 

 

 

2.5解密过程:

解密过程和加密过程完全一样只是密匙不同而已。

 

 

3.一些实现的细节:

 注意点到一点就是数据在内存中是按照高高低低的顺序排列的即对于一个数高位的排在高内存,低位的排在低内存。比如下面的代码输出:

#include<stdio.h>

 

int main()

{

    short int a=0x3432;

    char *b=(char *)&a;

    printf("%x",*b);

    scanf("%d");

    return 0;

}

结果应当是32而不是34,因为34在高位所以应该放在高内存,而指针b访问的是a的第一个字节的内容即低位内存内容即32。这一点在后面的数据加解密过程中很重要。

为了方便对密匙的使用可以定义一个结构体

typedef struct {

        word16 jia_key[10][7],jie_key[10][7];

        }idea_key;

这里jia_key[1][1]即表示加密算法的第一轮的第一个密匙,也就是说舍去一部分数组内容没使用。

 解密密匙与加密密匙的对应关系如上图所示即他们分别为解密密匙的对65537的乘法逆元,(对idea而言,对于模65537乘,全0子分组用-1来表示,因此0的乘法逆是0)相反数或者是加密密匙本身。计算子密匙需要一些时间但是对每一个解密密匙都只需要一个解密密匙,只需做一次。这样对加密过的数据利用解密密匙进行相同的运算就可以还原原来的数据(具体为什么这样做,是数学家的事,可以参考华罗庚的关于数论的书)。

 

4   评价:

Idea的密匙长度几乎是des的两倍多,因此对idea的穷举攻击几乎是不可能的(它的空间复杂度将达到1039次方,也许在整个宇宙中有这么多的存储空间),idea也可以有效的抵抗中间相遇攻击和差分分析攻击事实上在idea的八轮算法中在第四轮就已经具有对差分密码分析的免疫了。

 

  虽然idea是目前公开算法的最好和最安全的加密算法,但是随着时间的流失看似安全的算法往往会被新的密码分析方法破译,目前有几个军事组织已经对idea进行密码分析,他们中的没有一个人愿意公布可能成功破译的结果,但将来的某一天他们可能会成功。

 

idea.h

 

 

 

 

 

suanfa.cpp

 

 

 

main.cpp

 

 

 

 

 

 

以上代码在dev cpp4.9上可以编译通过

 

 

 

最后

以上就是老实蓝天为你收集整理的c语言实现idea加密算法的全部内容,希望文章能够帮你解决c语言实现idea加密算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部