這個加密類很容易實(shí)現(xiàn)和使用。如果你需要加密字符串,如密碼、汽車牌號等,就可以使用這個個快捷、簡單、安全的方式。只要不暴露加密 KEY, 就會很安全。建議KEY 的長度最少為 12 個包含大小寫的字符。
使用代碼
首先下載源代碼,將其中的類插入你的命名空間。然后你可以初始化類的對象。
加密
以下代碼塊是如何使用 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 有無錯誤
errorState-1:
這意味著加密的文本包含 ASCII 以外的字符。在加密前,這些字符被更改為 "?"
errorState-2:
沒有提供加密 key。加密過程會中斷。
解密:
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)行多次,同一個加密key 和平面文本會產(chǎn)生不同的加密文本
M2encryption.Randomization = true;
快捷模式
設(shè)置為Fastmode 模式會讓加密/解密快捷,但是安全性會降低。如果你要加密小字符串,不應(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)迭代平面文本中每個字符。
自變異內(nèi)部和外部 key
自變異內(nèi)部key
此 key 在內(nèi)部加密流程中使用。key 中每個字母都喲牛股加密平面文本中對應(yīng)的位置。當(dāng) key 的字符串結(jié)束后,該流程會使用自變異的key 版本繼續(xù)進(jìn)行,直至所有平面文本都加密完??磮D1 說明。子變異的內(nèi)部 key 標(biāo)記為藍(lán)色。

Fig1. 上述的key永遠(yuǎn)不會重復(fù)
自變異外部 key
用戶輸入key 后,自變異的外部key 會初始化。該key會用于外部循環(huán)并在每次開始自改變。該key的目的是為每輪生成唯一的映射矩陣并在這些輪中初始化自變異內(nèi)部key。映射數(shù)組在內(nèi)部循環(huán)中的加密流程中使用。
6 輪迭代的key 自變化的例子:

函數(shù) shuffleArr() 將自變異key作為輸入。根據(jù)key, 它會在 arrayint[] 中得出類似隨機(jī)順序的映射數(shù)字。函數(shù)每次調(diào)用,key 就會自變異,從而創(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:
整個文本都需要經(jīng)過函數(shù) chainChangeChars() 處理
文本會被從頭到尾來回掃描,文本中每個字母都根據(jù)左邊的相鄰字符(在回來的時候根據(jù)右邊的相鄰字母)更改。如果一個字母更改,每個單獨(dú)的字母也會隨之更改。每個更改的字符會跟映射 arrayint[] 圖重新映射。
這是我解決問題的公式:
示例文本 "ABCD"
A 是 B 的左邊相鄰字母

在相反的流程中

然后重新映射:
Y = map[X]
最后:
B 被替換為 Y
文本成為 "AYCD" (其中 Y 是個持有真正字母的變量)
原先的 B現(xiàn)在存儲在 Y 內(nèi)??梢酝ㄟ^ Y 和 A 還原
Step 2:
這個步驟是個流程的開始,會根據(jù)自變異的內(nèi)部key 更改文本中每個字母,如圖一所示。
首先生成一個種子。對于每個要更改的字母,下個文本的十進(jìn)位 ascii 值會在 variabelseedC 中累計??吹谝恍写a:
seedC = seedC + (byte)Convert.ToChar(key[keyIndexC]);keyIndexC++; if (keyIndexC > lenKey - 1){ keyIndexC = 0; mutKey_i = selfMutateKey(key,2,1,2);}
Step 3:
生成引用索引號.
步驟 2 中的種子現(xiàn)在用作函數(shù) createRefIndex() 的輸入
在這個函數(shù)中,種子經(jīng)過這個公式:
種子除以 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 將總是一個 [1 - 95] 的整數(shù)。
Step 4:
在最后一個步驟中,字符更改為加密文本中的最終字符
字符的索引添加到 therefIndex-1
最后的結(jié)果通過 arrayint[] 圖重新映射
tegnChanged = tegn + (refIndex - 1); if (tegnChanged > 95) tegnChanged = tegnChanged - 95;tegnChanged = map[tegnChanged - 1];
-
安全性
+關(guān)注
關(guān)注
0文章
93瀏覽量
19522 -
加密算法
+關(guān)注
關(guān)注
0文章
219瀏覽量
26089
發(fā)布評論請先 登錄
加密算法的應(yīng)用
汽車遙控加密算法
uid加密算法
DES加密算法是什么
對稱加密算法是什么
淺談對稱加密算法與非對稱密鑰加密算法
采用多種加密算法的文件加密方法
解讀保護(hù)數(shù)據(jù)安全的八種軟件加密算法

基于M2加密算法深度解讀
評論