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

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

作者:成晓旭

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

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
// 增加加、解密返回、输入串码制属性更新功能
// ------------------------------------------------------------------------------
unitunSecurity;

interface
uses
SysUtils;
type
TCXXStrSecurity
= class
private
// 本算法的加密最终结果标志(true:字节码串/false:字符串)
isByteResult: boolean ;
// 本算法的字符串长度位数目(16制式)
lenStrWidth:Byte;
// 本算法要求的最小模糊字符串
minTextLen:Word;
// 本算法处理的最大串长度
maxStrLen:Word;
// 本算法的串移位位数
bitStrMoved:Byte;
// 根据本算法的处理规则,以加密前明文进行串调整
functionTransFillText( const strText:string):string;
// 根据本算法的处理规则,以加密后密文进行串调整
functionReTransFillText( const strText:string; const mvSize:Byte):string;
// 将字符串转换成Ascii码串的方法
functionTransStringToNumber( const strText:string):string;
// 将一个字节的前后两个半字节互换的方法
functionChangeNumber( const byt:Byte):Byte;
// 将字符串循环移动的方法(左移/右移)
functionMoveTextByCircle( const strText:string; const mvSize:Byte; const isFromHead: boolean ):string;
// 将字符串内每个字节的前后两个半字节互换的方法
functionExChangeNumber( const strText:string):string;
// 将字符串进行前后倒置的方法
functionRevertString( const strText:string):string;
// 将字符串的相邻两位进行调换的方法
functionTransOneByte( const strText:string):string;
// 将Ascii码串转换后常规字符串的方法
functionTransNumberToString( const strText:string):string;
// 将字符串进行位异或处理方法
functionXORString( const strText:string):string;
public
// 本算法的加、解密处理成功标志(true:成功,否则:失败)
isOK: boolean ;
// 本算法的处理过程消息
Msg:string;
constructorCreate(
const isReturnByte: boolean );
// 字符串加密方法
functionEncodeString( const strText:string):string;overload;
// 字符串加密方法
functionEncodeString( const strText:string; const isByteStr: boolean ):string;overload;
// 字符串解密方法
functionDecodeString( const strPassword:string):string;overload;
// 字符串解密方法
functionDecodeString( const strPassword:string; const isByteStr: boolean ):string;overload;
end;
implementation

... {TCXXStrSecurity}

functionTCXXStrSecurity.ChangeNumber(
const byt:Byte):Byte;
begin
Result:
= (bytmod 16 ) * 16 + (bytdiv 16 );
end;

constructorTCXXStrSecurity.Create(
const isReturnByte: boolean );
const
default_MoveBit
= 5 ;
begin
minTextLen:
= 6 ;
lenStrWidth:
= 2 ;
maxStrLen:
= 255 ;
bitStrMoved:
= 5 ;
isByteResult:
= isReturnByte;
end;

functionTCXXStrSecurity.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 NOTisByteResultthen
str:
= TransNumberToString(str);
Result:
= str;
end;

functionTCXXStrSecurity.ExChangeNumber(
const strText:string):string;
var
len,i:Word;
begin
len:
= Length(strText);
for i: = 0 tolendiv 2 - 1 do
begin
Result:
= Result + IntToHex(ChangeNumber(StrToInt( ' $ ' + Copy(strText,i * 2 + 1 , 2 ))), 2 );
end;
end;

functionTCXXStrSecurity.MoveTextByCircle(
const strText:string;
const mvSize:Byte; const isFromHead: boolean ):string;
var
len:Word;
begin
len:
= Length(strText);
if isFromHeadthen
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;

functionTCXXStrSecurity.DecodeString(
const strPassword:string):string;
var
str:string;
begin
str:
= strPassword;
if NOTisByteResultthen
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;

functionTCXXStrSecurity.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;

functionTCXXStrSecurity.RevertString(
const strText:string):string;
var
i,len:word;
t:
char ;
pch:PChar;
begin
pch:
= PChar(strText);
len:
= Length(strText);
for i: = 0 tolendiv 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;

functionTCXXStrSecurity.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;

functionTCXXStrSecurity.TransNumberToString(
const strText:string):string;
var
i:word;
begin
Result:
= '' ;
for i: = 0 toLength(strText)div 2 - 1 do
begin
Result:
= Result + CHR(StrToInt( ' $ ' + Copy(strText,i * 2 + 1 , 2 )));
end;
end;

functionTCXXStrSecurity.TransOneByte(
const strText:string):string;
var
i,len:word;
t:
char ;
pch:PChar;
begin
pch:
= PChar(strText);
len:
= Length(strText);
for i: = 0 tolendiv 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;

functionTCXXStrSecurity.TransStringToNumber(
const strText:string):string;
var
len,i:Word;
str:string;
begin
len:
= Length(strText);
str:
= '' ;
for i: = 1 tolen do
begin
str:
= str + IntToHex(Ord(strText[i]), 2 );
end;
Result:
= str;
end;

functionTCXXStrSecurity.XORString(
const strText:string):string;
var
len,k:word;
b:Byte;
begin
Result:
= '' ;
len:
= Length(strText);
for k: = 1 tolen do
begin
b:
= Ord(strText[k]);
if kmod 2 = 0 then
b:
= bxork
else
b:
= bxor(len - k);
Result:
= Result + CHR(b);
end;
end;

functionTCXXStrSecurity.DecodeString(
const strPassword:string;
const isByteStr: boolean ):string;
begin
isByteResult:
= isByteStr;
Result:
= DecodeString(strPassword);
end;

functionTCXXStrSecurity.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
// 增加接口类,封闭对算法类的管理细节,以方便客户使用
// ------------------------------------------------------------------------------
unitunSecurityAdapter;

interface

uses
unSecurity;

type
TSecurityAdapter
= class
private
public
// 字符串加密方法
class functionEncodeString( const strText: string ): string ;
// 字符串解密方法
class functionDecodeString( const strPassword: string ): string ;
end;

implementation

var
security:TCXXStrSecurity;

... {TSecurityAdapter}

class functionTSecurityAdapter.DecodeString(
const strPassword: string ): string ;
begin
Result:
= '' ;
if Assigned(security)then
Result:
= security.DecodeString(strPassword, true );
end;

class functionTSecurityAdapter.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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值