自己獨立設計的字符串加密算法

自己獨立設計的字符串加密算法

作者:成曉旭

這是本人自行設計的第一個數據加密算法,當初是想設計成分組的對稱加密算法,但後來工作一忙,就沒有實現,就草草完成便開始應用起來了。但是目前的混淆度已經能夠滿足絕大多數的簡單加密應用。

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.

王朝网络

 
怎樣設計好自己的加密軟件
加密數據最重要的是密匙的設計而並不是算法的細節,一個好的加密程序的安全性應只與它的密匙有關,而與它的算法無關,但話又說回,如果算法不好,這將會給破譯者制造很多機會。由于密匙的設計要涉及到許多深奧的數學...查看完整版>>怎樣設計好自己的加密軟件
 
oracle用存儲過程加密一段字符串(3des算法)
create or replace package PG_ENCRYPT_DECRYPTisiKey varchar2(8):='Oracle9i';function GEN_RAW_KEY ( iKey in varchar2) return raw;function DECRYPT_3KEY_MODE(iValue in raw,iMode in pls_integer)return var...查看完整版>>oracle用存儲過程加密一段字符串(3des算法)
 
Soso何時才能真正獨立擁有自己的算法
  我在幾個站長論壇發了“被百度K掉的網站,還能從soso帶來IP嗎”的調查帖,看到調查結果後,真的對soso感到很失望。  我的網站先前因爲關閉三天,被百度降排名,沒來什麽流量,soso也跟著百度不來流量...查看完整版>>Soso何時才能真正獨立擁有自己的算法
 
利用高級Java、算法、三角學、分布計算設計自己的智能機器人
利用高級Java、算法、三角學、分布計算設計自己的智能機器人--(重錘痛擊續2) 英文原文 Robocode 中華聯盟用高級機器人和小組玩法超越基礎 我們通過全面的了解高級機器人的構造和小組玩法,准備深入Robocode領...查看完整版>>利用高級Java、算法、三角學、分布計算設計自己的智能機器人
 
C#可逆加密算法收集
最近要用到這個順帶收集下 以下是關于對稱加密算法的C#實現代碼,大家可以根據需要更改不同的算法,文中以Rijndael算法爲例:view plaincopy to clipboardprint?using System; using System.IO; using System.S...查看完整版>>C#可逆加密算法收集