各種密碼學演算法的GUI程式設計實現(DES、AES、Present、擴充套件歐幾里得演算法、素性檢測)
encryption-algorithm
各種密碼學演算法的 C# GUI程式設計實現,包含:
- DES
- AES
- Present
- 擴充套件歐幾里得演算法
- 素性檢測
最終的結果
DES加密
DES解密
AES加解密
Present
擴充套件歐幾里得演算法
素性檢測
使用說明(輸入輸出)
建議使用
visual studio 2015
開啟此專案(解決方案)。
1. DES加密
點選DES選項卡選擇DES
左下角會顯示加密所用時間
右下角的匯出按鈕可以匯出加密後的密文
2. DES解密
具體操作方法和DES加密類似。
3. AES加密
點選頂部選項卡中的AES --> 選擇金鑰長度(128bits/192bits/256bits) --> 在明文的位置輸入需要加密的內容(也可以點選開啟加密檔案選擇需要加密的檔案) --> 輸入16位金鑰 --> 點選生成金鑰
左下角會顯示加密所用時間
右下角的匯出按鈕可以匯出加密後的密文
可以在擴充套件金鑰彈窗中看見擴充套件金鑰
可以在加解密過程彈窗中看見加解密過程
4. AES解密
具體操作方法和加密類似。
5. Present輕量級加密演算法加密
點選頂部選項卡中的Present --> 輸入明文(16位,也可以點選開啟加密檔案選擇需要加密的檔案) --> 輸入金鑰(20位) --> 點選加密 --> 密文的位置會顯示加密後的內容
左下角會顯示加密所用時間
右下角的匯出按鈕可以匯出加密後的密文
6. 擴充套件歐幾里得演算法
相當於一個乘法逆元計算器。
點選頂部的擴充套件歐幾里得演算法 --> 第一個數輸入需要計算的數 --> 在模的位置輸入‘模’ --> 點選確定 --> 可以在下方看見計算結果
7. 素性檢測
點選頂部選項卡中的Miller-Robin --> 在第一個輸入框和第二個輸入框都輸入同一個需要被判定的數 --> 分別點選計算 --> 可以看見計算結果
下面的普通方式是使用輸入的數去除1到輸入的數-1的所有數
可以檢視使用兩種方式判斷素數的效能差別
演算法介紹
1. DES
DES全稱為Data Encryption Standard,即資料加密標準,是一種使用金鑰加密的塊演算法。
DES基本原則
DES設計中使用了分組密碼設計的兩個原則:混淆(confusion
)和擴散(diffusion
),其目的是抗擊敵手對密碼系統的統計分析。混淆是使密文的統計特性與金鑰的取值之間的關係儘可能複雜化,以使金鑰和明文以及密文之間的依賴性對密碼分析者來說是無法利用的。擴散的作用就是將每一位明文的影響儘可能迅速地作用到較多的輸出密文位中,以便在大量的密文中消除明文的統計結構,並且使每一位金鑰的影響儘可能迅速地擴充套件到較多的密文位中,以防對金鑰進行逐段破譯。
DES演算法步驟
DES演算法把64位的明文輸入塊變為64位的密文輸出塊,它所使用的金鑰也是64位(實際用到了56位,第8、16、24、32、40、48、56、64位是校驗位, 使得每個金鑰都有奇數個1),其演算法主要分為兩步:
1)初始置換
其功能是把輸入的64位資料塊按位重新組合,並把輸出分為L0
、R0
兩部分,每部分各長32位,其置換規則為將輸入的第58位換到第一位,第50位換到第2位……依此類推,最後一位是原來的第7位。L0
、R0
則是換位輸出後的兩部分,L0
是輸出的左32位,R0
是右32位,例:設定換前的輸入值為D1D2D3……D64
,則經過初始置換後的結果為:L0=D58D50……D8
;R0=D57D49……D7
。
其置換規則見下表:
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,
64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,
59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,
63,55,47,39,31,23,15,7,
2)逆置換
經過16次迭代運算後,得到L16
、R16
,將此作為輸入,進行逆置換,逆置換正好是初始置換的逆運算,由此即得到密文輸出。此演算法是對稱加密演算法體系中的代表,在計算機網路系統中廣泛使用。
DES金鑰太短,已經能被現代計算機暴力破解!
2. AES
高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。
設計思想
Rijndael密碼的設計力求滿足以下3條標準:
抵抗所有已知的攻擊
在多個平臺上速度快,編碼緊湊
設計簡單
AES加密資料塊分組長度必須為128位元,金鑰長度可以是128位元、192位元、256位元中的任意一個(如果資料塊及金鑰長度不足時,會補齊)。AES加密有很多輪的重複和變換。
AES加密步驟
AES加密過程是在一個4×4的位元組矩陣上運作,這個矩陣又稱為“狀態(state
)”,其初值就是一個明文區塊(矩陣中一個元素大小就是明文區塊中的一個Byte
)。(Rijndael加密法因支援更大的區塊,其矩陣行數可視情況增加)加密時,各輪AES加密迴圈(除最後一輪外)均包含4個步驟:
AddRoundKey
— 矩陣中的每一個位元組都與該次輪祕鑰(round key
)做XOR
運算;每個子金鑰由金鑰生成方案產生SubBytes
— 通過非線性的替換函式,用查詢表的方式把每個位元組替換成對應的位元組ShiftRows
— 將矩陣中的每個橫列進行迴圈式移位MixColumns
— 為了充分混合矩陣中各個直行的操作。這個步驟使用線性轉換來混合每列的四個位元組
最後一個加密迴圈中省略MixColumns
步驟,而以另一個AddRoundKey
取代.
3. Present
在CHES2007上,Bogdanov等提出了PRESENT演算法,該演算法具有出色的硬體實現效能和簡潔的輪函式設計。PRESENT密碼演算法與現有的輕量級分組密碼演算法TEA、MCRYPTON、HIGHT、SEA和CGEN相比,有著更簡單的硬體實現,因此被稱為超輕量級密碼演算法。
Present加密步驟
PRESENT分組密碼演算法採用SPN
結構,分組長度為64位,支援80位、128位兩種金鑰長度。共迭代31輪,每輪輪函式F
由輪金鑰加、S
盒代換、P
置換3部分組成。
加密過程如下:
- 輪金鑰加:
64bit
輪輸入同輪金鑰進行異或 S
盒代換層:將輪金鑰加64bit
輸出查詢16 個4 進4 出的S
盒P
置換層:通過置換表P(i)
對S
盒代換64bit
輸出按位元進行重新排列
為提高演算法安全性,PRESENT 在第31 輪後使用64bit
金鑰K32
進行後期白化操作
4. 擴充套件歐幾里得演算法
乘法逆元的定義
**A * X MOD N == 1
**則稱X為A關於模N的乘法逆元。
注:
只有兩個數互素的時候才會有乘法逆元
兩個數不互素是沒有乘法逆元的
5. 素性檢測演算法(Miller-Robin)
定義
一個數是素數(也叫質數),當且僅當它的約數只有兩個——1和它本身。規定這兩個約數不能相同,因此1不是素數。對素數的研究屬於數論範疇,你可以 看到許多數學家沒事就想出一些符合某種性質的素數並稱它為某某某素數。
素數性質
- 素數的個數無限多(不存在最大的素數)
- 存在任意長的一段連續數,其中的所有數都是合數(相鄰素數之間的間隔任意大)
- 所有大於2的素數都可以唯一地表示成兩個平方數之差
- 當n為大於2的整數時,
2^n+1
和2^n-1
兩個數中,如果其中一個數是素數,那麼另一個數一定是合數 - 如果
p
是素數,a
是小於p
的正整數,那麼a^(p-1) mod p=1
Miller-Robin
演算法是基於費馬小定理(format
),二次探測定理(x*x%p==1
,若P為素數,則x的解只能是x=1
或者x=p-1
)加上迭代乘法判斷的Miller演算法共同構成的。
- 費爾馬小定理
如果
p
是一個素數,且0<a<p
,則a^(p-1)%p=1
。利用費爾馬小定理,對於給定的整數n
,可以設計素數判定演算法,通過計算d=a^(n-1)%n
來判斷n
的素性,當d!=1
時,n
肯定不是素數,當d=1
時,n
很可能是素數
- 二次探測定理
如果
p
是一個素數,且0<x<p
,則方程x^2%p=1
的解為x=1
或x=p-1
。利用二次探測定理,可以再利用費爾馬小定理計算a^(n-1)%n
的過程中增加對整數n
的二次探測,一旦發現違背二次探測條件,即得出n
不是素數的結論
原始碼地址
caomage的個人主頁