自己独立设计的字符串加密算法
作者:成晓旭
这是本人自行设计的第一个数据加密算法,当初是想设计成分组的对称加密算法,但后来工作一忙,就没有实现,就草草完成便开始应用起来了。但是目前的混淆度已经能够满足绝大多数的简单加密应用。
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.
Trackback: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=1109356