這個(gè)加密類很容易實(shí)現(xiàn)和使用。如果你需要加密字符串,如密碼、汽車牌號(hào)等,就可以使用這個(gè)個(gè)快捷、簡單、安全的方式。只要不暴露加密 KEY, 就會(huì)很安全。建議KEY 的長度最少為 12 個(gè)包含大小寫的字符。
使用代碼
首先下載源代碼,將其中的類插入你的命名空間。然后你可以初始化類的對(duì)象。
加密
以下代碼塊是如何使用 key 變量YourEncryptionKey 加密字符串變量 YourTextString 的簡單例子。
M2encryption.Key = YourEncryptionKey;M2encryption objEncrypt = new M2encryption();objEncrypt.ClearTekst = YourTextString; objEncrypt.Encrypt(); if (objEncrypt.errorState != -2) { MessageBox.Show(objEncrypt.EncryptedTekst);}
在做進(jìn)一步處理前檢查屬性 objEncrypt.errorState 有無錯(cuò)誤
errorState-1:
這意味著加密的文本包含 ASCII 以外的字符。在加密前,這些字符被更改為 "?"
errorState-2:
沒有提供加密 key。加密過程會(huì)中斷。
解密:
M2encryption.Key = YourEncryptionKey;M2encryption objEncrypt = new M2encryption();objEncrypt.EncryptedTekst = YourTextString; objEncrypt.Decrypt(); if (objEncrypt.errorState != -2) { MessageBox.Show(objEncrypt.ClearTekst);}
隨機(jī)化
將屬性 Randomization 設(shè)置為 true,運(yùn)行多次,同一個(gè)加密key 和平面文本會(huì)產(chǎn)生不同的加密文本
M2encryption.Randomization = true;
快捷模式
設(shè)置為Fastmode 模式會(huì)讓加密/解密快捷,但是安全性會(huì)降低。如果你要加密小字符串,不應(yīng)該啟用該模式。如果加密很大的文件,可以。
注意,解密和加密的模式應(yīng)該相同。
M2encryption.Fastmode = true;
算法的內(nèi)部工作原理
外部循環(huán)和內(nèi)部循環(huán)
算法包含外部和內(nèi)部循環(huán)。外部循環(huán)迭代次數(shù),內(nèi)部循環(huán)迭代平面文本中每個(gè)字符。
自變異內(nèi)部和外部 key
自變異內(nèi)部key
此 key 在內(nèi)部加密流程中使用。key 中每個(gè)字母都喲牛股加密平面文本中對(duì)應(yīng)的位置。當(dāng) key 的字符串結(jié)束后,該流程會(huì)使用自變異的key 版本繼續(xù)進(jìn)行,直至所有平面文本都加密完??磮D1 說明。子變異的內(nèi)部 key 標(biāo)記為藍(lán)色。
Fig1. 上述的key永遠(yuǎn)不會(huì)重復(fù)
自變異外部 key
用戶輸入key 后,自變異的外部key 會(huì)初始化。該key會(huì)用于外部循環(huán)并在每次開始自改變。該key的目的是為每輪生成唯一的映射矩陣并在這些輪中初始化自變異內(nèi)部key。映射數(shù)組在內(nèi)部循環(huán)中的加密流程中使用。
6 輪迭代的key 自變化的例子:
函數(shù) shuffleArr() 將自變異key作為輸入。根據(jù)key, 它會(huì)在 arrayint[] 中得出類似隨機(jī)順序的映射數(shù)字。函數(shù)每次調(diào)用,key 就會(huì)自變異,從而創(chuàng)建出新的唯一映射數(shù)組。
函數(shù) shuffleArr():
private void shuffleArr(int state){ int keyStep = 0; byte keyChar; bool emptyFound; int retning = 1; long refIndex = 1; double floatValue; int intPart; double fraPart; mutKey_o = selfMutateKey(mutKey_o, 3, state,1); for (int i = 0; i < 95; i++) map[i] = 0; //nulstil arr for (int i = 1; i < 96; i++) { if (retning == 1) retning = 0; else retning = 1; //h?ndter key if (keyStep > mutKey_o.Length - 1) keyStep = 0; keyChar = (byte)mutKey_o[keyStep]; refIndex = i + (int)keyChar; if (refIndex > 95) { if (refIndex - 95 <= 95) refIndex = refIndex - 95; else { floatValue = refIndex / 95.0; intPart = (int)floatValue; fraPart = floatValue - intPart; if (fraPart == 0.0) fraPart = 1.0; refIndex = Convert.ToInt32(95 * fraPart); } } refIndex--; //pga arr 0- 94 if (map[refIndex] == 0) map[refIndex] = i; else { emptyFound = false; do { if (retning == 1) { refIndex++; if (refIndex > 94) refIndex = 0; if (map[refIndex] == 0) { map[refIndex] = i; emptyFound = true; } } else { refIndex--; if (refIndex < 0) refIndex = 94; if (map[refIndex] == 0) { map[refIndex] = i; emptyFound = true; } } } while (emptyFound == false); } keyStep++; } for (int i = 0; i < 95; i++) { for (int k = 0; k < 95; k++) { if (map[k] == i + 1) { mapRev[i] = (k + 1); break; } } } }
內(nèi)循環(huán)加密流程
Step 1:
整個(gè)文本都需要經(jīng)過函數(shù) chainChangeChars() 處理
文本會(huì)被從頭到尾來回掃描,文本中每個(gè)字母都根據(jù)左邊的相鄰字符(在回來的時(shí)候根據(jù)右邊的相鄰字母)更改。如果一個(gè)字母更改,每個(gè)單獨(dú)的字母也會(huì)隨之更改。每個(gè)更改的字符會(huì)跟映射 arrayint[] 圖重新映射。
這是我解決問題的公式:
示例文本 "ABCD"
A 是 B 的左邊相鄰字母
在相反的流程中
然后重新映射:
Y = map[X]
最后:
B 被替換為 Y
文本成為 "AYCD" (其中 Y 是個(gè)持有真正字母的變量)
原先的 B現(xiàn)在存儲(chǔ)在 Y 內(nèi)??梢酝ㄟ^ Y 和 A 還原
Step 2:
這個(gè)步驟是個(gè)流程的開始,會(huì)根據(jù)自變異的內(nèi)部key 更改文本中每個(gè)字母,如圖一所示。
首先生成一個(gè)種子。對(duì)于每個(gè)要更改的字母,下個(gè)文本的十進(jìn)位 ascii 值會(huì)在 variabelseedC 中累計(jì)??吹谝恍写a:
seedC = seedC + (byte)Convert.ToChar(key[keyIndexC]);keyIndexC++; if (keyIndexC > lenKey - 1){ keyIndexC = 0; mutKey_i = selfMutateKey(key,2,1,2);}
Step 3:
生成引用索引號(hào).
步驟 2 中的種子現(xiàn)在用作函數(shù) createRefIndex() 的輸入
在這個(gè)函數(shù)中,種子經(jīng)過這個(gè)公式:
種子除以 95
將小數(shù)的整數(shù)部分更改為 0
結(jié)果乘以 95
代碼如下:
refIndex = seed; if (refIndex > 95){ if (refIndex - 95 <= 95) refIndex = refIndex - 95; else { floatValue = refIndex / 95.0; intPart = (int)floatValue; fraPart = floatValue - intPart; if (fraPart == 0.0) fraPart = 1.0; refIndex = Convert.ToInt32(95 * fraPart); }}
得到的 refIndex 將總是一個(gè) [1 - 95] 的整數(shù)。
Step 4:
在最后一個(gè)步驟中,字符更改為加密文本中的最終字符
字符的索引添加到 therefIndex-1
最后的結(jié)果通過 arrayint[] 圖重新映射
tegnChanged = tegn + (refIndex - 1); if (tegnChanged > 95) tegnChanged = tegnChanged - 95;tegnChanged = map[tegnChanged - 1];
-
安全性
+關(guān)注
關(guān)注
0文章
93瀏覽量
19160 -
加密算法
+關(guān)注
關(guān)注
0文章
216瀏覽量
25553
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論