自己独立设计的字符串加密算法
作者:成晓旭
这是本人自行设计的第一个数据加密算法,当初是想设计成分组的对称加密算法,但后来工作一忙,就没有实现,就草草完成便开始应用起来了。但是目前的混淆度已经能够满足绝大多数的简单加密应用。
1、 简介:
设计一个算法,对字符串进行加密和解决,要求有一定的混淆度,并且,无须复杂的密钥管理。为简化应用,我将混淆码(类似于密钥)直接混淆存储在加密后密文中。
2、 算法设计:
开始想将此算法设计成分组的对称加密算法,所以在算法的核心处理轮尽可能地选择“对称”的计算方法:比较异或、字节内转换、对称倒。
此算法设计成三大步骤:输入调整,核心加、解密过程,输出调整。
1、 输入调整:就是用混淆码将源串调整成长度为8的整数倍的新串,以作为核心处理过程的输入。
2、 输出调整:就是将通过核心处理过程计算后的结果串,按输出要求进行转换。加密时,就是转换成希望的密文串;解密时,转换成希望的明文串。
3、 核心处理过程:是整个算法的核心过程,主要包括位异或、左右倒置、交换字节、移位等几个子过程。
3.1:位异或:对串的每一个Byte位进行异或运算;
3.2:左右倒置:对串进行镜像对称处理,将串分成前后两部分,完成对换。
3.3:交换字节:对每一个Byte的前、后半字节进行镜像对称倒置。
3.4:移位:对串进行移位处理。
具体的加、解密处理过程如下图所示:
3、 算法点评:
1、 此算法没有实现正在的对称加密算法。只需要对输入、输出调整过程进行优化,并且,重新调整核心处理过程的计算顺序,就可以了。
2、 源码演示的版本有些缺陷:最大处理串长度为255,应该进行优化;并且混淆码过于粗糙,也有待优化;对混淆码的应用不全面,处理之后,混淆码主要集中在密文的部分区段,分布不够均匀,混淆程度也不够充分。
4、 算法源码:
// ------------------------------------------------------------------------------ // // 产品名称:自有版权的字符串加密算法 // 产品简介:将字符串按自行独立设计的加密算法进行加、解密处理 // 产品作者:成晓旭 // E-Main: CXXSoft@sohu.com // 产品版本:1.0版 // 版权所有:成晓旭 // 备注: 任何人使用此类时,请保留此段自述文件,谢谢! // 单元文件:unSecurity.pas // 单元说明:算法类TCXXStrSecurity的定义及实现 // 开发时间:2004-12-25 // 设计本加、解密算法,并用原型程序测试、实现 // 修改时间:2005-01-15 // 增加加、解密返回、输入串码制属性更新功能 // ------------------------------------------------------------------------------ unit unSecurity; interface uses SysUtils;type TCXXStrSecurity = class private // 本算法的加密最终结果标志(true:字节码串/false:字符串) isByteResult: boolean ; // 本算法的字符串长度位数目(16制式) lenStrWidth:Byte; // 本算法要求的最小模糊字符串 minTextLen:Word; // 本算法处理的最大串长度 maxStrLen:Word; // 本算法的串移位位数 bitStrMoved:Byte; // 根据本算法的处理规则,以加密前明文进行串调整 function TransFillText( const strText:string):string; // 根据本算法的处理规则,以加密后密文进行串调整 function ReTransFillText( const strText:string; const mvSize: Byte):string; // 将字符串转换成Ascii码串的方法 function TransStringToNumber( const strText:string):string; // 将一个字节的前后两个半字节互换的方法 function ChangeNumber( const byt:Byte):Byte; // 将字符串循环移动的方法(左移/右移) function MoveTextByCircle( const strText:string; const mvSize:Byte; const isFromHead: boolean ):string; // 将字符串内每个字节的前后两个半字节互换的方法 function ExChangeNumber( const strText:string):string; // 将字符串进行前后倒置的方法 function RevertString( const strText:string):string; // 将字符串的相邻两位进行调换的方法 function TransOneByte( const strText:string):string; // 将Ascii码串转换后常规字符串的方法 function TransNumberToString( const strText:string):string; // 将字符串进行位异或处理方法 function XORString( const strText:string):string; public // 本算法的加、解密处理成功标志(true:成功,否则:失败) isOK: boolean ; // 本算法的处理过程消息 Msg:string; constructor Create( const isReturnByte: boolean ); // 字符串加密方法 function EncodeString( const strText:string):string;overload; // 字符串加密方法 function EncodeString( const strText:string; const isByteStr: boolean ):string;overload; // 字符串解密方法 function DecodeString( const strPassword:string):string;overload; // 字符串解密方法 function DecodeString( const strPassword:string; const isByteStr: boolean ):string;overload;end;implementation ... { TCXXStrSecurity } function TCXXStrSecurity.ChangeNumber( const byt: Byte): Byte;begin Result : = (byt mod 16 ) * 16 + (byt div 16 );end;constructor TCXXStrSecurity.Create( const isReturnByte: boolean ); const default_MoveBit = 5 ;begin minTextLen : = 6 ; lenStrWidth : = 2 ; maxStrLen : = 255 ; bitStrMoved : = 5 ; isByteResult : = isReturnByte;end;function TCXXStrSecurity.EncodeString( const strText: string): string;var str:string;begin str : = '' ; str : = TransFillText(strText); str : = XORString(str); str : = RevertString(str); str : = TransOneByte(str); str : = TransStringToNumber(str); str : = ExChangeNumber(str); str : = MoveTextByCircle(str,bitStrMoved, true ); if NOT isByteResult then str : = TransNumberToString(str); Result : = str;end;function TCXXStrSecurity.ExChangeNumber( const strText: string): string;var len,i:Word;begin len : = Length(strText); for i : = 0 to len div 2 - 1 do begin Result : = Result + IntToHex(ChangeNumber(StrToInt( ' $ ' + Copy(strText,i * 2 + 1 , 2 ))), 2 ); end;end;function TCXXStrSecurity.MoveTextByCircle( const strText: string; const mvSize: Byte; const isFromHead: boolean ): string;var len:Word;begin len : = Length(strText); if isFromHead then Result : = Copy(strText,mvSize + 1 ,len - mvSize) + Copy(strText, 1 ,mvSize) else Result : = Copy(strText,len - mvSize + 1 ,mvSize) + Copy(strText, 1 ,len - mvSize);end;function TCXXStrSecurity.DecodeString( const strPassword: string): string;var str:string;begin str : = strPassword; if NOT isByteResult then str : = TransStringToNumber(str); str : = MoveTextByCircle(str,bitStrMoved, false ); str : = ExChangeNumber(str); str : = TransNumberToString(str); str : = TransOneByte(str); str : = RevertString(str); str : = XORString(str); str : = ReTransFillText(str,bitStrMoved); Result : = str;end;function TCXXStrSecurity.ReTransFillText( const strText: string; const mvSize: Byte): string;var len:Word;begin len : = StrToInt( ' $ ' + Copy(strText, 1 ,lenStrWidth)); Result : = Copy(strText,lenStrWidth + 1 ,len);end;function TCXXStrSecurity.RevertString( const strText: string): string;var i,len:word; t: char ; pch:PChar;begin pch : = PChar(strText); len : = Length(strText); for i : = 0 to len div 2 - 1 do begin // ChangeChar(pch[i],pch[len-1-i]); t : = pch[i]; pch[i] : = pch[len - 1 - i]; pch[len - 1 - i] : = t; end; Result : = String(pch);end;function TCXXStrSecurity.TransFillText( const strText: string): string;var i,oLen:Word; str,strPower:string;begin strPower : = FormatDateTime( ' HHMMSS ' ,Now()); // strPower := RevertString(strPower); // strPower := TransOneByte(strPower); str : = strText; oLen : = Length(str); i : = 1 ; while (Length(str) < minTextLen) do begin str : = str + strPower[i]; Inc(i); end; Result : = IntToHex(oLen,lenStrWidth) + str;end;function TCXXStrSecurity.TransNumberToString( const strText: string): string;var i:word;begin Result : = '' ; for i : = 0 to Length(strText) div 2 - 1 do begin Result : = Result + CHR(StrToInt( ' $ ' + Copy(strText,i * 2 + 1 , 2 ))); end;end;function TCXXStrSecurity.TransOneByte( const strText: string): string;var i,len:word; t: char ; pch:PChar;begin pch : = PChar(strText); len : = Length(strText); for i : = 0 to len div 2 - 1 do begin t : = pch[ 2 * i]; pch[ 2 * i] : = pch[ 2 * i + 1 ]; pch[ 2 * i + 1 ] : = t; end; Result : = String(pch);end;function TCXXStrSecurity.TransStringToNumber( const strText: string): string;var len,i:Word; str:string;begin len : = Length(strText); str : = '' ; for i : = 1 to len do begin str : = str + IntToHex(Ord(strText[i]), 2 ); end; Result : = str;end;function TCXXStrSecurity.XORString( const strText: string): string;var len,k:word; b:Byte;begin Result : = '' ; len : = Length(strText); for k : = 1 to len do begin b : = Ord(strText[k]); if k mod 2 = 0 then b : = b xor k else b : = b xor (len - k); Result : = Result + CHR(b); end;end;function TCXXStrSecurity.DecodeString( const strPassword: string; const isByteStr: boolean ): string;begin isByteResult : = isByteStr; Result : = DecodeString(strPassword);end;function TCXXStrSecurity.EncodeString( const strText: string; const isByteStr: boolean ): string;begin isByteResult : = isByteStr; Result : = EncodeString(strText);end;end.
5、 应用适应器源码:
// ------------------------------------------------------------------------------ // // 产品名称:自有版权的字符串加密算法 // 产品简介:将字符串按自行独立设计的加密算法进行加、解密处理 // 产品作者:成晓旭 // E-Main: CXXSoft@sohu.com // 产品版本:1.0版 // 版权所有:成晓旭 // 备注: 任何人使用此类时,请保留此段自述文件,谢谢! // 单元文件:unSecurityAdapter.pas // 单元说明:算法接口类TCXXStrSecurity的定义及实现 // 开发时间:2006-06-27 // 增加接口类,封闭对算法类的管理细节,以方便客户使用 // ------------------------------------------------------------------------------ unit unSecurityAdapter; interface uses unSecurity;type TSecurityAdapter = class private public // 字符串加密方法 class function EncodeString( const strText: string ): string ; // 字符串解密方法 class function DecodeString( const strPassword: string ): string ; end; implementationvar security:TCXXStrSecurity; ... { TSecurityAdapter } class function TSecurityAdapter.DecodeString( const strPassword: string ): string ;begin Result : = '' ; if Assigned(security) then Result : = security.DecodeString(strPassword, true );end; class function TSecurityAdapter.EncodeString( const strText: string ): string ;begin Result : = '' ; if Assigned(security) then Result : = security.EncodeString(strText, true );end;initialization security : = TCXXStrSecurity.Create( false );finalization security.Free(); security : = nil;end.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1109356