分享
 
 
 

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

王朝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- 王朝網路 版權所有