字符串加密

转载 2007年09月26日 16:25:00
自己独立设计的字符串加密算法
 作者:成晓旭
这是本人自行设计的第一个数据加密算法,当初是想设计成分组的对称加密算法,但后来工作一忙,就没有实现,就草草完成便开始应用起来了。但是目前的混淆度已经能够满足绝大多数的简单加密应用。
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;
  
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.
 

字符串的加密解密

  • 2017年11月28日 17:32
  • 26.95MB
  • 下载

C#实现字符串SHA-256加密算法

  • 2017年11月16日 12:53
  • 93KB
  • 下载

字符串内存理解和js加密解密与java后端解密对应方法

第一、字符串内存理解      1、容量大小计算 1byte=8bit  1k=1024byte 1m=1024k 1g=1024m 1t=1024g     2、java字符串中使用getByt...

PB字符串加密、解密函数

  • 2015年11月29日 13:43
  • 971B
  • 下载

c语言实现对密码(字符串)进行加密,并解密

/**习惯把密码明文存在本地文件中,这个小程序可以把存的密码以密文形式保存**/ #include #include #include #include int chartoasc(char ...

MD5加密字符串

  • 2017年10月20日 11:04
  • 199KB
  • 下载

字符串加密解密

  • 2014年11月27日 16:02
  • 5KB
  • 下载

IOS安全-- 字符串加密那点小事

一个IOS的ipa包被反编译后,其中已初始化的字符串都是完整可见的。 针对于iOS的Mach-O二进制通常可获得以下几种字符串信息: 1、资源文件名  2、可见的函数符号名  3、SQL语句  4、...
  • jaccty
  • jaccty
  • 2016年09月08日 15:40
  • 1263

MD5加密文件和字符串

  • 2014年02月17日 23:09
  • 5.68MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串加密
举报原因:
原因补充:

(最多只允许输入30个字)