<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 : 00 1个晚上>
*
*开发环境: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;
en
* IDEA数据加密算法1.0版本
* 开发作者:成晓旭
* 项目简述:IDEA数据加密算法1.0版本
* 启动时间:2000年05月08日
* 完成时间:2000年01月14日 20 : 09 : 00 1个晚上>
*
*开发环境: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;
en