1. 程式人生 > >3DES、AES、RC6、TEA、RSA、MD5、SHA1、SHA256加密介紹及原始碼

3DES、AES、RC6、TEA、RSA、MD5、SHA1、SHA256加密介紹及原始碼

前兩天想幫朋友做一個ARM/STM32的ISP離線下載器,想到韌體平時是儲存在外部SPI ROM裡的需要加密。這兩天在網上研究了一下流行的檔案加密方法並除錯和整理了一下,特此公佈。先簡單的掃掃盲,大家可以邊看邊下載呵。

DES---研究過加密的朋友十分熟悉,老牌的加密方法了。這是一個可逆的對稱加密演算法,也是應用最廣泛的金鑰系統。好像是從1977年美國政府開始採用的。大家都看過U-571吧,DES的思路就是參照二戰時期盟軍繳獲的德軍恩格瑪加密機,不過DES比那個要NB的多多了。到現在為止,除了差分分析法和線性分析法外只有暴力窮舉法了。前兩種方法不是密碼學家或數學家都不懂呵,不過窮舉DES,以現有我們大家都可以掌握的技術手段,恐怕沒個幾百上千年下不來呵。不過,咱們破解不了,不能說明就沒人或沒有裝置破解不了。正因為如此,所以才衍生出了3重DES加密。常規的DES金鑰是64位的(實際上有8位是校驗用),而3DES是128位(當然有16位也是校驗用)。增加金鑰長度並增加運算量來防止破解,並在後來的AES出來之前確定為過度方案。不過現在即便有了AES,3DES也沒少用,它依然很NB。

下載DES.RAR

AES---它是一種高階加密標準,也叫Rijndael演算法,2002年成為標準。它是用來代替原來的DES加密方法的。它也是一個可逆的對稱加密演算法。研究過IAP的朋友應該明白,把做好的韌體程式通過AES加密後釋出,使用者可以通過IAP的方式來線上升級程式,而開發者則不必擔心自己的生產程式碼流失。即能加密又能還原,這就是可逆加密演算法,這也是我們想用到的。AES在早期的方案徵集時就規定了要軟硬體可以很好的整合,所以它也比較小,程式量比DES要少一些。
下載AES.RAR

RC6---有個演算法RC4聽說過吧,在無線傳輸和序列流傳輸的加密領域佔有相當的分量。據說RC6是同一幫人研究出來的,不過它和RC4沒太大關係呵。它是AES方案徵集時的候選演算法之一,但是沒有Rijndael演算法那麼幸運。RC6據說可以抵抗所有已知的攻擊,並能夠提供AES所要求的安全性,它也是相當優秀的一種可逆加密演算法。不過當初它為什麼沒能當選為AES演算法就不得而知了,不知道當時有沒有給評委們足夠的商務費用呵。

下載RC6.RAR

TEA---它是一種分組加密演算法,也是可逆演算法。短小精悍。它的實現非常簡單,超不過10行程式碼。TEA演算法每一次可以操作64位(8位元組),採用128位(16位元組)作為金鑰,演算法採用迭代的形式,儘管32輪迭代已經足夠了,但是最好的迭代輪數是64輪。資料流加密可能比較適合,因為據說早期的QQ採用過TEA加密演算法。
下載TEA.RAR

RSA---頂頂有名的非對稱公鑰加密演算法,也許你可能不熟悉,不過網銀總應該用過吧,多數都是RSA演算法來認證的。1977年就開發出來了,DES時代的東東了。不過用到現在依然堅挺,可見加密強度有多高。呵呵,不過它防解密的原理也很簡單:只告訴你兩個數相乘後的結果,你能知道原來的兩個數是什麼嗎?RSA的安全性依賴於大數的因子分解,但是並沒有理論上可以證明破譯RSA的難度與大數分解難度是同樣的。它是第一個既能用於資料加密也能用於數字簽名的演算法,也是可逆演算法。不過,在不告訴你金鑰的情況下,你就是想什麼辦法加密後的資料也還原不回去,銀行系統用它自有道理呵。告訴你個小祕密,前面說過的RC6好像就是有RSA開發組成員參與搞出來的。不過,RSA也有不少缺點。它受到素數產生技術的限制,產生金鑰時很麻煩;出於安全性考慮,分組長度至少也要600位以上,運算代價很高、速度比較慢,比DES之類的對稱演算法要慢的多。它最大的缺點是需要生成大素數及大數取模時可能會產生特別大的資料量,這些都很耗費時間,生成複雜金鑰時在微控制器上執行可能都不止10分鐘,所以解密時還是儘量讓PC或伺服器來做吧。

下載RSA.RAR

MD5---非常著名的雜湊演算法,不可逆演算法。網站登入、作業系統的使用者認證、檔案完整性和數字簽名等領域廣泛應用。不可逆演算法一般做的都比較絕,例如彩虹加密狗,只告訴你一個餘數,你能知道原來的除數和被除數嗎?只把運算過的資料相比較,而不非得知道原資料,這樣就完成了認證過程。要想破解MD5的密碼,即使採用現在最快的巨型計算機,據說也要運算100萬年以上。不過,加密和解密都是數學領域的競賽,每一種加密演算法都或多或少的存在漏洞或缺陷,MD5看上去真那麼牢不可破嗎?和MD5同樣有名的是山東大學的王小云教授。在2004年的國際密碼大會上王小云宣佈了她的研究小組完成了對MD5雜湊函式的雜湊衝撞,也就是從理論上說使用MD5的數字簽名可以偽造。這也意味著MD5可能需要和其他加密演算法共用才可以保證數字簽名的安全。不過,說MD5已被破解,那也有些杞人憂天了。可以肯定的告訴你,網路上所有針對MD5提供的破解服務,全部都是查詢用字典法暴力破解後的資料包,沒有一個是真正偽造出來的數字簽名,那些號稱有幾百億條的記錄對MD5龐大演算法來說太小了。試想想,動用美國軍方的巨型計算機,利用王小云研究理論,來破解我們的一個微控制器或網站認證程式?沒必要吧。所以MD5依然可用呵,只不過再加上3DES、AES或SHA來防止字典就更好了。
下載MD5.RAR

SHA---著名的雜湊演算法,不可逆演算法。也是多用在數字簽名上。SHA-1和MD5一樣,也被王小云教授找出雜湊衝撞的漏洞,不過也是停留在理論上的。SHA-256是很NB的,它光金鑰就有64個long,恐怕想要破解已經是天文數字了。最NB的是SHA-512,咱們這裡沒有收錄,這裡恐怕還沒有人能用得上。
下載SHA-1.RAR
下載SHA-256.RAR

好了,先介紹到這裡,一字一字的打真不容易呵。以上所有的程式均為C源程式,不用其他檔案,裡面都附帶了測試程式,在KEIL 4.21上跑過模擬,放心使用。程式大多不是我自己編的,有C++的源程改的,也有別人的C源程。為了尊重別人的勞動成果,裡面會帶有人家的名字。我只是做了整理和除錯。
例如TEA的測試程式:
void TEA_Test(void)
{
        unsigned char dat[16]="0123456789ABCDEF";
        unsigned char TEA_key[16];
        memcpy(TEA_key,"0123456789abcdef",16);//做運算之前先要設定好金鑰,這裡只是設定金鑰的DEMO。

        TEA_Encrypt(dat,TEA_key);      //TEA加密,陣列dat裡面的新內容就是加密後的資料。
        TEA_Decrpyt(dat,TEA_key);      //密文資料存放在dat裡面,經TEA解密就能得到之前的明文。
}

DES的測試程式:
void DES3_Test(void)
{
        unsigned char in_buf[8] = "ABCDEFGH";
        unsigned char miwen[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
        unsigned char out_buf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

        memcpy(DES_key,"0123456789abcdef",16);//3DES的金鑰是128位的,這裡只是設定金鑰的DEMO。

        DEC3_Encrypt(in_buf,miwen);     //3DES加密
        DEC3_Decrypt(miwen,out_buf);  //3DES解密
}

不用管其他程式是怎麼完成的,會用C語言的都能看懂吧。有興趣和有時間可以研究一下運算程式,深入瞭解一下加密方法。

測試方法與過程:
DES演算法和AES演算法都有現成的加密軟體,把軟模擬計算過的資料和人家的軟體做對比,並能解密還原為原資料。
RC6、TEA、SHA-256暫時沒有找到測試軟體,通過不同的金鑰看到加密後的資料被完全打散或變形,並能還原為原資料(SHA-256除外)。
RSA也沒找到測試軟體相對比。實際測試不太複雜的資料加解密資料正常,太複雜的資料用軟模擬半小時後解密未果。
MD5和SHA-1演算法也有現成的加密軟體,自已計算的資料和人家算過的資料做對比,資料準確。

好了,就說這麼多吧。打包下載