分享
 
 
 

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

王朝other·作者佚名  2007-09-15
窄屏简体版  字體: |||超大  

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

作者:成晓旭

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

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.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有