caes128加密解密
① 如何使用CryptoJS的AES方法進行加密和解密
首先准備一份明文和秘鑰:
var plaintText = 'aaaaaaaaaaaaaaaa' // 明文
var keyStr = 'bbbbbbbbbbbbbbbb' // 一般key為一個字元串
參看官網文檔,AES方法是支持AES-128、AES-192和AES-256的,加密過程中使用哪種加密方式取決於傳入key的類型,否則就會按照AES-256的方式加密。
CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.
由於Java就是按照128bit給的,但是由於是一個字元串,需要先在前端將其轉為128bit的才行。
最開始以為使用CryptoJS.enc.Hex.parse就可以正確地將其轉為128bit的key。但是不然...
經過多次嘗試,需要使用CryptoJS.enc.Utf8.parse方法才可以將key轉為128bit的。好吧,既然說了是多次嘗試,那麼就不知道原因了,後期再對其進行更深入的研究。
// 字元串類型的key用之前需要用uft8先parse一下才能用
var key = CryptoJS.enc.Utf8.parse(keyStr);
由於後端使用的是PKCS5Padding,但是在使用CryptoJS的時候發現根本沒有這個偏移,查詢後發現PKCS5Padding和PKCS7Padding是一樣的東東,使用時默認就是按照PKCS7Padding進行偏移的。
// 加密
var encryptedData = CryptoJS.AES.encrypt(plaintText, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
由於CryptoJS生成的密文是一個對象,如果直接將其轉為字元串是一個Base64編碼過的,在encryptedData.ciphertext上的屬性轉為字元串才是後端需要的格式。
var encryptedBase64Str = encryptedData.toString();
// 輸出:'+ot8JuxWVdLgY=
console.log(encryptedBase64Str);
// 需要讀取encryptedData上的ciphertext.toString()才能拿到跟Java一樣的密文
var encryptedStr = encryptedData.ciphertext.toString();
// 輸出:'
console.log(encryptedStr);
由於加密後的密文為128位的字元串,那麼解密時,需要將其轉為Base64編碼的格式。
那麼就需要先使用方法CryptoJS.enc.Hex.parse轉為十六進制,再使用CryptoJS.enc.Base64.stringify將其變為Base64編碼的字元串,此時才可以傳入CryptoJS.AES.decrypt方法中對其進行解密。
// 拿到字元串類型的密文需要先將其用Hex方法parse一下
var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr);
// 將密文轉為Base64的字元串
// 只有Base64類型的字元串密文才能對其進行解密
var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr);
使用轉為Base64編碼後的字元串即可傳入CryptoJS.AES.decrypt方法中進行解密操作。
// 解密
var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
經過CryptoJS解密後,依然是一個對象,將其變成明文就需要按照Utf8格式轉為字元串。
// 解密後,需要按照Utf8的方式將明文轉位字元串
var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8);
console.log(decryptedStr); // 'aaaaaaaaaaaaaaaa'
② .ts視頻採用m3u8方式,已知是 AES-128 為加密方式,求教
下載到本地,包括ts視頻流/key文件/m3u8配置文件,通過ffmpeg解密獲取視頻。命令:ffmpeg.exe -allowed_extensions ALL -i xx.m3u8 -c -bsf:a aac_adtstoasc filename.mp4 即可獲得解密視頻
③ AES加密演算法256位密鑰與128位密鑰的不同是什麼
一、指代不同
1、256位密鑰:AES的區塊長度固定為256位,密鑰長度則可以是256。
2、128位密鑰:AES的區塊長度固定為128位,密鑰長度則可檔塌以是128。
二、安全性不同
1、256位密鑰:256位密鑰安全性高於128位密鑰。
2、128位密鑰:128位密鑰安全性低於256位密鑰。
(3)caes128加密解密擴展閱讀
AES和Rijndael加密法並不完全一樣(雖然在實際應用中二者可以者蠢皮互換),因為Rijndael加密法可以支持更大范圍的區塊和密鑰長度。
AES的區塊長度固定為128位,密鑰長度則可以是128,192或256位;而Rijndael使用的密鑰和區塊長度可以是32位的整數倍,以128位為下限,256位為上限。加密過程中使用的密鑰是由Rijndael密鑰生成方案產生。
對稱/分組密碼一般分為流加密(如OFB、CFB等)和塊加密(如ECB、CBC等)。對於流加密,需要將分組密碼轉化為流模式工作。對於塊加密(或稱分組加密),如果要加密超過塊大小的數據,就需要涉及填充和鏈加密模式。
ECB模式是最早採用和最簡單的模式,將加密的數據分成若干組,每組的大小跟加密密鑰長度相同,然後每組都用相同的密鑰進行加密。
④ 什麼是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#的AES加密解密問題
不是初學,而是對.net中所有的加解密方式都沒有弄清楚。不過別灰心——很多自以為會的人也沒有弄清。
首先,.net中類庫中支持各類摘要加解密方式。一般情況下我們將安全分為兩類,一類是摘要,一類是加解密。加密解又分為對稱與非對稱加解密。
在.net體系中,不管是摘要還是加解密,為了統一演算法方式,一律都是流方式進行的。不管是MD5摘要還是ADE/DES/TDES/RSA等等。一定要記住的第一條,是流方式進行的!
流——這個概念很多人也不清楚,因為stream的范圍還是非常的大的,有網路流responseStream等,基本文本流,IO流等等,在加密時我們使用了一個流叫「加解密流」CryptStream,該流用來實現加解密及摘要演算法等等。
那麼CryptoStream是個什麼流呢?它算是轉換流,把一種形式轉換成另一種形式,比如把密文轉換成明文或把明文換成密文。正常的情況下,我們可以用流寫流的方式來實現,比如MemoryStream來換流。當然,也可以把byte[]數組直接寫到流中。
流這部分說完了,那麼,其實我們如何區別CryptoStream是加密還是解密呢,除了說明之外,還是一個方式,就是看流的方式是讀還是寫!所以當我看到你的解密流中使用的方式竟然是Write,而不是Read,所以你對加解密方式並沒有真正理解。
比如,我們可以轉換後的流直接進行ReadToLine即可。
老實說,你這種寫法有很大問題——有關stream大部分都是非託管,所以一定要記著Dispose,或Close(Close時會自動調用Dispose)。防止出現錯誤等內存泄露。
有於加解密流,我們經常一句話,加密方式是Write,解密方式是Read!
⑥ [簡述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目前沒有演算法浮出水面。
AES暴力破解與密碼強度(如字串的MD5值就難,簡單字串在密碼字典排序告前,相對容易一些)和計算能力有關。但AES密鑰長度太長,各種排列組合簡直是天文數字,現有能力民間單機不可能破解。當然也可能一買彩票就中大獎,但似乎比那概率小得多。
⑧ aes加密演算法原理
AES是分組密鑰,演算法輸入128位數據,密鑰長度也是128位。用Nr表示對一個數據分組加密的輪數(加密輪數與密鑰長度的關系如表1所列)。每一輪都需要一個與輸入分組具有相同長度的擴展密鑰Expandedkey(i)的參與。由於外部輸入的加密密鑰K長度有限,所以在演算法中要用一個密鑰擴展程序(Keyexpansion)把外部密鑰K擴展成更長的比特串,以生成各輪的加密和解密密鑰。
1.1圈變化
AES每一個圈變換由以下三個層組成:
非線性層——進行Subbyte變換;
線行混合層——進行ShiftRow和MixColumn運算;
密鑰加層——進行AddRoundKey運算。
① Subbyte變換是作用在狀態中每個位元組上的一種非線性位元組轉換,可以通過計算出來的S盒進行映射。
② ShiftRow是一個位元組換位。它將狀態中的行按照不同的偏移量進行循環移位,而這個偏移量也是根據Nb的不同而選擇的[3]。
③ 在MixColumn變換中,把狀態中的每一列看作GF(28)上的多項式a(x)與固定多項式c(x)相乘的結果。 b(x)=c(x)*a(x)的系數這樣計算:
*運算不是普通的乘法運算,而是特殊的運算,即 b(x)=c(x)·a(x)(mod x4+1) 對於這個運算 b0=02。a0+03。a1+a2+a3 令xtime(a0)=02。a0
其中,符號「。」表示模一個八次不可約多項式的同餘乘法[3]。
對於逆變化,其矩陣C要改變成相應的D,即b(x)=d(x)*a(x)。
④ 密鑰加層運算(addround)是將圈密鑰狀態中的對應位元組按位「異或」。
⑤ 根據線性變化的性質[1],解密運算是加密變化的逆變化。