`
happmaoo
  • 浏览: 4308813 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

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

作者:成晓旭

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

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(conststrText:string):string;
//根据本算法的处理规则,以加密后密文进行串调整
functionReTransFillText(conststrText:string;constmvSize:Byte):string;
//将字符串转换成Ascii码串的方法
functionTransStringToNumber(conststrText:string):string;
//将一个字节的前后两个半字节互换的方法
functionChangeNumber(constbyt:Byte):Byte;
//将字符串循环移动的方法(左移/右移)
functionMoveTextByCircle(conststrText:string;constmvSize:Byte;constisFromHead:boolean):string;
//将字符串内每个字节的前后两个半字节互换的方法
functionExChangeNumber(conststrText:string):string;
//将字符串进行前后倒置的方法
functionRevertString(conststrText:string):string;
//将字符串的相邻两位进行调换的方法
functionTransOneByte(conststrText:string):string;
//将Ascii码串转换后常规字符串的方法
functionTransNumberToString(conststrText:string):string;
//将字符串进行位异或处理方法
functionXORString(conststrText:string):string;
public
//本算法的加、解密处理成功标志(true:成功,否则:失败)
isOK:boolean;
//本算法的处理过程消息
Msg:string;
constructorCreate(
constisReturnByte:boolean);
//字符串加密方法
functionEncodeString(conststrText:string):string;overload;
//字符串加密方法
functionEncodeString(conststrText:string;constisByteStr:boolean):string;overload;
//字符串解密方法
functionDecodeString(conststrPassword:string):string;overload;
//字符串解密方法
functionDecodeString(conststrPassword:string;constisByteStr:boolean):string;overload;
end;
implementation

...{TCXXStrSecurity}

functionTCXXStrSecurity.ChangeNumber(
constbyt:Byte):Byte;
begin
Result:
=(bytmod16)*16+(bytdiv16);
end;

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

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

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

functionTCXXStrSecurity.MoveTextByCircle(
conststrText:string;
constmvSize:Byte;constisFromHead:boolean):string;
var
len:Word;
begin
len:
=Length(strText);
ifisFromHeadthen
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(
conststrPassword:string):string;
var
str:string;
begin
str:
=strPassword;
ifNOTisByteResultthen
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(
conststrText:string;constmvSize:Byte):string;
var
len:Word;
begin
len:
=StrToInt('$'+Copy(strText,1,lenStrWidth));
Result:
=Copy(strText,lenStrWidth+1,len);
end;

functionTCXXStrSecurity.RevertString(
conststrText:string):string;
var
i,len:word;
t:
char;
pch:PChar;
begin
pch:
=PChar(strText);
len:
=Length(strText);
fori:=0tolendiv2-1do
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(
conststrText: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(
conststrText:string):string;
var
i:word;
begin
Result:
='';
fori:=0toLength(strText)div2-1do
begin
Result:
=Result+CHR(StrToInt('$'+Copy(strText,i*2+1,2)));
end;
end;

functionTCXXStrSecurity.TransOneByte(
conststrText:string):string;
var
i,len:word;
t:
char;
pch:PChar;
begin
pch:
=PChar(strText);
len:
=Length(strText);
fori:=0tolendiv2-1do
begin
t:
=pch[2*i];
pch[
2*i]:=pch[2*i+1];
pch[
2*i+1]:=t;
end;
Result:
=String(pch);
end;

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

functionTCXXStrSecurity.XORString(
conststrText:string):string;
var
len,k:word;
b:Byte;
begin
Result:
='';
len:
=Length(strText);
fork:=1tolendo
begin
b:
=Ord(strText[k]);
ifkmod2=0then
b:
=bxork
else
b:
=bxor(len-k);
Result:
=Result+CHR(b);
end;
end;

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

functionTCXXStrSecurity.EncodeString(
conststrText:string;
constisByteStr:boolean):string;
begin
isByteResult:
=isByteStr;
Result:
=EncodeString(strText);
end;

end
分享到:
评论

相关推荐

    一种很实用的加密算法源码

    一般编写的软件为了不能被复制,都需要一定的加密手段,而比较好的加密算法能够解决这个问题,现提高一套加密算法的源码共享

    算法导论中文版

     32.1 朴素字符串匹配算法  32.2 Rabin\Karp算法  32.3 利用有限自动机进行字符串匹配  32.4 Knuth?Morris?Pratt算法  思考题  本章注记 第33章 计算几何学  33.1 线段的性质  33.2 确定任意一对线段...

    算法导论(part2)

    它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例...

    算法导论(part1)

    它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例...

    上海电机学院C语言实训答案

    例:若程序执行时,输入字符串为:Shanghai Dianji University,从键盘上输入字符:s,则输出后变为:Shanghai Dianji Univerity,如果输入的字符串不存在,则字符串照原样输出。 (9)编写一个函数void fun(char a...

    物联网安全_实验9 信息保密性、完整性和不可抵赖性的综合应用.doc

    E-mail兼容性 Radix-64 对E-mail应用提供透明性,采用基数64编码将加密后的消息(二进制流)转换为ASCII字符串 数据分段 - 为了适应最大消息长度限制,PGP执行分段和重新组装 2、PGP的密钥管理 PGP是一种混合密码...

    PHP开发实战1200例源码

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则...

    SuperNotepad

    信息加密算法安全高效,可任意深度加密; 4.右键集合了大多数常用功能,不常用的在"工具"中; 5.主要的特色功能︰ 00) 语音朗读文本 (注:[自定义欢迎词]中可更改欢迎语音; XP下初始只有一个缺省语音引擎,为...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

    java源码包---java 源码 大量 实例

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    达梦数据库_SQL语言手册

    数据类型指定变长字符串,用法类似 数据类型,可以指定一 个不超过的正整数作为字符长度,例如: 。如果未指定长度,缺省为 在系统中, 数据类型的实际最大长度由数据库页面大小决定,具体最 大长度算法如表 的区别...

    java源码包2

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    vc++ 应用源码包_1

    DES加密算法源代码 Detected memory leaks 检查内存泄漏源码 DigiStatic_src 自绘CStatic实现数字效果。 DirectShow开发指南pdf附属代码 DirectShow开发指南源码 directUI_D DirectUI界面库 DOM应用---遍历...

    java源码包3

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    java源码包4

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

Global site tag (gtag.js) - Google Analytics