aes加密演算法的實現
『壹』 PHP對稱加密-AES
對稱加解密演算法中,當前最為安全的是 AES 加密演算法(以前應該是是 DES 加密演算法),PHP 提供了兩個可以用於 AES 加密演算法的函數簇: Mcrypt 和 OpenSSL 。
其中 Mcrypt 在 PHP 7.1.0 中被棄用(The Function Mycrypt is Deprecated),在 PHP 7.2.0 中被移除,所以即可起你應該使用 OpenSSL 來實現 AES 的數據加解密。
在一些場景下,我們不能保證兩套通信系統都使用了相函數簇去實現加密演算法,可能 siteA 使用了最新的 OpenSSL 來實現了 AES 加密,但作為第三方服務的 siteB 可能仍在使用 Mcrypt 演算法,這就要求我們必須清楚 Mcrypt 同 OpenSSL 之間的差異,以便保證數據加解密的一致性。
下文中我們將分別使用 Mcrypt 和 OpenSSL 來實現 AES-128/192/256-CBC 加解密,二者同步加解密的要點為:
協同好以上兩點,就可以讓 Mcrypt 和 OpenSSL 之間一致性的對數據進行加解密。
AES 是當前最為常用的安全對稱加密演算法,關於對稱加密這里就不在闡述了。
AES 有三種演算法,主要是對數據塊的大小存在區別:
AES-128:需要提供 16 位的密鑰 key
AES-192:需要提供 24 位的密鑰 key
AES-256:需要提供 32 位的密鑰 key
AES 是按數據塊大小(128/192/256)對待加密內容進行分塊處理的,會經常出現最後一段數據長度不足的場景,這時就需要填充數據長度到加密演算法對應的數據塊大小。
主要的填充演算法有填充 NUL("0") 和 PKCS7,Mcrypt 默認使用的 NUL("0") 填充演算法,當前已不被推薦,OpenSSL 則默認模式使用 PKCS7 對數據進行填充並對加密後的數據進行了 base64encode 編碼,所以建議開發中使用 PKCS7 對待加密數據進行填充,已保證通用性(alipay sdk 中雖然使用了 Mcrypt 加密簇,但使用 PKCS7 演算法對數據進行了填充,這樣在一定程度上親和了 OpenSSL 加密演算法)。
Mcrypt 的默認填充演算法。NUL 即為 Ascii 表的編號為 0 的元素,即空元素,轉移字元是 " ",PHP 的 pack 打包函數在 'a' 模式下就是以 NUL 字元對內容進行填充的,當然,使用 " " 手動拼接也是可以的。
OpenSSL的默認填充演算法。下面我們給出 PKCS7 填充演算法 PHP 的實現:
默認使用 NUL(" ") 自動對待加密數據進行填充以對齊加密演算法數據塊長度。
獲取 mcrypt 支持的演算法,這里我們只關注 AES 演算法。
注意:mcrypt 雖然支持 AES 三種演算法,但除 MCRYPT_RIJNDAEL_128 外, MCRYPT_RIJNDAEL_192/256 並未遵循 AES-192/256 標准進行加解密的演算法,即如果你同其他系統通信(java/.net),使用 MCRYPT_RIJNDAEL_192/256 可能無法被其他嚴格按照 AES-192/256 標準的系統正確的數據解密。官方文檔頁面中也有人在 User Contributed Notes 中提及。這里給出如何使用 mcrpyt 做標注的 AES-128/192/256 加解密
即演算法統一使用 MCRYPT_RIJNDAEL_128 ,並通過 key 的位數 來選定是以何種 AES 標准做的加密,iv 是建議添加且建議固定為16位(OpenSSL的 AES加密 iv 始終為 16 位,便於統一對齊),mode 選用的 CBC 模式。
mcrypt 在對數據進行加密處理時,如果發現數據長度與使用的加密演算法的數據塊長度未對齊,則會自動使用 " " 對待加密數據進行填充,但 " " 填充模式已不再被推薦,為了與其他系統有更好的兼容性,建議大家手動對數據進行 PKCS7 填充。
openssl 簇加密方法更為簡單明確,mcrypt 還要將加密演算法分為 cipher + mode 去指定,openssl 則只需要直接指定 method 為 AES-128-CBC,AES-192-CBC,AES-256-CBC 即可。且提供了三種數據處理模式,即 默認模式 0 / OPENSSL_RAW_DATA / OPENSSL_ZERO_PADDING 。
openssl 默認的數據填充方式是 PKCS7,為兼容 mcrpty 也提供處理 "0" 填充的數據的模式,具體為下:
options 參數即為重要,它是兼容 mcrpty 演算法的關鍵:
options = 0 : 默認模式,自動對明文進行 pkcs7 padding,且數據做 base64 編碼處理。
options = 1 : OPENSSL_RAW_DATA,自動對明文進行 pkcs7 padding, 且數據未經 base64 編碼處理。
options = 2 : OPENSSL_ZERO_PADDING,要求待加密的數據長度已按 "0" 填充與加密演算法數據塊長度對齊,即同 mcrpty 默認填充的方式一致,且對數據做 base64 編碼處理。注意,此模式下 openssl 要求待加密數據已按 "0" 填充好,其並不會自動幫你填充數據,如果未填充對齊,則會報錯。
故可以得出 mcrpty簇 與 openssl簇 的兼容條件如下:
建議將源碼復制到本地運行,根據運行結果更好理解。
1.二者使用的何種填充演算法。
2.二者對數據是否有 base64 編碼要求。
3.mcrypt 需固定使用 MCRYPT_RIJNDAEL_128,並通過調整 key 的長度 16, 24,32 來實現 ase-128/192/256 加密演算法。
『貳』 用AES演算法對整個文件加密,怎麼做
1.加密,是以某種特殊的演算法改變原有的信息數據,使得未授權的用戶即使獲得了已加密的信息,但因不知解密的方法,仍然無法了解信息的內容。例如對稱演算法亦或加密。
2.什麼是異或演算法
異或的特點是原始值經過兩次異或某一個數後會變成原來的值,所以有時利用這個特性來進行加密,加密端把數據與一個密鑰進行虧慶異或操作,生成密文。接收方收到密文後利用加密方提供的密鑰進物侍行再次異或操作就能得到明文。
3.常式:
/*以DWORD為單位對文件進行加密,將每個DWORD與0xfcba0000(密鑰)做異銷螞握或,寫入另一個文件*/
#include <stdio.h>
#include <stdlib.h>
#define DWORD unsigned long
#define BYTE unsigned char
#define false 0
#define true 1
int main(int argc, char *argv[])
{
FILE *hSource;
FILE *hDestination;
DWORD dwKey=0xfcba0000;
char* pbBuffer;
DWORD dwBufferLen=sizeof(DWORD);
DWORD dwCount;
DWORD dwData;
if(argv[1]==0||argv[2]==0)
{
printf("missing argument!\n");
return false;
}
『叄』 什麼是AES演算法
加密演算法分為單向加密和雙向加密。
單向加密 包括 MD5 , SHA 等摘要演算法。單向加密演算法是不可逆的,也就是無法將加密後的數據恢復成原始數據,除非採取碰撞攻擊和窮舉的方式。像是銀行賬戶密碼的存儲,一般採用的就是單向加密的方式。
雙向加密 是可逆的,存在密文的密鑰,持有密文的一方可以根據密鑰解密得到原始明文,一般用於發送方和接收方都能通過密鑰獲取明文的情況。雙向加密包括對稱加密和非對稱加密。對稱加密包括 DES 加密, AES 加密等,非對稱加密包括 RSA 加密, ECC 加密。
AES 演算法全稱 Advanced Encryption Standard ,是 DES 演算法的替代者,也是當今最流行的對稱加密演算法之一。
要想學習AES演算法,首先要弄清楚三個基本的概念:密鑰、填充、模式。
密鑰是 AES 演算法實現加密和解密的根本。對稱加密演算法之所以對稱,是因為這類演算法對明文的加密和解密需要使用同一個密鑰。
AES支持三種長度的密鑰:
128位,192位,256位
平時大家所說的AES128,AES192,AES256,實際上就是指的AES演算法對不同長度密鑰的使用。從安全性來看,AES256安全性最高。從性能來看,AES128性能最高。本質原因是它們的加密處理輪數不同。
要想了解填充的概念,我們先要了解AES的分組加密特性。AES演算法在對明文加密的時候,並不是把整個明文一股腦加密成一整段密文,而是把明文拆分成一個個獨立的明文塊,每一個明文塊長度128bit。
這些明文塊經過AES加密器的復雜處理,生成一個個獨立的密文塊,這些密文塊拼接在一起,就是最終的AES加密結果。
但是這里涉及到一個問題:
假如一段明文長度是192bit,如果按每128bit一個明文塊來拆分的話,第二個明文塊只有64bit,不足128bit。這時候怎麼辦呢?就需要對明文塊進行填充(Padding)。AES在不同的語言實現中有許多不同的填充演算法,我們只舉出集中典型的填充來介紹一下。
不做任何填充,但是要求明文必須是16位元組的整數倍。
如果明文塊少於16個位元組(128bit),在明文塊末尾補足相應數量的字元,且每個位元組的值等於缺少的字元數。
比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個位元組,則補全為{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
如果明文塊少於16個位元組(128bit),在明文塊末尾補足相應數量的位元組,最後一個字元值等於缺少的字元數,其他字元填充隨機數。
比如明文:{1,2,3,4,5,a,b,c,d,e},缺少6個位元組,則可能補全為{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}
需要注意的是,如果在AES加密的時候使用了某一種填充方式,解密的時候也必須採用同樣的填充方式。
AES的工作模式,體現在把明文塊加密成密文塊的處理過程中。AES加密演算法提供了五種不同的工作模式:
ECB、CBC、CTR、CFB、OFB
模式之間的主題思想是近似的,在處理細節上有一些差別。我們這一期只介紹各個模式的基本定義。
電碼本模式 Electronic Codebook Book
密碼分組鏈接模式 CipherBlock Chaining
計算器模式 Counter
密碼反饋模式 CipherFeedBack
輸出反饋模式 OutputFeedBack
如果在AES加密的時候使用了某一種工作模式,解密的時候也必須採用同樣的工作模式。
AES加密主要包括兩個步驟: 密鑰擴展 和 明文加密 。
密鑰擴展過程說明(密鑰為16位元組):
函數g的流程說明:
輪常量(Rcon)是一個字,最右邊三個位元組總為0。因此字與Rcon相異或,其結果只是與該字最左的那個位元組相異或。每輪的輪常量不同,定位為Rcon[j] = (RC[j], 0, 0, 0)。(RC是一維數組)
RC生成函數:RC[1] = 1, RC[j] = 2 * RC[j – 1]。
因為16位元組密鑰的只進行10輪的擴展,所以最後生成的RC[j]的值按16進製表示為:
十輪的密鑰擴展後,就能生成44個字大小的擴展密鑰。擴展後的密鑰將用於AES對明文的加密過程。
S盒是16×16個位元組組成的矩陣,行列的索引值分別從0開始,到十六進制的F結束,每個位元組的范圍為(00-FF)。
進行位元組代替的時候,把狀態中的每個位元組分為高4位和低4位。高4位作為行值,低4位作為列值,以這些行列值作為索引從S盒的對應位置取出元素作為輸出,如下圖所示:
S盒的構造方式如下:
(1) 按位元組值得升序逐行初始化S盒。在行y列x的位元組值是{yx}。
(2) 把S盒中的每個位元組映射為它在有限域GF中的逆;{00}映射為它自身{00}。
(3) 把S盒中的每個位元組的8個構成位記為(b7, b6, b5, b4, b3, b2, b1)。對S盒的每個位元組的每個位做如下的變換:
ci指的是值為{63}的位元組c的第i位。
解密過程逆位元組代替使用的是逆S盒,構造方式為
位元組d={05}。
逆向行移位將狀態中後三行執行相反方向的移位操作,如第二行向右循環移動一個位元組,其他行類似。
要注意,圖示的矩陣的乘法和加法都是定義在GF(2^8)上的。
逆向列混淆原理如下:
輪密鑰加後的分組再進行一次輪密鑰加就能恢復原值.所以,只要經過密鑰擴展和明文加密,就能將明文加密成密文,進行解密的時候,只需要進行逆向變換即可。
圖[AES加密演算法的流程]中還需要注意,明文輸入到輸入狀態後,需要進行一輪的輪密鑰加,對輸入狀態進行初始化。 前9輪的加密過程,都需要進行位元組替代、行移位、列混淆和輪密鑰加,但是第10輪則不再需要進行列混淆。
進行解密的時候,需要進行逆向位元組替代,逆向行移位、逆向列混淆和輪密鑰加。
『肆』 使用C/C++語言,將DES/AES加密演算法,用代碼實現
哎,學校大作業吧。核心是des和aes的演算法唄,自己一點點寫代碼量不很少呢。沒時間給你寫了。
不過有個很好的偷懶辦法:建議lz你去找一下OpenSSL的源碼。裡面有AES,DES的原生C實現。現成函數。lz你直接從裡面摳出來復制到你工程里就行了。。
『伍』 對稱加密演算法AES
AES(Advanced Encryption Standard),高級加密標准,對稱演算法,是下一代的加密演算法標准,速度快,安全級別高,在21世紀AES 標准簡握仿的一個實現是 Rijndael 演算法;
AES加密演算法是密碼學中的高級加密標准攔纖,該加密演算法採用對稱分組密碼體制,密鑰長度的最少支持為皮洞128、192、256,分組長度128位,演算法應易於各種硬體和軟體實現。這種加密演算法是美國聯邦政府採用的區塊加密標准,這個標准用來替代原先的DES,已經被多方分析且廣為全世界所使用。
它適用於敏感內容進行加密傳輸,防止被竊取。
『陸』 [簡述AES高級加密標准]簡述加密和解密技術的工作機制
1 引言 隨著網際網路的發展,信息傳輸及存儲的安全問題成為影響網際網路應用發展的重要因素。信息安全技術也就成為了人們研究網際網路應用的新熱點。 信息安全的研究包括密碼理論與技術、安全協議睜檔野與技術、安全體系結構理論、信息對抗理論與技術、網路安全與安全產品等領域,其中密碼演算法的理論與實現研究是信息安全研究的基礎。
2 AES加密標准
1977年1月公布的數據加密標准DES(Data Encrption Standard)經過20年的實踐應用後,現在已被認為是不可靠的。1997年1月美國國家標准和技術研究所(NIST)發布了高級加密標准(AES- FIPS)的研發計劃,並於同年9月正式發布了徵集候選演算法公告[1],NIST希望確定一種保護敏感信息的公開、免費並且全球通用的演算法作為AES,以代替DES。NIST對演算法的基本要求是:演算法必須是私鑰體制的分組密碼,支持128位分組長度和129、192、256bits密鑰長度。
3 AES的研究現狀
從1997年NIST發布了高級加密標准AES的研發計劃到現在,對AES的研究大致可以分成三個階段。第一階段是從1997到2000年,研究的主要方向是提出候選演算法並對各候選演算法的性能進行分析。在此期間共提出了十五個候選演算法,最終Rijndael演算法勝出並用於AES中。Rijndael演算法是一種蠢塌可變分組長度和密鑰長度的迭代型分組密碼,它的分組長度和密鑰長度均可獨立地指定為128bits、192bits、256bits,它以其多方面的優良性能,成為AES的最佳選擇。Rijndael演算法能抵抗現在的所有己知密碼攻擊,它的密鑰建立時間極短且靈活性強,它極低的內存要求使其非常適合在存儲器受限的環境中使用,悉喊並且表現出很好的性能。第二階段是從2000年Rijndael演算法勝出後到2001年NIST發布FIPS PUBS 197文件前。在此階段對AES的研究轉到了對Rijndael演算法的研究和分析、設計AES的工作模式上。第三階段是從FIPS PUBS 197發布到現在。在此階段,研究的方向可以分成兩個主要方向:一個是繼續研究Rijndael演算法本身的性能,特別是其安全性分析;另一個就是AES的實現和應用的研究。
演算法設計主要研究演算法設計遵循的原則和整體結構,為性能分析提供了一條途徑。從演算法的結構上分析演算法性能是簡單有效的,研究演算法整體結構上的缺陷為提出新的密碼分析方法提供新的手段。另一方面,研究AES的演算法設計對研發新的分組密碼提供了設計原則和參考。目前分組數據加密演算法的整體結構有兩大類:Feistel網路、非平衡Feistel網路和SP網路。
性能分析主要研究演算法的各項特性,性能分析主要可以分為實現分析和密碼分析兩類。實現分析主要研究AES演算法可實現的能力。當前實現性分析主要集中在AES的硬、軟體實現的難易度和實現演算法的效率等領域中。密碼分析則是在理論上對現有加密演算法進行研究的主要方向。密碼分析主要研究AES演算法抵抗現有己知密碼攻擊的能力,即演算法的安全性分析。當前主要攻擊手段有:強力攻擊、差分密碼分析[2][3]、 線性密碼分析[4]、Square攻擊和插值攻擊等。
但是隨著密碼分析技術的不斷發展,積分分析、功耗分析和代數攻擊等新的密碼分析手段陸續出現。它們己成為密碼分析新的研究方向[5]。
4 AES的實現
對於AES實現的研究主要集中在軟體實現和硬體實現兩個領域中。AES標准所選擇的Rijndael演算法遵循了分組密碼設計的實現性原則,十分方便在軟、硬體上實現。從AES實現的角度上看,當前研究的主要方向在各個演算法步驟的優化實現。演算法步驟針對不同的實現環境進行優化後,在應用中能獲取更好的實際數據加密效果。其主要的研究成果集中在S-盒的生成演算法優化、輪變換過程優化和密鑰擴展優化三個方面。下面就軟體實現和硬體實現在這三個方面的研究現狀做一個簡單介紹:
(1) 在微機上通過軟體實現。這是利用AES演算法保障計算機信息安全,特別是網路中信息傳輸與存儲安全的主要途徑。在軟體實現中,輪變換過程優化則是軟體實現演算法優化的主要研究方向。密鑰擴展優化也是研究的重點之一。AES所提供的密鑰擴展方案保證了密鑰擴展過程中的雪崩效應,也保證了密鑰擴展方案的易實現性。此外,將其他的理論研究應用到分組數據加密演算法中,也是實現研究的一個重要方向。
(2) 通過硬體晶元實現。AES演算法對於存儲空間的要求較小,演算法過程相對比較簡單,特別是經過有針對性的實現演算法優化和精簡後很易於利用硬體電路實現,因此現在許多相關的商業產品都是基於密碼晶元的。
5 AES研究意義
目前,DES加密標准正在逐漸淡出加密標準的舞台,新加密標准AES正在獲得越來越多的重視及應用。面對未來的發展,對AES產品的需求是非常巨大的。因此,對AES實現的探討和研究具有很大的理論意義和實踐意義。
――――――――――
參考文獻
[1]褚振勇,翁木雲.FPGA設計及應用.西安電子科技大學出版社,2002,7.
[2]李玉山,來新泉.電子系統集成設計技術.電子工業出版社,2002,10.
[3]牛風舉,劉元成,朱明程.基於IP復用的數字IC設計技術,2003,9.
[4]Joan Daemon, Vincent Rijmen.高級加密標准(AES)演算法:Rijndael的設計.谷大武,徐勝波,譯.清華大學出版社,2003,3.
[5]Bruce Schneie.應用密碼學:協議、演算法與C源程序.昊世忠,祝世雄,張文政,等,譯.機械工業出版社,2000,1.
作者簡介:李佳(1976-),女,河北唐山人,講師,北京科技大學工程碩士,主要研究網路數據安全。
『柒』 加密演算法之AES
AES採用分組密碼體制,首先將明文分成以16個位元組長度為基準位元組段,如果最後不足16位元組則同樣使用填充。然後分組對每段位元組段進行加密得到密文,再將最後得到的密文拼接在一起形成最終的密文。AES演算法的密鑰長度可以分為128位,256位,512位。
整個加密過程如下圖所示:
功能實現,在客戶端中將明文進行AES加密後通過TCP鏈接發送至另一個客戶端,另一端通過密鑰對密文進行解密得到明文
『捌』 AES加密的詳細過程是怎麼樣的
AES加密演算法怎樣進行改進AES利用循環群復原復雜性作為安全依賴,改進演算法本身沒有特別的意義。只有在編程時利用指針縮短乘法運算的處理器時間才是最終方法。 熱心網友?aes加密演算法有多少種模式求AES加密中MixColumn函數的C語言寫法aes的解密演算法和加密演算法有什麼不同AES(Advanced Encryption Standard):高級加密標准,是下一代的加密演算法標准,速度快,安全級別高。 用AES加密2000年10月,NIST(美國國家標准和技術協會)宣布通過從15種候選演算法中選出的一項新的密匙加密標准。Rijndael被選中成為將來的AES。Rijndael是在1999年下半年,由研究員Joan Daemen 和 Vincent Rijmen 創建的。AES正日益成為加密各種形式的電子數據的實際標准。 美國標准與技術研究院(NIST)於2002年5月26日制定了新的高級加密標准(AES)規范。 演算法原理 AES演算法基於排列和置換運算。排列是對數據重新進行安排,置換是將一個數據單元替換為另一個。AES使用幾種不同的方法來執行排列和置換運算。AES是一個迭代的、對稱密鑰分組的密碼,它可以使用128、192和256位密鑰,並且用128位(16位元組)分組加密和解密數據。與公共密鑰加密使用密鑰對不同,對稱密鑰密碼使用相同的密鑰加密和解密數據。通過分組密碼返回的加密數據的位數與輸入數據相同。迭代加密使用一個循環結構,在該循環中重復置換和替換輸入數據。
『玖』 AES加密的詳細過程是怎麼樣的
詳細過程如下圖:
AES加密標准又稱為高級加密標准Rijndael加密法,是美國國家標准技術研究所NIST旨在取代DES的21世紀的加密標准。AES的基本要求是,採用對稱分組密碼體制,密鑰長度可以為128、192或256位,分組長度128位,演算法應易在各種硬體和軟體上實現。
1998年NIST開始AES第一輪分析、測試和徵集,共產生了15個候選演算法。
1999年3月完成了第二輪AES2的分析、測試。2000年10月2日美國政府正式宣布選中比利時密碼學家Joan Daemen和Vincent Rijmen提出的一種密碼演算法Rijndael作為AES的加密演算法。
AES加密數據塊和密鑰長度可以是128b、192b、256b中的任意一個。AES加密有很多輪的重復和變換。
『拾』 AES加密演算法原理
一般的加密通常都是塊加密,如果要加密超過塊大小的數據,就需要涉及填充和鏈加密模式,本文對對稱加密和分組加密中的幾種種模式進行一一分析(ECB、CBC、CFB、OFB,CTR)
這種模式是將整個明文分成若干段相同的小段,然後對每一小段進行加密。
優點:
這種模式是先將明文切分成若干小段,然後每一小段與初始塊或者上一段的密文段進行異或運算後,再與密鑰進行加密。
優點:
計算器模式不常見,在CTR模式中, 有一個自增的運算元,這個運算元用密鑰加密之後的輸出和明文異或的結果得到密文,相當於一次一密。這種加密方式簡單快速,安全可靠,而且可以並行加密,但是 在計算器不能維持很長的情況下,密鑰只能使用一次 。CTR的示意圖如下所示:
優點:
優點:
優點: