自己独立设计的字符串加密算法
这是本人自行设计的第一个数据加密算法,当初是想设计成分组的对称加密算法,但后来工作一忙,就没有实现,就草草完成便开始应用起来了。但是目前的混淆度已经能够满足绝大多数的简单加密应用。
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
//              E-Main:  CXXSoft@sohu.com //              产品版本:1.0版
//              产品版本:1.0版 //              版权所有:成晓旭
//              版权所有:成晓旭 //              备注:    任何人使用此类时,请保留此段自述文件,谢谢!
//              备注:    任何人使用此类时,请保留此段自述文件,谢谢! //              单元文件:unSecurity.pas
//              单元文件:unSecurity.pas //              单元说明:算法类TCXXStrSecurity的定义及实现
//              单元说明:算法类TCXXStrSecurity的定义及实现 //              开发时间:2004-12-25
//              开发时间:2004-12-25 //                       设计本加、解密算法,并用原型程序测试、实现
//                       设计本加、解密算法,并用原型程序测试、实现  //              修改时间:2005-01-15
//              修改时间:2005-01-15 //                       增加加、解密返回、输入串码制属性更新功能
//                       增加加、解密返回、输入串码制属性更新功能 //------------------------------------------------------------------------------
//------------------------------------------------------------------------------ unit unSecurity;
unit unSecurity;
 interface
interface uses
uses SysUtils;
  SysUtils; type
type TCXXStrSecurity = class
  TCXXStrSecurity = class private
  private //本算法的加密最终结果标志(true:字节码串/false:字符串)
    //本算法的加密最终结果标志(true:字节码串/false:字符串) isByteResult:boolean;
    isByteResult:boolean; //本算法的字符串长度位数目(16制式)
    //本算法的字符串长度位数目(16制式) lenStrWidth:Byte;
    lenStrWidth:Byte; //本算法要求的最小模糊字符串
    //本算法要求的最小模糊字符串 minTextLen:Word;
    minTextLen:Word; //本算法处理的最大串长度
    //本算法处理的最大串长度 maxStrLen:Word;
    maxStrLen:Word; //本算法的串移位位数
    //本算法的串移位位数 bitStrMoved:Byte;
    bitStrMoved:Byte; //根据本算法的处理规则,以加密前明文进行串调整
    //根据本算法的处理规则,以加密前明文进行串调整 function TransFillText(const strText:string):string;
    function TransFillText(const strText:string):string; //根据本算法的处理规则,以加密后密文进行串调整
    //根据本算法的处理规则,以加密后密文进行串调整 function ReTransFillText(const strText:string; const mvSize: Byte):string;
    function ReTransFillText(const strText:string; const mvSize: Byte):string; //将字符串转换成Ascii码串的方法
    //将字符串转换成Ascii码串的方法 function TransStringToNumber(const strText:string):string;
    function TransStringToNumber(const strText:string):string; //将一个字节的前后两个半字节互换的方法
    //将一个字节的前后两个半字节互换的方法 function ChangeNumber(const byt:Byte):Byte;
    function ChangeNumber(const byt:Byte):Byte; //将字符串循环移动的方法(左移/右移)
    //将字符串循环移动的方法(左移/右移) function MoveTextByCircle(const strText:string;const mvSize:Byte;const isFromHead:boolean):string;
    function MoveTextByCircle(const strText:string;const mvSize:Byte;const isFromHead:boolean):string; //将字符串内每个字节的前后两个半字节互换的方法
    //将字符串内每个字节的前后两个半字节互换的方法 function ExChangeNumber(const strText:string):string;
    function ExChangeNumber(const strText:string):string; //将字符串进行前后倒置的方法
    //将字符串进行前后倒置的方法 function RevertString(const strText:string):string;
    function RevertString(const strText:string):string; //将字符串的相邻两位进行调换的方法
    //将字符串的相邻两位进行调换的方法 function TransOneByte(const strText:string):string;
    function TransOneByte(const strText:string):string; //将Ascii码串转换后常规字符串的方法
    //将Ascii码串转换后常规字符串的方法 function TransNumberToString(const strText:string):string;
    function TransNumberToString(const strText:string):string; //将字符串进行位异或处理方法
    //将字符串进行位异或处理方法 function XORString(const strText:string):string;
    function XORString(const strText:string):string; public
  public //本算法的加、解密处理成功标志(true:成功,否则:失败)
    //本算法的加、解密处理成功标志(true:成功,否则:失败) isOK:boolean;
    isOK:boolean; //本算法的处理过程消息
    //本算法的处理过程消息 Msg:string;
    Msg:string; constructor Create(const isReturnByte:boolean);
    constructor Create(const isReturnByte:boolean); //字符串加密方法
    //字符串加密方法 function EncodeString(const strText:string):string;overload;
    function EncodeString(const strText:string):string;overload; //字符串加密方法
    //字符串加密方法 function EncodeString(const strText:string;const isByteStr:boolean):string;overload;
    function EncodeString(const strText:string;const isByteStr:boolean):string;overload; //字符串解密方法
    //字符串解密方法 function DecodeString(const strPassword:string):string;overload;
    function DecodeString(const strPassword:string):string;overload; //字符串解密方法
    //字符串解密方法 function DecodeString(const strPassword:string;const isByteStr:boolean):string;overload;
    function DecodeString(const strPassword:string;const isByteStr:boolean):string;overload; end;
end; implementation
implementation
 { TCXXStrSecurity }
{ TCXXStrSecurity }
 function TCXXStrSecurity.ChangeNumber(const byt: Byte): Byte;
function TCXXStrSecurity.ChangeNumber(const byt: Byte): Byte; begin
begin Result := (byt mod 16) * 16 + (byt div 16);
  Result := (byt mod 16) * 16 + (byt div 16); end;
end;
 constructor TCXXStrSecurity.Create(const isReturnByte:boolean);
constructor TCXXStrSecurity.Create(const isReturnByte:boolean); const
const default_MoveBit = 5;
  default_MoveBit = 5; begin
begin minTextLen := 6;
  minTextLen := 6; lenStrWidth := 2;
  lenStrWidth := 2; maxStrLen := 255;
  maxStrLen := 255; bitStrMoved := 5;
  bitStrMoved := 5; isByteResult := isReturnByte;
  isByteResult := isReturnByte; end;
end;
 function TCXXStrSecurity.EncodeString(const strText: string): string;
function TCXXStrSecurity.EncodeString(const strText: string): string; var
var str:string;
  str:string; begin
begin str := '';
  str := ''; str := TransFillText(strText);
  str := TransFillText(strText); str := XORString(str);
  str := XORString(str); str := RevertString(str);
  str := RevertString(str); str := TransOneByte(str);
  str := TransOneByte(str); str := TransStringToNumber(str);
  str := TransStringToNumber(str); str := ExChangeNumber(str);
  str := ExChangeNumber(str); str := MoveTextByCircle(str,bitStrMoved,true);
  str := MoveTextByCircle(str,bitStrMoved,true); if NOT isByteResult then
  if NOT isByteResult then str := TransNumberToString(str);
    str := TransNumberToString(str); Result := str;
  Result := str; end;
end;
 function TCXXStrSecurity.ExChangeNumber(const strText: string): string;
function TCXXStrSecurity.ExChangeNumber(const strText: string): string; var
var len,i:Word;
  len,i:Word; begin
begin len := Length(strText);
  len := Length(strText); for i := 0 to len div 2 - 1 do
  for i := 0 to len div 2 - 1 do begin
  begin Result := Result + IntToHex(ChangeNumber(StrToInt('$'+Copy(strText,i*2+1,2))),2);
    Result := Result + IntToHex(ChangeNumber(StrToInt('$'+Copy(strText,i*2+1,2))),2); end;
  end; end;
end;
 function TCXXStrSecurity.MoveTextByCircle(const strText: string;
function TCXXStrSecurity.MoveTextByCircle(const strText: string; const mvSize: Byte; const isFromHead: boolean): string;
  const mvSize: Byte; const isFromHead: boolean): string; var
var len:Word;
  len:Word; begin
begin len := Length(strText);
  len := Length(strText); if isFromHead then
  if isFromHead then Result := Copy(strText,mvSize+1,len-mvSize) + Copy(strText,1,mvSize)
    Result := Copy(strText,mvSize+1,len-mvSize) + Copy(strText,1,mvSize) else
  else Result := Copy(strText,len-mvSize+1,mvSize) + Copy(strText,1,len-mvSize);
    Result := Copy(strText,len-mvSize+1,mvSize) + Copy(strText,1,len-mvSize); end;
end;
 function TCXXStrSecurity.DecodeString(const strPassword: string): string;
function TCXXStrSecurity.DecodeString(const strPassword: string): string; var
var str:string;
  str:string; begin
begin str := strPassword;
  str := strPassword; if NOT isByteResult then
  if NOT isByteResult then str := TransStringToNumber(str);
    str := TransStringToNumber(str); str := MoveTextByCircle(str,bitStrMoved,false);
  str := MoveTextByCircle(str,bitStrMoved,false); str := ExChangeNumber(str);
  str := ExChangeNumber(str); str := TransNumberToString(str);
  str := TransNumberToString(str); str := TransOneByte(str);
  str := TransOneByte(str); str := RevertString(str);
  str := RevertString(str); str := XORString(str);
  str := XORString(str); str := ReTransFillText(str,bitStrMoved);
  str := ReTransFillText(str,bitStrMoved); Result := str;
  Result := str; end;
end;
 function TCXXStrSecurity.ReTransFillText(const strText: string; const mvSize: Byte): string;
function TCXXStrSecurity.ReTransFillText(const strText: string; const mvSize: Byte): string; var
var len:Word;
  len:Word; begin
begin len := StrToInt('$'+Copy(strText,1,lenStrWidth));
  len := StrToInt('$'+Copy(strText,1,lenStrWidth)); Result := Copy(strText,lenStrWidth+1,len);
  Result := Copy(strText,lenStrWidth+1,len); end;
end;
 function TCXXStrSecurity.RevertString(const strText: string): string;
function TCXXStrSecurity.RevertString(const strText: string): string; var
var i,len:word;
  i,len:word; t:char;
  t:char; pch:PChar;
  pch:PChar; begin
begin pch := PChar(strText);
  pch := PChar(strText); len := Length(strText);
  len := Length(strText); for i := 0 to len div 2 -1 do
  for i := 0 to len div 2 -1 do begin
  begin //ChangeChar(pch[i],pch[len-1-i]);
    //ChangeChar(pch[i],pch[len-1-i]); t := pch[i];
    t := pch[i]; pch[i] := pch[len-1-i];
    pch[i] := pch[len-1-i]; pch[len-1-i] := t;
    pch[len-1-i] := t; end;
  end; Result := String(pch);
  Result := String(pch); end;
end;
 function TCXXStrSecurity.TransFillText(const strText: string): string;
function TCXXStrSecurity.TransFillText(const strText: string): string; var
var i,oLen:Word;
  i,oLen:Word; str,strPower:string;
  str,strPower:string; begin
begin strPower := FormatDateTime('HHMMSS',Now());
  strPower := FormatDateTime('HHMMSS',Now()); //strPower := RevertString(strPower);
  //strPower := RevertString(strPower); //strPower := TransOneByte(strPower);
  //strPower := TransOneByte(strPower); str := strText;
  str := strText; oLen := Length(str);
  oLen := Length(str); i := 1;
  i := 1; while(Length(str) < minTextLen) do
  while(Length(str) < minTextLen) do begin
  begin str := str + strPower[i];
    str := str + strPower[i]; Inc(i);
    Inc(i); end;
  end; Result := IntToHex(oLen,lenStrWidth)+str;
  Result := IntToHex(oLen,lenStrWidth)+str; end;
end;
 function TCXXStrSecurity.TransNumberToString(const strText: string): string;
function TCXXStrSecurity.TransNumberToString(const strText: string): string; var
var i:word;
  i:word; begin
begin Result := '';
  Result := ''; for i := 0 to Length(strText) div 2 - 1 do
  for i := 0 to Length(strText) div 2 - 1 do begin
  begin Result := Result +CHR(StrToInt('$'+Copy(strText,i*2+1,2)));
      Result := Result +CHR(StrToInt('$'+Copy(strText,i*2+1,2))); end;
  end; end;
end;
 function TCXXStrSecurity.TransOneByte(const strText: string): string;
function TCXXStrSecurity.TransOneByte(const strText: string): string; var
var i,len:word;
  i,len:word; t:char;
  t:char; pch:PChar;
  pch:PChar; begin
begin pch := PChar(strText);
  pch := PChar(strText); len := Length(strText);
  len := Length(strText); for i := 0 to len div 2 - 1 do
  for i := 0 to len div 2 - 1 do begin
  begin t := pch[2*i];
    t := pch[2*i]; pch[2*i] := pch[2*i+1];
    pch[2*i] := pch[2*i+1]; pch[2*i+1] := t;
    pch[2*i+1] := t; end;
  end; Result := String(pch);
  Result := String(pch); end;
end;
 function TCXXStrSecurity.TransStringToNumber(const strText: string): string;
function TCXXStrSecurity.TransStringToNumber(const strText: string): string; var
var len,i:Word;
  len,i:Word; str:string;
  str:string; begin
begin len := Length(strText);
  len := Length(strText); str := '';
  str := ''; for i := 1 to len  do
  for i := 1 to len  do begin
  begin str := str + IntToHex(Ord(strText[i]),2);
    str := str + IntToHex(Ord(strText[i]),2); end;
  end; Result := str;
  Result := str; end;
end;
 function TCXXStrSecurity.XORString(const strText: string): string;
function TCXXStrSecurity.XORString(const strText: string): string; var
var len,k:word;
  len,k:word; b:Byte;
  b:Byte; begin
begin Result := '';
  Result := ''; len := Length(strText);
  len := Length(strText); for k := 1 to len do
  for k := 1 to len do begin
  begin b := Ord(strText[k]);
    b := Ord(strText[k]); if k mod 2 =0 then
    if k mod 2 =0 then b := b xor k
      b := b xor k else
    else b := b xor (len-k);
      b := b xor (len-k); Result := Result + CHR(b);
    Result := Result + CHR(b); end;
  end; end;
end;
 function TCXXStrSecurity.DecodeString(const strPassword: string;
function TCXXStrSecurity.DecodeString(const strPassword: string; const isByteStr: boolean): string;
  const isByteStr: boolean): string; begin
begin isByteResult := isByteStr;
  isByteResult := isByteStr; Result := DecodeString(strPassword);
  Result := DecodeString(strPassword); end;
end;
 function TCXXStrSecurity.EncodeString(const strText: string;
function TCXXStrSecurity.EncodeString(const strText: string; const isByteStr: boolean): string;
  const isByteStr: boolean): string; begin
begin isByteResult := isByteStr;
  isByteResult := isByteStr; Result := EncodeString(strText);
  Result := EncodeString(strText); end;
end;
 end.
end.
5、 应用适应器源码:
 //------------------------------------------------------------------------------
//------------------------------------------------------------------------------ //
// //              产品名称:自有版权的字符串加密算法
//              产品名称:自有版权的字符串加密算法 //              产品简介:将字符串按自行独立设计的加密算法进行加、解密处理
//              产品简介:将字符串按自行独立设计的加密算法进行加、解密处理 //              产品作者:成晓旭
//              产品作者:成晓旭 //              E-Main:  CXXSoft@sohu.com
//              E-Main:  CXXSoft@sohu.com //              产品版本:1.0版
//              产品版本:1.0版 //              版权所有:成晓旭
//              版权所有:成晓旭 //              备注:    任何人使用此类时,请保留此段自述文件,谢谢!
//              备注:    任何人使用此类时,请保留此段自述文件,谢谢! //              单元文件:unSecurityAdapter.pas
//              单元文件:unSecurityAdapter.pas //              单元说明:算法接口类TCXXStrSecurity的定义及实现
//              单元说明:算法接口类TCXXStrSecurity的定义及实现 //              开发时间:2006-06-27
//              开发时间:2006-06-27 //                       增加接口类,封闭对算法类的管理细节,以方便客户使用
//                       增加接口类,封闭对算法类的管理细节,以方便客户使用  //------------------------------------------------------------------------------
//------------------------------------------------------------------------------ unit unSecurityAdapter;
unit unSecurityAdapter;
 interface
interface
 uses
uses unSecurity;
  unSecurity;
 type
type TSecurityAdapter = class
  TSecurityAdapter = class private
  private public
  public //字符串加密方法
    //字符串加密方法 class function EncodeString(const strText:string):string;
    class function EncodeString(const strText:string):string; //字符串解密方法
    //字符串解密方法 class function DecodeString(const strPassword:string):string;
    class function DecodeString(const strPassword:string):string; end;
  end; 
   implementation
implementation
 var
var security:TCXXStrSecurity;
  security:TCXXStrSecurity;
 { TSecurityAdapter }
{ TSecurityAdapter }
 class function TSecurityAdapter.DecodeString(
class function TSecurityAdapter.DecodeString( const strPassword: string): string;
  const strPassword: string): string; begin
begin Result := '';
  Result := ''; if Assigned(security) then
  if Assigned(security) then Result := security.DecodeString(strPassword,true);
    Result := security.DecodeString(strPassword,true); end;
end;
 class function TSecurityAdapter.EncodeString(const strText: string): string;
class function TSecurityAdapter.EncodeString(const strText: string): string; begin
begin Result := '';
  Result := ''; if Assigned(security) then
  if Assigned(security) then Result := security.EncodeString(strText,true);
    Result := security.EncodeString(strText,true); end;
end;
 initialization
initialization security := TCXXStrSecurity.Create(false);
  security := TCXXStrSecurity.Create(false); finalization
finalization security.Free();
  security.Free(); security := nil;
  security := nil; end.
end.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1109356
 
                     
                    
                 
                    
                 
        
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号