JCA 實(shí)踐記錄——Cipher

Cipher類提供加密和解密的功能扛邑。

實(shí)例化

Cipher沒有公開的構(gòu)造方法逗概,所以只能調(diào)用其靜態(tài)方法getInstace進(jìn)行實(shí)現(xiàn)化锹锰。這個(gè)方法有多個(gè)重載如下:

public static final Cipher getInstance(String algorithm) 
    throws NoSuchAlgorithmException, NoSuchPaddingException;


public static final Cipher getInstance(String algorithm, String provider ) 
    throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException;


public static final Cipher getInstance(String algorithm, Provider provider )
    throws NoSuchAlgorithmException, NoSuchPaddingException

我們通常使用的是public static final Cipher getInstance(String algorithm)拳亿;此方法需要一個(gè)字符串作為參數(shù)资盅,這個(gè)參數(shù)有以下兩種形式:

  1. "算法":使用Provider給定的默認(rèn)“模式”和“填充”调榄。
  2. "算法/模式/填充"

注:使用 CFB 和 OFB 之類的模式,Cipher 塊可以加密單元中小于該 Cipher 的實(shí)際塊大小的數(shù)據(jù)呵扛。請(qǐng)求這樣一個(gè)模式時(shí)每庆,可以指定一次處理的位數(shù)(可選):將此數(shù)添加到模式名稱中,正如 "DES/CFB8/NoPadding" 和 "DES/OFB32/PKCS5Padding" 轉(zhuǎn)換所示今穿。如果未指定該數(shù)缤灵,則將使用特定于提供者的默認(rèn)值。(例如,SunJCE 提供者對(duì) DES 使用默認(rèn)的 64 位)腮出。因此帖鸦,通過(guò)使用如 CFB8 或 OFB8 的 8 位模式,Cipher 塊可以被轉(zhuǎn)換為面向字節(jié)的 Cipher 流利诺。

需要了解的靜態(tài)字段

public static final int ENCRYPT_MODE  //用于將 Cipher 初始化為加密模式的常量富蓄。

public static final int DECRYPT_MODE  //用于將 Cipher 初始化為解密模式的常量。
public static final int WRAP_MODE   //用于將 Cipher 初始化為密鑰包裝模式的常量慢逾。
public static final int UNWRAP_MODE  //用于將 Cipher 初始化為密鑰解包模式的常量。
public static final int PUBLIC_KEY  //用于表示要解包的密鑰為“公鑰”的常量灭红。
public static final int PRIVATE_KEY  //用于表示要解包的密鑰為“私鑰”的常量侣滩。
public static final int SECRET_KEY  //用于表示要解包的密鑰為“秘密密鑰”的常量。

初始化方法

// 僅使用密鑰進(jìn)行初始化
public final void init(int mode, Key key) 
    throws InvalidKeyException

// 用密鑰和隨機(jī)源初始化此 Cipher变擒。
public final void init(int mode, Key key, SecureRandom random) 
    throws InvalidKeyException

//用密鑰和一組算法參數(shù)初始化此 Cipher君珠。
public final void init(int mode, Key key,
     AlgorithmParameterSpec paramSpcec) 
    throws InvalidKeyException, InvalidAlgorithmParameterException

// 用密鑰、一組算法參數(shù)和隨機(jī)源初始化此 Cipher娇斑。
public final void init(int mode, Key key,
     AlgorithmParameterSpec paramSpec, SecureRandom random)
     throws InvalidKeyException, InvalidAlgorithmParameterException

// 用密鑰和一組算法參數(shù)初始化此 Cipher策添。
public final void init(int mode, Key key, AlgorithmParameters param) 
    throws InvalidKeyException, InvalidAlgorithmParameterException

// 用密鑰、一組算法參數(shù)和隨機(jī)源初始化此 Cipher毫缆。
public final void init(int mode, Key key, 
    AlgorithmParameters param, SecureRandom random) 
    throws InvalidKeyException, InvalidAlgorithmParameterException

// 用取自給定證書的公鑰初始化此 Cipher唯竹。
public final void init(int mode, Certificate certificate) 
 throws InvalidKeyException

// 用取自給定證書的公鑰和隨機(jī)源初始化此 Cipher。
public final void init(int mode, Certificate certificate, 
    SecureRandom random) 
    throws InvalidKeyException

我們通常使用的是public final void init(int mode, Key key)苦丁。有四種mode可供選擇浸颓,分別對(duì)應(yīng)于Cipher中的四個(gè)常量如下:

  1. ENCRYPT_MODE 用于將 Cipher 初始化為加密模式。
  2. DECRYPT_MODE 用于將 Cipher 初始化為解密模式旺拉。
  3. WRAP_MODE 用于將 Cipher 初始化為密鑰包裝模式产上。
  4. UNWRAP_MODE 用于將 Cipher 初始化為密鑰解包模式。

如果此 Cipher 需要任何無(wú)法從給定 key 派生的算法參數(shù)蛾狗,則在為加密或密鑰包裝初始化時(shí)晋涣,底層 Cipher 實(shí)現(xiàn)應(yīng)自己生成所需的參數(shù)(使用特定于提供者的默認(rèn)值或隨機(jī)值);在為解密或密鑰解包初始化時(shí)沉桌,將引發(fā) InvalidKeyException谢鹊。可以用 getParameters 或 getIV 獲取生成的參數(shù)(如果該參數(shù)為 IV)蒲牧。

如果此 Cipher(包括其底層反饋或填充方案)需要隨機(jī)字節(jié)(例如撇贺,用于參數(shù)生成),那么它將使用具有最高優(yōu)先級(jí)的已安裝提供者的 SecureRandom 實(shí)現(xiàn)作為隨機(jī)源獲取這些字節(jié)冰抢。(如果已安裝的提供者都不提供 SecureRandom 實(shí)現(xiàn)松嘶,則將使用系統(tǒng)提供的隨機(jī)源)。

update 和 doFinal 方法

update方法有多個(gè)重載如下:

public final byte[] update(byte[] input)

public final byte[] update(byte[] input, int offset, int len)

public final int update(byte[] input, int offset, int len, byte[] output) 
    throws ShortBufferException

public final int update(byte[] input, int inOffset, int len, byte[] output, int outOffset) 
    throws ShortBufferException

public final int update(ByteBuffer input, ByteBuffer output) 
    throws ShortBufferException

// doFinal 方法除下面這個(gè)無(wú)參方法外挎扰,還有五個(gè)與update參數(shù)一致的重載方法翠订,
// 它們相當(dāng)于使用同樣的參數(shù)調(diào)用update后再調(diào)用無(wú)參doFinal
public final byte[] doFinal() 
    throws IllegalBlockSizeException, BadPaddingException

update方法有于在多部分加密或解密操作中處理其他未完成加密或解密的部分?jǐn)?shù)據(jù)巢音。doFinal則用于完成一次加密或解密操作,并將Cipher對(duì)象重置為上一次調(diào)用init方法時(shí)的狀態(tài)尽超。

wrap 和 unwrap 方法

public final byte[] wrap(Key key) 
    throws IllegalBlockSizeException, InvalidKeyException


public final Key unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
     throws InvalidKeyException, NoSuchAlgorithmException

wrap 方法用于包裝密鑰官撼,unwrap方法用于解包一個(gè)以前包裝的密鑰。兩者為互逆操作似谁。

在解包時(shí)參數(shù) wrappedKeyType 可以取三個(gè)值傲绣,它們都對(duì)應(yīng)于Cipher的靜態(tài)常量:

  1. PUBLIC_KEY 表示要解包的密鑰為“公鑰”。
  2. PRIVATE_KEY 表示要解包的密鑰為“私鑰”巩踏。
  3. SECRET_KEY 表示要解包的密鑰為“秘密密鑰”秃诵。

其他方法

  1. public final int getBlockSize() 返回塊的大小(以字節(jié)為單位)塞琼。
  2. public final int getOutputSize(int inputLen)根據(jù)給定的輸入長(zhǎng)度 inputLen(以字節(jié)為單位)菠净,返回保存下一個(gè) update 或 doFinal 操作結(jié)果所需的輸出緩沖區(qū)長(zhǎng)度(以字節(jié)為單位)。
  3. public final byte[] getIV() 返回新緩沖區(qū)中的初始化向量 (IV)
  4. public final AlgorithmParameters getParameters() 返回此 Cipher 使用的參數(shù)彪杉。返回的參數(shù)可能與初始化此 Cipher 所使用的參數(shù)相同毅往;如果此 Cipher 需要算法參數(shù)但卻未使用任何參數(shù)進(jìn)行初始化,則返回的參數(shù)將由默認(rèn)值和底層 Cipher 實(shí)現(xiàn)所使用的隨機(jī)參數(shù)值組成派近。

algorithm 參數(shù)支持的字符串:

  1. RSA
  2. DES
  3. DESede
  4. DESedeWrap
  5. PBEWithMD5AndDES
  6. PBEWithMD5AndTripleDES
  7. PBEWithSHA1AndDESede
  8. PBEWithSHA1AndRC2_40
  9. PBEWithSHA1AndRC2_128
  10. PBEWithSHA1AndRC4_40
  11. PBEWithSHA1AndRC4_128
  12. PBEWithHmacSHA1AndAES_128
  13. PBEWithHmacSHA224AndAES_128
  14. PBEWithHmacSHA256AndAES_128
  15. PBEWithHmacSHA384AndAES_128
  16. PBEWithHmacSHA512AndAES_128
  17. PBEWithHmacSHA1AndAES_256
  18. PBEWithHmacSHA224AndAES_256
  19. PBEWithHmacSHA256AndAES_256
  20. PBEWithHmacSHA384AndAES_256
  21. PBEWithHmacSHA512AndAES_256
  22. Blowfish
  23. AES
  24. AES_128/ECB/NoPadding
  25. AES_128/CBC/NoPadding
  26. AES_128/OFB/NoPadding
  27. AES_128/CFB/NoPadding
  28. AES_128/GCM/NoPadding
  29. AES_192/ECB/NoPadding
  30. AES_192/CBC/NoPadding
  31. AES_192/OFB/NoPadding
  32. AES_192/CFB/NoPadding
  33. AES_192/GCM/NoPadding
  34. AES_256/ECB/NoPadding
  35. AES_256/CBC/NoPadding
  36. AES_256/OFB/NoPadding
  37. AES_256/CFB/NoPadding
  38. AES_256/GCM/NoPadding
  39. AESWrap
  40. AESWrap_128
  41. AESWrap_192
  42. AESWrap_256
  43. RC2
  44. ARCFOUR
  45. Blowfish
  46. RSA/ECB/PKCS1Padding
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末攀唯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子构哺,更是在濱河造成了極大的恐慌革答,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件曙强,死亡現(xiàn)場(chǎng)離奇詭異残拐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)碟嘴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門溪食,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人娜扇,你說(shuō)我怎么就攤上這事错沃。” “怎么了雀瓢?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵枢析,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我刃麸,道長(zhǎng)醒叁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮把沼,結(jié)果婚禮上啊易,老公的妹妹穿的比我還像新娘。我一直安慰自己饮睬,他們只是感情好租谈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捆愁,像睡著了一般割去。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上昼丑,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天劫拗,我揣著相機(jī)與錄音,去河邊找鬼矾克。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憔足,可吹牛的內(nèi)容都是我干的胁附。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼滓彰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼控妻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起揭绑,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤弓候,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后他匪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菇存,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年邦蜜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了依鸥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡悼沈,死狀恐怖贱迟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情絮供,我是刑警寧澤衣吠,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站壤靶,受9級(jí)特大地震影響缚俏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一袍榆、第九天 我趴在偏房一處隱蔽的房頂上張望胀屿。 院中可真熱鬧,春花似錦包雀、人聲如沸宿崭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葡兑。三九已至,卻和暖如春赞草,著一層夾襖步出監(jiān)牢的瞬間讹堤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工厨疙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留洲守,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓沾凄,卻偏偏與公主長(zhǎng)得像梗醇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撒蟀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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

  • 1. ASCII 編碼 ASCII(American Standard Code for Information ...
    s酸菜閱讀 8,694評(píng)論 0 8
  • 1叙谨、不安全的隨機(jī)數(shù)生成,在CSRF TOKEN生成保屯、password reset token生成等手负,會(huì)造成toke...
    nightmare丿閱讀 3,705評(píng)論 0 1
  • 這篇文章主要講述在Mobile BI(移動(dòng)商務(wù)智能)開發(fā)過(guò)程中,在網(wǎng)絡(luò)通信姑尺、數(shù)據(jù)存儲(chǔ)竟终、登錄驗(yàn)證這幾個(gè)方面涉及的加密...
    雨_樹閱讀 2,475評(píng)論 0 6
  • 前言 《圖解密碼技術(shù)》一書介紹了很多關(guān)于密碼的知識(shí),通讀一遍需要不少時(shí)間股缸。為了方便學(xué)習(xí)衡楞,我對(duì)書中關(guān)鍵的部分進(jìn)行了總...
    咖枯閱讀 7,199評(píng)論 1 25
  • 眨眼之間,高考過(guò)去十年了敦姻,這不高中和的微信群里商量著高中同學(xué)十年聚會(huì)的事情瘾境,時(shí)間就在考試完了之后的時(shí)間,我思考了很...
    剽悍的兔子閱讀 310評(píng)論 0 0