自己独立设计的字符串加密算法

    技术2022-05-11  2

    自己独立设计的字符串加密算法

     作者:成晓旭

    这是本人自行设计的第一个数据加密算法,当初是想设计成分组的对称加密算法,但后来工作一忙,就没有实现,就草草完成便开始应用起来了。但是目前的混淆度已经能够满足绝大多数的简单加密应用。

    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


    最新回复(0)