這個加密類很容易實現和使用。如果你需要加密字符串,如密碼、汽車牌號等,就可以使用這個個快捷、簡單、安全的方式。只要不暴露加密 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);}
在做進一步處理前檢查屬性 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);}
隨機化
將屬性 Randomization 設置為 true,運行多次,同一個加密key 和平面文本會產生不同的加密文本
M2encryption.Randomization = true;
快捷模式
設置為Fastmode 模式會讓加密/解密快捷,但是安全性會降低。如果你要加密小字符串,不應該啟用該模式。如果加密很大的文件,可以。
注意,解密和加密的模式應該相同。
M2encryption.Fastmode = true;
算法的內部工作原理
外部循環(huán)和內部循環(huán)
算法包含外部和內部循環(huán)。外部循環(huán)迭代次數,內部循環(huán)迭代平面文本中每個字符。
自變異內部和外部 key
自變異內部key
此 key 在內部加密流程中使用。key 中每個字母都喲牛股加密平面文本中對應的位置。當 key 的字符串結束后,該流程會使用自變異的key 版本繼續(xù)進行,直至所有平面文本都加密完??磮D1 說明。子變異的內部 key 標記為藍色。
Fig1. 上述的key永遠不會重復
自變異外部 key
用戶輸入key 后,自變異的外部key 會初始化。該key會用于外部循環(huán)并在每次開始自改變。該key的目的是為每輪生成唯一的映射矩陣并在這些輪中初始化自變異內部key。映射數組在內部循環(huán)中的加密流程中使用。
6 輪迭代的key 自變化的例子:
函數 shuffleArr() 將自變異key作為輸入。根據key, 它會在 arrayint[] 中得出類似隨機順序的映射數字。函數每次調用,key 就會自變異,從而創(chuàng)建出新的唯一映射數組。
函數 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; } } } }
內循環(huán)加密流程
Step 1:
整個文本都需要經過函數 chainChangeChars() 處理
文本會被從頭到尾來回掃描,文本中每個字母都根據左邊的相鄰字符(在回來的時候根據右邊的相鄰字母)更改。如果一個字母更改,每個單獨的字母也會隨之更改。每個更改的字符會跟映射 arrayint[] 圖重新映射。
這是我解決問題的公式:
示例文本 "ABCD"
A 是 B 的左邊相鄰字母
在相反的流程中
然后重新映射:
Y = map[X]
最后:
B 被替換為 Y
文本成為 "AYCD" (其中 Y 是個持有真正字母的變量)
原先的 B現在存儲在 Y 內。可以通過 Y 和 A 還原
Step 2:
這個步驟是個流程的開始,會根據自變異的內部key 更改文本中每個字母,如圖一所示。
首先生成一個種子。對于每個要更改的字母,下個文本的十進位 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 中的種子現在用作函數 createRefIndex() 的輸入
在這個函數中,種子經過這個公式:
種子除以 95
將小數的整數部分更改為 0
結果乘以 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] 的整數。
Step 4:
在最后一個步驟中,字符更改為加密文本中的最終字符
字符的索引添加到 therefIndex-1
最后的結果通過 arrayint[] 圖重新映射
tegnChanged = tegn + (refIndex - 1); if (tegnChanged > 95) tegnChanged = tegnChanged - 95;tegnChanged = map[tegnChanged - 1];
-
安全性
+關注
關注
0文章
93瀏覽量
19400 -
加密算法
+關注
關注
0文章
218瀏覽量
25838
發(fā)布評論請先 登錄
汽車遙控加密算法
uid加密算法
DES加密算法是什么
對稱加密算法是什么
采用多種加密算法的文件加密方法

評論