AES加密

簡介

AES 的出現(xiàn)赏寇,就是為了來替代原先的 DES 標(biāo)準(zhǔn)∩星ⅲ現(xiàn)在來說,AES 的用途還是非常廣泛的蒸其。
全稱為“Advanced Encryption Standard”,中文名“高級加密標(biāo)準(zhǔn)”库快,在密碼學(xué)中又稱 Rijndael 加密法枣接,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。AES 加密算法作為新一代的數(shù)據(jù)加密標(biāo)準(zhǔn)匯聚了強(qiáng)安全性缺谴、高性能但惶、高效率、易用和靈活等優(yōu)點湿蛔。AES 設(shè)計有三個密鑰長度:128膀曾,192,256 位阳啥。相對而言添谊,AES 的 128 密鑰比 DES 的 56 密鑰強(qiáng)了 1021 倍。
相對來說察迟,如果密鑰長度變長斩狱,那么IV向量的長度對應(yīng)的也要變長才行。應(yīng)為對于塊加密來說扎瓶,密鑰長度和IV向量的長度應(yīng)該是一致的所踊。

原理

ES 加密算法主要包括三個方面:輪變化、圈數(shù)和密鑰擴(kuò)展概荷。AES 是分組密鑰秕岛,算法輸入 128 位數(shù)據(jù),密鑰長度也是 128 位。用 Nr 表示對一個數(shù)據(jù)分組加密的輪數(shù)继薛。每一輪都需要一個與輸入分組具有相同長度的擴(kuò)展密鑰 Expandedkey(i) 的參與修壕。由于外部輸入的加密密鑰 K 長度有限,所以在算法中要用一個密鑰擴(kuò)展程序 (Keyexpansion) 把外部密鑰 K 擴(kuò)展成更長的比特串遏考,以生成各輪的加密和解密密鑰慈鸠。

輸出

入口參數(shù)有三個:key、data灌具、mode林束。

  • key 為加密解密使用的密鑰,長度為24字節(jié)
  • data 為加密 解密的數(shù)據(jù)稽亏,
  • mode 為其工作模式。
    密鑰是192位缕题,但是是分開使用的截歉,每個加密快的長度應(yīng)該還是8字節(jié)的整數(shù)倍
    記住:如果是有padding烟零,如果是明文如果是8字節(jié)的整數(shù)倍的話瘪松,加密的密文長度肯定要增加8個字節(jié),因為要有標(biāo)識

java demo

注意锨阿,如果是使用的cfb宵睦,ofb等需要初始化向量的加解密,則需要把iv也傳給解密器才行

/**
* 加密
 * 
* @param content 需要加密的內(nèi)容
 * @param password  加密密碼
* @return
 */ 
public static byte[] encrypt(String content, String password) { 
        try {            
                KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
                kgen.init(128, new SecureRandom(password.getBytes())); 
                SecretKey secretKey = kgen.generateKey(); 
                byte[] enCodeFormat = secretKey.getEncoded(); 
                SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); 
                Cipher cipher = Cipher.getInstance("AES");// 創(chuàng)建密碼器 
                byte[] byteContent = content.getBytes("utf-8"); 
                cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 
                byte[] result = cipher.doFinal(byteContent); 
                return result; // 加密 
        } catch (NoSuchAlgorithmException e) { 
                e.printStackTrace(); 
        } catch (NoSuchPaddingException e) { 
                e.printStackTrace(); 
        } catch (InvalidKeyException e) { 
                e.printStackTrace(); 
        } catch (UnsupportedEncodingException e) { 
                e.printStackTrace(); 
        } catch (IllegalBlockSizeException e) { 
                e.printStackTrace(); 
        } catch (BadPaddingException e) { 
                e.printStackTrace(); 
        } 
        return null; 
} 
 
2.2 解密
代碼有詳細(xì)注釋墅诡,不多廢話
注意:解密的時候要傳入byte數(shù)組
[java] view plain copy
/**解密
 * @param content  待解密內(nèi)容
* @param password 解密密鑰
* @return
 */ 
public static byte[] decrypt(byte[] content, String password) { 
        try { 
                 KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
                 kgen.init(128, new SecureRandom(password.getBytes())); 
                 SecretKey secretKey = kgen.generateKey(); 
                 byte[] enCodeFormat = secretKey.getEncoded(); 
                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");             
                 Cipher cipher = Cipher.getInstance("AES");// 創(chuàng)建密碼器 
                cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 
                byte[] result = cipher.doFinal(content); 
                return result; // 加密 
        } catch (NoSuchAlgorithmException e) { 
                e.printStackTrace(); 
        } catch (NoSuchPaddingException e) { 
                e.printStackTrace(); 
        } catch (InvalidKeyException e) { 
                e.printStackTrace(); 
        } catch (IllegalBlockSizeException e) { 
                e.printStackTrace(); 
        } catch (BadPaddingException e) { 
                e.printStackTrace(); 
        } 
        return null; 
}  

/**解密
 * @param content  待解密內(nèi)容
* @param password 解密密鑰
* @return
 */ 
public static byte[] decrypt(byte[] content, String password) { 
        try { 
                 KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
                 kgen.init(128, new SecureRandom(password.getBytes())); 
                 SecretKey secretKey = kgen.generateKey(); 
                 byte[] enCodeFormat = secretKey.getEncoded(); 
                 SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");             
                 Cipher cipher = Cipher.getInstance("AES");// 創(chuàng)建密碼器 
//            Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");// 這里使用的是這種方式的話壳嚎,在下面的init處就會報錯,因為沒有傳入iv向量
                cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 
                byte[] result = cipher.doFinal(content); 
                return result; // 加密 
        } catch (NoSuchAlgorithmException e) { 
                e.printStackTrace(); 
        } catch (NoSuchPaddingException e) { 
                e.printStackTrace(); 
        } catch (InvalidKeyException e) { 
                e.printStackTrace(); 
        } catch (IllegalBlockSizeException e) { 
                e.printStackTrace(); 
        } catch (BadPaddingException e) { 
                e.printStackTrace(); 
        } 
        return null; 
}  

 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末末早,一起剝皮案震驚了整個濱河市烟馅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌然磷,老刑警劉巖郑趁,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異姿搜,居然都是意外死亡寡润,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門舅柜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梭纹,“玉大人,你說我怎么就攤上這事致份±跗猓” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞬沦。 經(jīng)常有香客問我太伊,道長,這世上最難降的妖魔是什么逛钻? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任僚焦,我火速辦了婚禮,結(jié)果婚禮上曙痘,老公的妹妹穿的比我還像新娘芳悲。我一直安慰自己,他們只是感情好边坤,可當(dāng)我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布名扛。 她就那樣靜靜地躺著,像睡著了一般茧痒。 火紅的嫁衣襯著肌膚如雪肮韧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天旺订,我揣著相機(jī)與錄音弄企,去河邊找鬼。 笑死区拳,一個胖子當(dāng)著我的面吹牛拘领,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播樱调,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼约素,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了笆凌?” 一聲冷哼從身側(cè)響起业汰,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎菩颖,沒想到半個月后样漆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡晦闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年放祟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呻右。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡跪妥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出声滥,到底是詐尸還是另有隱情眉撵,我是刑警寧澤侦香,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站纽疟,受9級特大地震影響罐韩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜污朽,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一散吵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蟆肆,春花似錦矾睦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蛇损,卻和暖如春赁温,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背州藕。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留酝陈,地道東北人床玻。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像沉帮,于是被迫代替她去往敵國和親锈死。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 高級加密標(biāo)準(zhǔn)(英語:Advanced EncryptionStandard穆壕,縮寫:AES)待牵,在密碼學(xué)中又稱Rijn...
    黃曉果閱讀 11,059評論 0 2
  • 引用 AES加密算法原理AES加密算法的C++實現(xiàn)密碼算法詳解——AES(高級加密算法) 1. 前言 本文針對加密...
    碼夢的一生閱讀 15,593評論 2 3
  • AES(Advanced Encryption Standard) 高級加密標(biāo)準(zhǔn),是 DES(Data Encry...
    TIME_for閱讀 3,932評論 2 2
  • 變性是不可逆的喇勋!硬化了的蛋也孵不出小雞缨该!留著只會腐爛發(fā)臭!
    研究說明書閱讀 297評論 0 0
  • 我是一個二流大學(xué)的學(xué)生川背,有時候想著自己該過怎樣的生活贰拿,嘿嘿,只能想想熄云。我也曾想沖動一點不需要考慮后果膨更,不需要害怕受...
    愛做夢地孩子閱讀 477評論 1 0