IDEA加解密

一.IDEA算法简介

IDEA(International Data Encryption Alogrithm)是由瑞士苏黎士联邦工业大学的XueJiaLai和James L.Massey 于1991年提出的。IDEA使用128比特密钥,整个算法和DES相似,也是将明文划分成一个个64比特长的数据分组,然后经过几次迭代和一次变换,得出64比特的密文。

IDEA是将两个16比特的值映射为一个16比特的值,这些操作是:

●  半加运算,即“异或”运算,用符号“⊕”表示。所谓的半加运算,就是在进行二进制运算时只加,不进位。

●  模216的加法运算(即mod 65536),用“+”表示。

●  模216+1乘运算用符号“⊙”表示。

实际上,⊙是将两个输入的数进行乘法运算,然后再对此结果按模216+1运算得出的结果。对于这样的运算应该注意的是,参与运算的任何一个二进制数据n位,如果全是0,则用n+1位数据表示,且最高位为1,其余全为0。

为了理解以上三种操作,我们用2位的数来表示以上的三种关系,如表2-3-1所示。

表2-3-1  IDEA三种操作的关系

X

Y

XY

X⊙Y

X⊕Y

十进制

二进制

十进制

二进制

十进制

二进制

十进制

二进制

十进制

二进制

0

00

0

00

0

00

1

01

0

00

0

00

1

01

1

01

0

00

1

01

0

00

2

10

2

10

3

11

2

10

0

00

3

11

3

11

2

10

3

11

1

01

0

00

1

01

0

00

1

01

1

01

1

01

2

10

1

01

0

00

1

01

2

10

3

11

2

10

3

11

1

01

3

11

0

00

3

11

2

10

2

10

0

00

2

10

3

11

2

10

2

10

1

01

3

11

2

10

3

11

2

10

2

10

0

00

0

00

0

00

2

10

3

11

1

01

1

01

1

01

3

11

0

00

3

11

2

10

3

11

3

11

1

01

0

00

3

11

2

10

3

11

2

10

1

01

1

01

1

01

3

11

3

11

2

10

0

00

0

00

二.IDEA算法加密过程

1.IDEA迭代过程

IDEA加密算法采用8次迭代,如图2-3-1所示:

图2-3-1  8次迭代

64比特的密钥生成的数据被分成8个子块,每个子块16比特。每一次迭代过程如图2-3-2所示:

图2-3-2  单次迭代过程

「说明」 图中⊕表示异或运算;表示模216的加法运算; ⊙表示模216+1的乘法运算。

X1,X2,X3和X4作为第一次迭代的输入,每轮的迭代都是4个子块以及16比特子密钥间的异或运算,模216做加法运算和模(216+1)的乘法运算。

迭代步骤如下:

(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)的结果做异或运算。

每轮完成以上的14次运算,共进行8轮,然后进行最后的输出变换,如图2-3-3所示。经过8轮迭代运算后,W81,W82,W83,W84分别与Z48,Z49,Z50,Z51运算得到Y1,Y2,Y3和Y4。其方法如下:

图2-3-3  8轮迭代变换后的输出变换

2.IDEA密钥生成过程

在图2-3-3中可以看出,在加密过程中共有52个子密钥块参与运算,每个块长16比特。这52个密钥块是由128比特密钥产生的,我们将这52个密钥块记为Z0,Z1……,Z51。最初的8个子密钥Z0,Z1,……,Z7是直接来自用户输入,Z0是用户输入密钥的前16比特;Z1是用户输入密钥的第二个16比特,Z7是用户输入密钥的最后16比特。这样从Z0到Z7的密钥共计长度为128比特。

IDEA每一轮迭代使用6个子密钥,每个子密钥有16位,这意味着在一轮迭代中,密钥中只有96位被使用。最初的6个连续的子密钥(Z0到Z5)直接用于第一轮迭代,然后128位的密钥要循环左移25位,之后再取密钥的前96位作为下一轮的6个子密钥。以此类推,直到8轮迭代全部完成。

3.IDEA解密算法与其加密的关系

IDEA的解密处理和其加密处理基本相同,只是解密处理输入的是密文,选择的密钥不大相同,但也有一定的联系。它与加密密钥的关系如下。

解密过程的第i轮前四个密钥是与加密过程中的第(10-i)轮的相同,最后置换作为第9轮。解密过程的第1和第4轮是对应加密处理过程第1轮和第4轮的模(216+1)乘运算,解密过程中的第2轮和第3轮对应与加密过程中的第3轮和第2轮的模216的加运算。

在前8轮运算中,解密的第i轮的最后两个子密钥块等于加密过程中的第9-i轮的最后两个子密钥块。每一轮的加密和解密的子密钥关系如表2-3-2所示。

表2-3-2  加密和解密的子密钥关系

加解密轮次

每轮的加密密钥

原始密钥对应的位

第一轮

Z0Z1Z2Z3Z4Z5

Z48-1-Z49-Z50Z51-1Z46Z47

第二轮

Z6Z7Z8Z9Z10Z11

Z42-1-Z44-Z43Z45-1Z40Z41

第三轮

Z12Z13Z14Z15Z16Z17

Z36-1-Z38-Z37Z39-1Z34Z35

第四轮

Z28Z19Z20Z21Z22Z23

Z30-1-Z32-Z31Z33-1Z28Z29

第五轮

Z34Z25Z26Z27Z28Z29

Z24-1-Z26-Z25Z27-1Z22Z23

第六轮

Z30Z31Z32Z33Z34Z35

Z18-1Z20-Z19Z21-1Z18Z17

第七轮

Z46Z37Z38Z39Z40Z41

Z12-1Z14-Z13Z15-1Z10Z11

第八轮

Z42Z43Z44Z45Z46Z47

Z6-1-Z8-Z7Z9-1Z4Z5

最后的置换

Z48Z49Z50Z51

Z0-1-Z1-Z2Z3-1

以上Zj与Zj-1及-Zj与Zj的关系为:

时间: 2025-01-01 12:01:47

IDEA加解密的相关文章

超强php加解密扩展:cryptopp

cryptopp是一个用c++编写的超强加解密扩展.性能优异可靠.完全可以替换所有PHP编写的加解密类.不仅如此,它的提供的编程接口非常简明易用,可说是PHP程序员必备扩展. cryptopp扩展的接口如下: class cryptopp { public function __construct($param); public function setkey($param); public function encode($param); public function decode($par

【转】 Java 进行 RSA 加解密时不得不考虑到的那些事儿

[转] Java 进行 RSA 加解密时不得不考虑到的那些事儿 1. 加密的系统不要具备解密的功能,否则 RSA 可能不太合适 公钥加密,私钥解密.加密的系统和解密的系统分开部署,加密的系统不应该同时具备解密的功能,这样即使黑客攻破了加密系统,他拿到的也只是一堆无法破解的密文数据.否则的话,你就要考虑你的场景是否有必要用 RSA 了. 2. 可以通过修改生成密钥的长度来调整密文长度 生成密文的长度等于密钥长度.密钥长度越大,生成密文的长度也就越大,加密的速度也就越慢,而密文也就越难被破解掉.著名

aes加解密 Illegal key size

做aes加密时,发生一个奇怪的错误,在本地环境是好的,发布到测试环境就出问题, java.security.InvalidKeyException: Illegal key size 想到本地环境之前也是遇到加密问题,从oracle官网下载了两个文件,覆盖本地文件得到解决. 推测测试环境肯定也是此原因,照此方法,测试环境aes加解密问题得到解决,特此记录下来,避免下次再踩坑. 问题背景: Java几乎各种常用加密算法都能找到对应的实现.因为美国的出口限制,Sun通过权限文件(local_poli

rsa互通密钥对生成及互通加解密(c#,java,php)

摘要 在数据安全上rsa起着非常大的作用,特别是数据网络通讯的安全上.当异构系统在数据网络通讯上对安全性有所要求时,rsa将作为其中的一种选择,此时rsa的互通性就显得尤为重要了. 本文参考网络资料,提供了rsa互通性的一种可行的解决方案(c#,java,php),而这种互通性是在一定的局限性上达成的,比如密钥是1024位的(更高位没试过,应该也可行),基于PKCS1填充方式. 所编写的代码有一部分使用了硬编码,同时注重了功能的实现,在类结构设计上关注不多,有需要的可自行修改重构. 相关的程序集

DES加解密算法的简单实现

前几天刚写完一个简单的DES算法的实验,拿来作为第一次发到博客的随笔,填充一下空空如也的博客,献丑了 因为主要目的是Easy-To-Understand,再现一个直观的DES加解密的过程,所以很浪费地每一个数据位都用一个short整型存储,用来理ying解fu过zuo程ye就好(虽说DES这种对称加密算法十多年前就已经被淘汰了,现在一般建议用AES或者DES3 “1973 年,美国国家标准局(NBS)开始征集一种标准的数据加密标准算法(DES),以用于非机密性政府机构.商业部门和民间的对非机密的

实验五 TCP传输及加解密

北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计                         班级:1353            姓名:陈巧然      学号:20135310 成绩:             指导教师:娄佳鹏              实验日期:2015.6.9 实验密级:         预习程度:             实验时间:15:20-18:00 仪器组次:10          必修/选修:            

openssl 加解密学习笔记

首先最近接到一个项目,这个项目中需要用到RSA的加密解密,因为之前没有接触过,在网上找了些资料,然后自己测试后发现其实使用openssl来进行加解密挺简单的,但是网上百度出来的很多又是一样的,有时候帮助不是很大,所以才想要写下来自己在搞整个加密过程遇到的一些问题,方便自己以后回头查看,也可能会帮到遇到同样的童鞋. 废话不多说,我接到的这个项目呢,有几个地方是需要用到RSA的加解密.1.使用.pfx格式的私钥签名.2.使用.cer的公钥文件进行加密操作.3.使用给定的指数与模进行公钥加密.下面有些

微信公众平台消息体加解密实现

一.消息体加解密 微信公众平台在配置服务器时,提供了3种加解密的模式供开发者选择,即明文模式.兼容模式.安全模式,选择兼容模式和安全模式前,需在开发者中心填写消息加解密密钥EncodingAESKey. 明文模式:维持现有模式,没有适配加解密新特性,消息体明文收发,默认设置为明文模式 兼容模式:公众平台发送消息内容将同时包括明文和密文,消息包长度增加到原来的3倍左右:公众号回复明文或密文均可,不影响现有消息收发:开发者可在此模式下进行调试 安全模式(推荐):公众平台发送消息体的内容只含有密文,公

Android数据库安全解决方案,使用SQLCipher进行加解密

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952409 我们都知道,Android系统内置了SQLite数据库,并且提供了一整套的API用于对数据库进行增删改查操作.数据库存储是我们经常会使用到的一种存储方式,相信大多数朋友对它的使用方法都已经比较熟悉了吧.在Android中,我们既可以使用原生的SQL语句来对数据进行操作,也可以使用Android API提供的CRUD方法来对数据库进行操作,两种方式各有特点,选择使用哪

使用DES加解密

这里使用框架提供的des加解密库: 首先引入头文件 #import <CommonCrypto/CommonCryptor.h> 主要的加解密函数如下: /*字符串加密 *参数 *plainText : 加密明文 *key        : 密钥 64位 */ + (NSString *) encryptUseDES:(NSString *)plainText key:(NSString *)key { NSString *ciphertext = nil; const char *textB