`

IDEA数据加密算法实现

 
阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

IDEA数据加密算法介绍之续篇,代码实现:
http://blog.csdn.net/CXXSoft/archive/2006/08/23/1109279.aspx

5、 源码:

//*******************************************************************************
*IDEA数据加密算法1.0版本
*开发作者:成晓旭
*项目简述:IDEA数据加密算法1.0版本
*启动时间:2000年05月08日
*完成时间:2000年01月14日20:09:001个晚上>
*
*开发环境:Windows98
*开发工具:BorlandDelphi5
*
*文件名称:IDEA.pas
*简介:IDEA数据加密算法1.0版本
*
*备注:任何人使用此文件时,请保留此段自述文件,谢谢!
*
******************************************************************************/
unitIDEA;

interface

uses
Windows,Messages,SysUtils,Classes,Dialogs;
functionBinToHex(strBin:string):string;
functionHexToTen(strHex:string):int64;
functionLeftMove(S:string;P:integer):String;
functionModAdd(intAdd1,intAdd2:int64):int64;
functionModMul(intMul1,intMul2:int64;intFlag:integer):int64;
functionModXor(intXor1,intXor2:int64):int64;
procedureCreatePassword(strPassword:string;VARarrPassword:arrayofint64;VARarrOpenPassword:arrayofint64);
//产生加密子密钥函数
procedureGetOpenPassword(intSource:int64;VARintResult:int64;Flag:integer);//求取解密子密钥函数
procedureCreateKeyTable();//产生加、解密子密钥之间的对应关系表
procedureRiddle(arrPassword:arrayofint64;arrRiddleKey:arrayofint64;VARarrOpenPassword:arrayofint64);StdCall;export;//IDEA数据解密函数
procedureCreateOpenPassword(VARarrOpenPassKey:arrayofint64);//产生解密子密钥函数
procedureCreateKey(VARarrKey:arrayofint64;VARarrOpenKey:arrayofint64;VARstrOutKey:string);StdCall;export;//产生加密密钥函数


implementation

ConststrNum:array[
1..16]ofstring[4]=('0000','0001','0010','0011','0100','0101','0110','0111','1000','1001','1010','1011','1100','1101','1110','1111');
ConstchrHex:array[
1..16]ofchar=('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F');
var
g_arr_Ten_Password:array[
1..52]ofint64;
g_arr_Flag:array[
1..52]ofinteger;
g_arr_Table:array[
1..52]ofinteger;
...{--------------------------------------------------------------------}

procedureCreateKey(VARarrKey:arrayofint64;VARarrOpenKey:arrayofint64;VARstrOutKey:string);StdCall;export;
var
intKey,intLoop1,intLoop2,intLoop3:integer;
hexKey,ch,strTemp:string;
strKey:string[
128];
begin
strKey:
='';
Randomize;
forintLoop1:=1to8do
begin
intKey:
=Random(65536);
hexKey:
=IntToHex(intKey,4);
strTemp:
='';
forintLoop2:=1to4do
begin
ch:
=Copy(hexKey,intLoop2,1);
forintLoop3:=1to16do
begin
ifch=chrHex[intLoop3]then
begin
ch:
=strNum[intLoop3];
break;
end;
end;
strTemp:
=strTemp+ch;
end;
strKey:
=strKey+strTemp;
end;
strOutKey:
=strKey;
CreatePassword(strKey,arrKey,arrOpenKey);
//调用产生加密子密钥过程
end;
...{--------------------------------------------------------------------}

functionBinToHex(strBin:string):string;
var
intLoop1,intLoop2:integer;
strTemp,strResult:string;
begin
intLoop1:
=1;
strResult:
='';
ifLength(strBin)16thenShowMessage('二进制数据长度有错!');
while(intLoop116)do
begin
strTemp:
=Copy(strBin,intLoop1,4);
forintLoop2:=1to16do
ifstrTemp=strNum[intLoop2]then
begin
strTemp:
=chrHex[intLoop2];
break;
end;
strResult:
=strResult+strTemp;
intLoop1:
=intLoop1+4;
end;
BinToHex:
=strResult;
end;
...{--------------------------------------------------------------------}

functionHexToTen(strHex:string):int64;
//十六进制转十进制
var
intLoop1,intLoop2,intTemp:integer;
intResult:int64;
strTemp:string;
begin
intResult:
=0;
intTemp:
=0;
ifLength(strHex)4thenShowMessage('十六进制数据长度有错!');
forintLoop1:=1to4do
begin
CaseintLoop1of
1:intTemp:=4096;
2:intTemp:=256;
3:intTemp:=16;
4:intTemp:=1
end;
strTemp:
=Copy(strHex,intLoop1,1);
forintLoop2:=1to16do
ifUpperCase(strTemp)=chrHex[intLoop2]then
begin
intResult:
=intResult+(Int64(intLoop2)-1)*Int64(intTemp);
break;
end;
end;
HexToTen:
=intResult;
end;
...{--------------------------------------------------------------------}

functionLeftMove(S:string;P:integer):String;
var
int_Len,i:integer;
str_Result,str_Num:string;
begin
int_Len:
=length(s);
str_Num:
=S;
str_Result:
='';
ifint_LenPthen
str_Result:
=S
else
begin
fori:=P+1toint_Lendo
str_Result:
=str_Result+copy(str_Num,i,1);
str_Result:
=str_Result+copy(str_Num,1,p);
end;
LeftMove:
=Trim(str_Result);
end;
...{--------------------------------------------------------------------}

functionModAdd(intAdd1,intAdd2:int64):int64;
begin
ModAdd:
=(intAdd1+intAdd2)mod65536;//模65536求和
end;

functionModMul(intMul1,intMul2:int64;intFlag:integer):int64;
varintTemp:int64;
begin
intTemp:
=(intMul1*intMul2)mod65537;
ifintFlag=0then
begin
ifintMul1=0thenintTemp:=65537-intMul2;
ifintMul2=0thenintTemp:=65537-intMul1;
ifintTemp=65536thenintTemp:=0;
ifintTemp=65537thenintTemp:=1;
end
else
begin
ifintMul1=0thenintTemp:=65537-intMul2;
ifintMul2=0thenintTemp:=65537-intMul1;
ifintTemp=0thenintTemp:=65536;
ifintTemp=65537thenintTemp:=1;
ifintTemp=65536thenintTemp:=0;
end;
ModMul:
=intTemp;
end;

functionModXor(intXor1,intXor2:int64):int64;
begin
ModXor:
=intXor1xorintXor2;
end;
...{--------------------------------------------------------------------}

procedureCreatePassword(strPassword:string;VARarrPassword:arrayofint64;VARarrOpenPassword:arrayofint64);
var
strKey:string;
strTemp:array[
1..52]ofstring[4];
intStart,intCount:integer;
begin
strKey:
=strPassword;//
intCount:=1;
intStart:
=1;
...{--------------------产生52个16bit的加密子密钥部分-------------------}
while(intCount52)do
begin
strTemp[intCount]:
=BinToHex(Copy(strKey,intStart,16));
intStart:
=intStart+16;
intCount:
=intCount+1;
if((intCountmod8)=1)then
begin
strKey:
=LeftMove(strKey,25);
intStart:
=1;
end;
end;
intCount:
=1;
while(intCount52)do
begin
arrPassword[intCount
-1]:=HexToTen(strTemp[intCount]);
g_arr_Ten_Password[intCount]:
=arrPassword[intCount-1];
intCount:
=intCount+1;
end;
CreateOpenPassword(arrOpenPassword);
...{--------------------产生52个16bit的加密子密钥部分-------------------}
end;
...{--------------------------------------------------------------------}

procedureGetOpenPassword(intSource:int64;VARintResult:int64;Flag:integer);
var
int_Source,int_Result,int_Mod_Value:int64;
int_Loop:integer;
begin
int_Source:
=intSource;
...{--------------------求取每个加密子密钥相应的解密子密钥部分-------------------}
CaseFlagof
0:intResult:=int_Source;
1:intResult:=65536-int_Source;
2:
begin
ifint_Source=0then
intResult:
=int_Source
else
forint_Loop:=1to65536do
begin
int_Result:
=Int64(int_Loop)*65537+1;
int_Mod_Value:
=int_Resultmodint_Source;
ifint_Mod_Value=0then
begin
int_Result:
=int_Resultdivint_Source;
intResult:
=int_Result;
break;
end;
end;
end;
end;
...{--------------------求取每个加密子密钥相应的解密子密钥部分-------------------}
end;
...{--------------------------------------------------------------------}

procedureCreateKeyTable();
var
int_Count_CreatePassword,int_Count_OpenPassword,int_ExChange:integer;
begin
...{----------------求取在产生解密子密钥时所用的参数标志对应表部分-------------}
forint_Count_CreatePassword:=52downto1do
Caseint_Count_CreatePasswordmod
6of
0,5:beging_arr_Flag[int_Count_CreatePassword]:=0;end;
2,3:beging_arr_Flag[int_Count_CreatePassword]:=1;end;
1,4:beging_arr_Flag[int_Count_CreatePassword]:=2;end;
end;
...{----------------求取在产生解密子密钥时所用的参数标志对应表部分-------------}

...{----------------求取每个加密子密钥与相应解密子密钥间的对应关系映射表部分-------------}
int_Count_CreatePassword:
=52;
int_Count_OpenPassword:
=1;
while(int_Count_CreatePassword>=1)do
begin
Caseint_Count_CreatePasswordmod
6of
1,2,3,4:
begin
g_arr_Table[int_Count_OpenPassword]:
=int_Count_CreatePassword-3;
g_arr_Table[int_Count_OpenPassword
+1]:=int_Count_CreatePassword-1;
g_arr_Table[int_Count_OpenPassword
+2]:=int_Count_CreatePassword-2;
g_arr_Table[int_Count_OpenPassword
+3]:=int_Count_CreatePassword;
if(int_Count_CreatePassword>=48)or(int_Count_CreatePassword4)then//首轮和末轮处理不需交换,故要再换回来
begin
int_ExChange:
=g_arr_Table[int_Count_OpenPassword+1];
g_arr_Table[int_Count_OpenPassword
+1]:=g_arr_Table[int_Count_OpenPassword+2];
g_arr_Table[int_Count_OpenPassword
+2]:=int_ExChange;
end;
int_Count_CreatePassword:
=int_Count_CreatePassword-4;
int_Count_OpenPassword:
=int_Count_OpenPassword+4;
end;
0,5:
begin
g_arr_Table[int_Count_OpenPassword]:
=int_Count_CreatePassword-1;
g_arr_Table[int_Count_OpenPassword
+1]:=int_Count_CreatePassword;
int_Count_CreatePassword:
=int_Count_CreatePassword-2;
int_Count_OpenPassword:
=int_Count_OpenPassword+2;
end;
end;
end;
...{----------------求取每个加密子密钥与相应解密子密钥间的对应关系映射表部分-------------}
end;
...{--------------------------------------------------------------------}


procedureCreateOpenPassword(VARarrOpenPassKey:arrayofint64);
var
int_Loop:integer;
arrTemp:array[
1..52]ofint64;
begin
...{-------------通过调用产生加、解密子密钥对应关系函数产生对应关系表部分------------------}
CreateKeyTable;
...{-------------通过调用求解解密子密钥函数产生解密子密钥部分------------------}
forint_Loop:=1to52do
begin
GetOpenPassword(g_arr_Ten_Password[int_Loop],arrTemp[g_arr_Table[int_Loop]],g_arr_Flag[int_Loop]);
end;
forint_Loop:=1to52do
arrOpenPassKey[int_Loop
-1]:=arrTemp[int_Loop];
...{-------------通过调用求解解密子密钥函数产生解密子密钥部分------------------}
end;
...{--------------------------------------------------------------------}


procedureRiddle(arrPassword:arrayofint64;arrRiddleKey:arrayofint64;VARarrOpenPassword:arrayofint64);
var
Count,i:integer;
V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,C1,C2,C3,C4,ExChange:int64;
P:array[
1..4]ofint64;
begin
...{------------------------数据"解密"算法实现部分------------------}
fori:=Low(arrPassword)toHigh(arrPassword)do
P[i
+1]:=arrPassword[i];
Count:
=0;
while(Count48)do
begin
V1:
=ModMul(P[1],arrRiddleKey[Count],1);//相乘1
Inc(Count);
V2:
=ModAdd(P[2],arrRiddleKey[Count]);//相加2
Inc(Count);
V3:
=ModAdd(P[3],arrRiddleKey[Count]);//相加3
Inc(Count);
V4:
=ModMul(P[4],arrRiddleKey[Count],1);//相乘4
Inc(Count);
V5:
=ModXor(V1,V3);//异或5
V6:=ModXor(V2,V4);//异或6
V7:=ModMul(V5,arrRiddleKey[Count],1);//相乘7
Inc(Count);
V8:
=ModAdd(V6,V7);//相加8
V9:=ModMul(V8,arrRiddleKey[Count],1);//相乘9
Inc(Count);
V10:
=ModAdd(V7,V9);//相加10
V11:=ModXor(V1,V9);//异或11
V12:=ModXor(V2,V10);//异或12
V13:=ModXor(V3,V9);//异或13
V14:=ModXor(V4,V10);//异或14
P[1]:=V11;
P[
2]:=V13;//注意:交换中间两个输出结果
P[3]:=V12;//注意:交换中间两个输出结果
P[4]:=V14;
end;
//结束8轮计算
ExChange:=P[2];
P[
2]:=P[3];
P[
3]:=ExChange;//因为最后一轮无需转换,所以必须把P[2],P[3]再次转换回来
C1:=ModMul(P[1],arrRiddleKey[48],1);//相乘1
C2:=ModAdd(P[2],arrRiddleKey[49]);//相加2
C3:=ModAdd(P[3],arrRiddleKey[50]);//相加3
C4:=ModMul(P[4],arrRiddleKey[51],1);//相乘4
...{------------------------数据"解密"算法实现部分------------------}
arrOpenPassword[Low(arrOpenPassword)]:
=C1;
arrOpenPassword[Low(arrOpenPassword)
+1]:=C2;
arrOpenPassword[Low(arrOpenPassword)
+2]:=C3;
arrOpenPassword[Low(arrOpenPassword)
+3]:=C4;
//数据解密成功!
end;
...{--------------------------------------------------------------------}

end.


Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1109321


分享到:
评论

相关推荐

    IDEA数据加密算法实现.rar

    IDEA数据加密算法实现.rar

    在Oracle数据库中实现的IDEA加密算法

    Lai 和Massey 在1992 年进行了改进强化了抗差分分析的能力改称为IDEA 它也是对64bit大小的数据块加密的分组加密算法密钥长度为128位它基于“相异代数群上的混合运算”设计思想算法用硬件和软件实现都很容易且比DES在...

    论文研究-针对IDEA加密算法的差分功耗攻击.pdf

    研究分析国际数据加密算法IDEA的特点,采用差分功耗分析攻击方式进行密钥破解,针对IDEA算法提出一种基于汉明距离的差分功耗攻击方法。该攻击方法是一种典型的加密芯片旁路攻击方式,其理论基础为集成电路中门电路在...

    数据加密算法

    IDEA国际数据加密算法,使用 128 位密钥提供非常强的安全性;其它数据算法包括一些常用编码算法及其与明文(ASCII、Unicode 等)转换等,如 Base64、Quoted Printable、EBCDIC 等。常见的加密和编码算法都已经在.NET...

    组合数据加密算法的研究与实现.pdf

    全性和可霏性、在实现IDEA算法的同时,还改进 并实现了RSA的算法.具体是:1)改进了Miller. Rabin大素数测试算法,大大缩短了测试时间;2)采 用对指数b的二进制数化来实现幂模运算,大大提 高了大整数幂模运算的...

    基于Java实现带图形用户界面的基于数据加密算法的即时聊天系统源码+项目说明+sql数据库.zip

    基于Java实现带图形用户界面的基于数据加密算法的即时聊天系统源码+项目说明+sql数据库.zip 本项目基于 Java 的 Swing 包实现了一个带图形用户界面的基于数据加密算法的即时聊天系统。实现了用户登录及验证、在线...

    IDEA:Java实现的国际数据加密算法

    主意 用Java实现的国际数据加密算法。 项目经过充分测试并使用 TDD 创建。

    Visual C++中调用DLL实现数据加密

    常见的数据加密算法有:DES,IDEA,RSA,ECC,AES,MD5,SHA等。《共享软件加密算法库》是一款针对个人、企业开发共享软件的加密工具,支持Windows平台下各类开发工具:VC、VB、Delphi、PB、VFP等,算法库集成的算法...

    IMAN1超级计算机上并行国际数据加密算法的性能评估-研究论文

    在本文中,并行的国际数据加密算法(IDEA)是安全应用程序之一,它在运行时间,加速和效率方面得到了实现和评估。 并行IDEA已使用消息传递接口(MPI)库实现,结果已使用IMAN1超级计算机进行,其中对不同数据大小...

    操作类(文件读写,XML操作,各种加密解密等)

    4、IDEA(International Data Encryption Algorithm)国际数据加密算法,使用 128 位密钥提供非常强的安全性; 5、RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的,非...

    论文研究-一种基于多模式加密算法的文件保护方案.pdf

    结合对称密码算法中的DES、IDEA、AES和单向散列算法中的MD5、SHA1、SHA256等算法,提出了一种在同一文件内部采用多模式加密的方案,该方案比传统的单一模式加密的方案能更好地保证数据的完整性和安全性。...

    Java毕业设计-基于Misty1算法的加密软件(JAVA)的实现(源代码+论文).rar

    本软件通过实现Misty1算法,为用户提供了一个安全可靠的数据加密工具。项目源码结构清晰,注释详细,便于学习和二次开发。 主要功能包括: 1. 文本文件的加密和解密 2. 图片文件的加密和解密 3. 加密密钥的生成和...

    Java加密与解密的艺术配书源代码

    文件校验209 6.8 小结211 第7章初等数据加密—对称加密算法213 7.1 对称加密算法简述213 7.2 数据加密标准—DES 214 7.3 三重DES—DESede 222 7.4 高级数据加密标准—AES 227 7.5 国际数据加密标准—IDEA 232 7.6 ...

    Java加密与解密的艺术

    文件校验2096.8 小结211第7章初等数据加密—对称加密算法2137.1 对称加密算法简述2137.2 数据加密标准—DES 2147.3 三重DES—DESede 2227.4 高级数据加密标准—AES 2277.5 国际数据加密标准—IDEA 2327.6 基于口令...

    netty实现SSL/TSL双向加密认证示例

    一个netty建立的SSL双向加密的服务器和客户端的简单示例。工程是IDEA创建的,直接导入即可,注意需要依赖的pom文件中的包。需要的证书文件示例也在压缩包内。

    基于IDEA算法的存贮加密系统 (2003年)

    分析了计算机系统存贮信息的内部漏洞和外部威胁,针对存贮数据的范围和特点,结合分组密码的杰出代表IDEA设计了一个存贮加密系统,分析表明,此系统具有强大的安全性、可供选择的密钥管理、良好的实时性和可易实现性...

    PGP实验报告.doc

    它的涉及到技术包括对称加密算法,非对称加密算法,hash函数,数字签名 " "等主要技术,将这几种技术进行有效整合在一起来实现网络数据安全是非常重 " "要的网络安全实践内容。本实验的目的是综合应用这几个技术来...

    保密通信在电子应急系统中的应用及设计

    在电子应急系统中,结合加密算法的优缺点,提出一种EIGamal公钥加密算法,并提出一种IDEA私钥加密算法,做好长消息以及短消息的有效性加密,结合保密通信的一种加密算法实现过程。结果表明,完成了数据的安全通信。

Global site tag (gtag.js) - Google Analytics