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

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

 作者:成晓旭

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

1、   简介:

设计一个算法,对字符串进行加密和解决,要求有一定的混淆度,并且,无须复杂的密钥管理。为简化应用,我将混淆码(类似于密钥)直接混淆存储在加密后密文中。

2、   算法设计:

开始想将此算法设计成分组的对称加密算法,所以在算法的核心处理轮尽可能地选择“对称”的计算方法:比较异或、字节内转换、对称倒。

此算法设计成三大步骤:输入调整,核心加、解密过程,输出调整。

1、              输入调整:就是用混淆码将源串调整成长度为8的整数倍的新串,以作为核心处理过程的输入。

2、              输出调整:就是将通过核心处理过程计算后的结果串,按输出要求进行转换。加密时,就是转换成希望的密文串;解密时,转换成希望的明文串。

3、              核心处理过程:是整个算法的核心过程,主要包括位异或、左右倒置、交换字节、移位等几个子过程。

3.1:位异或:对串的每一个Byte位进行异或运算;

         3.2:左右倒置:对串进行镜像对称处理,将串分成前后两部分,完成对换。

         3.3:交换字节:对每一个Byte的前、后半字节进行镜像对称倒置。

         3.4:移位:对串进行移位处理。

具体的加、解密处理过程如下图所示:

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

3、   算法点评:

1、   此算法没有实现正在的对称加密算法。只需要对输入、输出调整过程进行优化,并且,重新调整核心处理过程的计算顺序,就可以了。

2、   源码演示的版本有些缺陷:最大处理串长度为255,应该进行优化;并且混淆码过于粗糙,也有待优化;对混淆码的应用不全面,处理之后,混淆码主要集中在密文的部分区段,分布不够均匀,混淆程度也不够充分。

4、   算法源码:

// ------------------------------------------------------------------------------
//
//               产品名称:自有版权的字符串加密算法
//               产品简介:将字符串按自行独立设计的加密算法进行加、解密处理
//               产品作者:成晓旭
//               E-Main:  [email protected]
//               产品版本: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:  [email protected]
//               产品版本: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;
  
implementation

var
  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


你可能感兴趣的:(字符串)