aes
高階加密標準,最常見的加密演算法。對稱加密所使用的公鑰和私鑰相同,所以加密和解密的過程互為逆過程。
加密原理
aes加密為分組密碼,在加密前,需要將明文分為長度為16位元組的組,每次加密一組資料,直到全部加密。金鑰長度有三種:128位(10輪),192位(12輪),256位(14輪)。金鑰長度不同,所推薦按的加密輪數也不相同。加密主要分為四步進行:
一、位元組代換操作:
(1)位元組代換操作:aes定義了乙個s盒和乙個逆s盒。這兩個盒用於輸出指定的元素。狀態矩陣中的元素按照位元組的高四位作為行值,第四位作為列值,查詢到s盒中的對應元素並且輸出該元素。所以位元組代換操作就是乙個查表的操作。
(2)位元組代換逆操作:就是查詢逆s盒來變換的操作。除了查詢的盒與位元組代換操作不同,其他具體方式不變。
二、行移位
(1)行移位操作:是乙個按照一定規則的左迴圈移位操作。規則:狀態矩陣的第0行左移0位元組,第一行左移1位元組,第二行左移2位元組,,,以此類推。
(2)行移位的逆變換:就是把行移位操作的左移變為右移,其移動的位元組數不變。
三、列混合
(1)列混合操作:通過矩陣相乘來實現。經過移位操作後的狀態矩陣與固定的矩陣相乘,得到的打散的狀態矩陣。
(2)列混合逆運算:乘以與上面固定的矩陣向逆的矩陣。
四、輪金鑰加:將128位輪金鑰和狀態矩陣中的資料逐位異或,操作後的每一位都發生改變。
desdes全稱為data encryption standard,即資料加密標準,是一種使用金鑰加密的塊演算法。它利用了分組密碼的兩個原則,即「混淆」和「擴散」。目的是抗擊解密過程中的統計分析攻擊。
混淆:使密文的統計特性與金鑰的取值之間的關係盡可能地複雜化,使金鑰已經密文之間地依賴性對密碼分析犯法來說無法實現。
擴散:擴散的作用是將每一位明文的影響盡可能迅速地作用到較多的輸出密文位中,以便在大量的密文中消除明文的統計結構,並且使每一位金鑰的影響盡量迅速地擴充套件到較多的密文位中嗎,以防對金鑰進行逐段破譯。
演算法金鑰:des演算法的輸入金鑰長度為64位,但只有其中的56位有效。將64位金鑰置於8×8矩陣中,每行的第8位被忽略,被忽略的8位數字被用來奇偶效驗。所以dh金鑰交換需要傳輸的金鑰長度為64位。
演算法步驟
一、初始置換:功能是把輸入的64位資料塊按位重新組合,並把輸出分為l0和r0兩部分,每部分各長3位,按照置換規則置換相應的位:第58位置換第1位,第50位置換第2位,,,以此類推。l1和r1是換位輸出後的兩部分,l1是輸出的左3位,r1是輸出的右32位。置換規則如下表:
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,
此過程需要迴圈十六次。
二,逆置換:經過十六次迭代運算後,得到l16和r16,並將此作為輸入,進行逆置換。逆置換是初始置換的逆運算,運算後就能得到密文輸出。
des演算法是對稱加密演算法的代表,在計算機網路系統中廣泛使用。
3des中間相遇攻擊指的是一種以空間換取時間的攻擊方式。屬於碰撞攻擊(同屬碰撞攻擊的還有「生日攻擊")。
攻擊原理
假設已經獲得了明文和密文,加密所使用的金鑰是k1,k2。
enc為加密函式,dec是解密函式(即enc-1),那麼就可以推到出:
c=enck2(enck1(p)),p=deck1(deck2(c)) => enck1(p)=deck2(c)
當攻擊者窮舉出所有的k1的組合後,則會產生出第一層密文enck2(p),用大量的空間儲存下來。再窮舉出所有k2的組合,將deck2(c)的值與前面儲存下來的結果相比對,其中相同的就看作」碰撞「,進而得出正確的k1,k2。
之所以說中間相遇攻擊是用空間換取時間的攻擊方式,是因為中間相遇攻擊需要使用兩個列表來儲存計算出來的資料,然後對資料進行一一比對。用了更大的儲存空間,但大大較少了運算時間。
在我看來,中間相遇攻擊更多的指的是一種思想,一種犧牲空間來換取時間的思想,這種思想不僅僅適用於密碼學攻擊,也適用於其他方面,可以降低演算法的複雜度,提高解決問題的能力。
舉例:用中間相遇攻擊來攻擊2des
設要使用窮舉法來攻擊2des,如果是des加密,那麼就需要求出對金鑰空間的256的所有可能求明文的加密結果並儲存到陣列中,又因為2des使用了兩組金鑰來加密和解密,所以金鑰空間達到了乙個2112,然後再乙個乙個嘗試,最終嘗試出正確的金鑰。這種窮舉法對於計算機的計算和儲存提出了極高的要求,並且需要很長時間來實現。那麼就出現了中間相遇攻擊。
中間相遇攻擊需要攻擊者已經獲得了明文和密文,因為明文的加密結果和密文的解密結果值是相等的,那麼金鑰空間縮小到了兩個256的陣列。只需要將所有的可能的明文的加密結果儲存至儲存,然後再計算出所有的可能的對密文的解密結果。將兩個陣列進行遍歷,其中相同的叫做」碰撞「,找到」碰撞「就可以推出金鑰。這種演算法的複雜度略大於257,顯著低於窮舉法的2112。
所以中間相遇攻擊能夠大幅度減小求金鑰的計算量。
**實現中將相遇攻擊題目如下:
memcpy(cipher, plain, 0x10ull)
;for
( i = 0ll; i <=8;
++i )
result = shift_row(cipher)
;for
( k = 0ll; k <=
0xf;
++k )
return result;
0ll表示long long型別的常數。shift意味移動,row為行,shift_row意思就是行移位,是乙個置換操作。
*(_dword )&cipher[4 * j]:dword是乙個巨集,一種無符號整數的資料型別。核心部分是cipher,cipher右邊部分是取陣列指定下標中的元素,即(4,j號元素),取出來之後再對該元素取位址,變成乙個指標,把該指標強制型別轉換為dword型指標,然後對其引用,意思就是按照dword指定的大小去除陣列cipher中4j號元素,最後給該內容賦值為下面四行運算的結果,結果再協會到陣列中原來的位置上。
box是暗盒。a<<=2等價於a=a<<2(《表示左移三位),同理:>>表示右移。(4 *j + 3 + 16 *i) << 8即為前面的運算結果左移8位。unsigned __int8表示8位無符號數字,即為乙個位元組。^表示異或。
0xf,0x為十六進製制的開頭,所以0xf表示十六進製制的數字f。
subbytes是aes加密的重複輪(rounds)的一輪,subbytes 替換用乙個代替表替換單個位元組。最後輸出結果。
依照程式的流程,我們已經知道了程式加密的結果,並且行變換(shift_row)和替換操作(subbytes)又是可逆的,所以我們得到最後一輪加密結果。box對應的是常數。此時要求上一輪的cipher[4 *j]的值,一共32位。直接求取難度極大,每一輪都需要求取cipher[4 *j]的值。那麼我們使用中間相遇攻擊的攻擊方法。
首先,列舉出所有cipher[4 *j]和cipher[4 *j+1]的位元組組合,一共256×256種。在列舉剩下最後兩個位元組的時候,我們可以先計算出其與密文的異或值,然後去之前的組合中找,如果找到,我們就可以認為其是正確的。這樣複雜度被降到了o(216)。
題目分析完畢。解題,解題的過程和加密的過程是相反的,是逆過程。首先要通過subbytes 替換用乙個代替表替換單個位元組的逆變換,即通過替換後的位元組尋找到原位元組。然後通過元素換位實現inv_shift_row,即為shift_row(行移位)的逆變換。接著,通過box資料的還原,這裡需要題目**中的公式的逆用,同時還要使用box函式的異或,求出原資料並儲存到num。最後,輸出運算結果,結果就是金鑰。
Crypto 學習總結 RSA
testrsa.cpp 定義控制台應用程式的入口點。include stdafx.h include randpool.h include rsa.h include hex.h include files.h include using namespace std using namespace ...
任務三丶任務四丶任務五
任務三 網路配置 任務四 五 1 使用passwd命令修改root密碼 2 進入多使用者系統 3 進入單使用者系統 4 給單使用者模式加密 5 檢視linux系統中的使用者 6 檢視使用者密碼以及有效的檔案 7 檢視賬號所屬組檔案 8 建立與刪除使用者 用linux建立新的使用者的命令如下 user...
Activiti 五 完結任務
當我們知道了個人的任務後就可以對任務進行完結 得到processengine 物件得到 taskservice 物件查詢任務 判斷完結任務 public class activititask act hi actinst表 我們看到執行人xiaoyi有了結束時間,並且表中多了一條xiaoer的任務,...