c語言實現idea加密演算法

2021-05-10 01:54:46 字數 3917 閱讀 3105

idea

資料加密演算法及實現

idea

對稱資料加密演算法,是我寫的第乙個關於加解密方面的演算法,在大學宿舍里弄了差不多將近二十個小時終於搞懂了。剛開始受到了「不良」資料的誤導走了很長時間的彎路,後來在圖書館看到了正確的介紹才終於把這個演算法給弄出來了。 1

、簡介idea,

即國際資料加密演算法

是旅居瑞士中國青年學者來學嘉和著名密碼專家

j.massey

於1990

年提出的。它在

1990

年正式公布並在以後得到增強。這種演算法是在

des演算法的基礎上發展出來的,類似於三重

des,和

des一樣

idea

也是屬於對稱金鑰演算法。發展

idea

也是因為感到

des具有金鑰太短等缺點,已經過時。

idea

的金鑰為

128位,這麼長的金鑰在今後若干年內應該是安全的。

類似於des,

idea

演算法也是一種資料塊加密演算法,它設計了一系列加密輪次,每輪加密都使用從完整的加密金鑰中生成的乙個子金鑰。與

des的不同處在於,它採用軟體實現和採用硬體實現同樣快速。 由於

idea

是在美國之外提出並發展起來的,避開了美國法律上對加密技術的諸多限制,因此,有關

idea

演算法和實現技術的書籍都可以自由出版和交流,可極大地促進

idea

的發展和完善。但由於該演算法出現的時間不長,針對它的攻擊也還不多,還未經過較長時間的考驗。因此,尚不能判斷出它的優勢和缺陷。 在

pgp(pretty good privacy)

中,idea

演算法被採用。 2

、演算法詳解:

2.1產生金鑰

演算法用了

52個子金鑰。首先,將

128-

位源金鑰分成8個

16-位子金鑰。源金鑰再次向左環移

25位產生另外

8個子金鑰,如此進行直到產生完

52個密匙。具體是:

idea

總共進行

8輪迭代操作,每輪需要

6個子金鑰

,另外還需要

4個額外子金鑰

,所以總共需要

52個子金鑰,這個

52個子金鑰都是從

128位金鑰中擴充套件出來的。

2.2加、解密過程

輸入的64-位資料分組被分成4個

16-位子分組:xl,

x2,x3和

x4。這

4個子分組成為演算法的第一輪的輸入,總共有

8輪。在每一輪中,這

4個子分組相互相異或,相加,相乘,且與6個

16-位子金鑰相異或,相加,相乘。在輪與輪間,第二和第三個子分組交換。最後在輸出變換中

4個子分組與

4個子金鑰進行運算。

注意上面的加法運算是對模2的

16次方的加法運算,即求兩個數的和對

65536

的餘數,

乘法運算是對模2的

16次方加

1的乘法運算,即兩個數的積對

65537

的餘數。

在每一輪中,執行的順序如下:

(1)x1

和第乙個子金鑰相乘。

(2)x2

和第二個子金鑰相加。

(3)x3

和第三個子金鑰相加。

(4)x4

和第四個子金鑰相乘。

(5)將第(1)

步和第(3)

步的結果相異或。·

(6)將第

(2)步和第

(4)步的結果相異或。

(7)將第(5)

步的結果與第五個子金鑰相乘。

(8)將第(6)

步和第(7)

步的結果相加。

(9)將第(8)

步的結果與第六個子金鑰相乘。

(10)

將第(7)

步和第(9)

步的結果相加。

(11)

將第(1)

步和第(9)

步的結果相異或。

(12)

將第(3)

步和第(9)

步的結果相異或。

(13)

將第(2)

步和第(10)

步的結果相異或。

(14)

將第(4)

步和第(10)

步的結果相異或。

每一輪的輸出是第

(11)

、(12)

、(13)

和(14)

步的結果形成的

4個子分組。將中間兩個分組分組交換

(最後一輪除外

)後,即為下一輪的輸入。 經過

8輪運算之後,有乙個最終的輸出變換:

(1) x1

和第乙個子金鑰相乘。

(2) x2

和第二個子金鑰相加。

(3) x3

和第三個子金鑰相加。

(4) x4

和第四個子金鑰相乘。

最後,這

4個子分組重新連線到一起產生密文。

2.3加密密匙及解密金鑰對應圖

2.4加密過程圖

2.5解密過程:

解密過程和加密過程完全一樣只是密匙不同而已。 3.

一些實現的細節:

注意點到一點就是資料在記憶體中是按照高高低低的順序排列的即對於乙個數高位的排在高記憶體,低位的排在低記憶體。比如下面的**輸出:

#include

int main()

結果應當是

32而不是

34,因為

34在高位所以應該放在高記憶體,而指標

b訪問的是

a的第乙個位元組的內容即低位記憶體內容即

32。這一點在後面的資料加解密過程中很重要。

為了方便對密匙的使用可以定義乙個結構體

typedef struct idea_key;

這裡jia_key[1][1]

即表示加密演算法的第一輪的第乙個密匙,也就是說捨去一部分陣列內容沒使用。

解密密匙與加密密匙的對應關係如上圖所示即他們分別為解密密匙的對

65537

的乘法逆元,(對

idea

而言,對於模

65537

乘,全0

子分組用

-1來表示,因此

0的乘法逆是

0)相反數或者是加密密匙本身。計算子密匙需要一些時間但是對每乙個解密密匙都只需要乙個解密密匙,只需做一次。這樣對加密過的資料利用解密密匙進行相同的運算就可以還原原來的資料(具體為什麼這樣做,是數學家的事,可以參考華羅庚的關於數論的書)。 4

、評價:

idea

的密匙長度幾乎是

des的兩倍多,因此對

idea

的窮舉攻擊幾乎是不可能的(它的空間複雜度將達到10的

39次方,也許在整個宇宙中有這麼多的儲存空間),

idea

也可以有效的抵抗中間相遇攻擊和差分分析攻擊事實上在

idea

的八輪演算法中在第四輪就已經具有對差分密碼分析的免疫了。 雖然

idea

是目前公開演算法的最好和最安全的加密演算法,但是隨著時間的流失看似安全的演算法往往會被新的密碼分析方法破譯,目前有幾個軍事組織已經對

idea

進行密碼分析,他們中的沒有乙個人願意公布可能成功破譯的結果,但將來的某一天他們可能會成功。

idea.h

suanfa.cpp

main.cpp

以上**在dev cpp4.9上可以編譯通過

IDEA加密演算法 c實現

vs2013環境下面成功編譯並且執行 idea演算法,全稱是internationale data encrypt algorithm 一種國際資料加密演算法 至今為止都很安全,是一種塊加密演算法。金鑰長度為128bit 16位元組 以每64bit 8位元組 為單位進行加密。演算法主要流程 1.首先...

DES加密演算法的C語言實現

include des version 0.4 created by source at 2007.3 competence p4 3.0g 512m 3000000 times encryption with created subkeys 26.784 seconds about 0.85m s...

scala語言實現各種加密演算法

因子 現在一些接 互的時候回用到各種加密演算法,現在總結一下我遇到的幾個演算法。1.md5加密 md5訊息摘要演算法,屬hash演算法一類。md5演算法對輸入任意長度的訊息進行執行,產生乙個128位的訊息摘要。以下所描述的訊息長度 填充資料都以位 bit 為單位,位元組序為小端位元組。演算法原理 1...