看雪论坛追加加密解密
java中的Cipher類
該類位于javax.crypto包下,聲明為 public class Cipher extends Object 此類為加密和解密提供密碼功能。它構(gòu)成了?Java?Cryptographic Extension (JCE) 框架的核心。為創(chuàng)建 Cipher 對(duì)象,應(yīng)用程序調(diào)用 Cipher 的 getInstance 方法并將所請(qǐng)求轉(zhuǎn)換 的名稱傳遞給它。還可以指定提供者的名稱(可選)。轉(zhuǎn)換 是一個(gè)字符串,它描述為產(chǎn)生某種輸出而在給定的輸入上執(zhí)行的操作(或一組操作)。轉(zhuǎn)換始終包括加密算法的名稱(例如,DES),后面可能跟有一個(gè)反饋模式和填充方案。?
轉(zhuǎn)換具有以下形式:?
算法/模式/填充”或 算法”?
(后一種情況下,使用模式和填充方案特定于提供者的默認(rèn)值)。例如,以下是有效的轉(zhuǎn)換:?
Cipher c = Cipher.getInstance(“DES/CB/PKCS5Padding“);
使用 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 位)。因此,通過使用如 CFB8 或 OFB8 的 8 位模式,Cipher 塊可以被轉(zhuǎn)換為面向字節(jié)的 Cipher 流。
1、字段?
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 用于表示要解包的密鑰為“秘密密鑰”的常量。
2、構(gòu)造方法
protected?Cipher(CipherSpi cipherSpi, Provider provider, String transformation)?
參數(shù):cipherSpi - 代理 provider - 提供者 transformation - 轉(zhuǎn)換
3、方法摘要
①public static final Cipher getInstance(String transformation) 返回實(shí)現(xiàn)指定轉(zhuǎn)換的 Cipher 對(duì)象。transformation - 轉(zhuǎn)換的名稱,例如 DES/CBC/PKCS5Padding
②public static final Cipher getInstance(String transformation, String provider) 返回實(shí)現(xiàn)指定轉(zhuǎn)換的 Cipher 對(duì)象
③public static final Cipher getInstance(String transformation, Provider provider) 返回實(shí)現(xiàn)指定轉(zhuǎn)換的 Cipher 對(duì)象。
④public final Provider getProvider() 返回此 Cipher 對(duì)象的提供者。
⑤public final String getAlgorithm() 返回此 Cipher 對(duì)象的算法名稱。
⑥public final int getBlockSize() 返回塊的大小(以字節(jié)為單位)。
⑦public final int getOutputSize(int inputLen)
根據(jù)給定的輸入長(zhǎng)度 inputLen(以字節(jié)為單位),返回保存下一個(gè) update 或 doFinal 操作結(jié)果所需的輸出緩沖區(qū)長(zhǎng)度(以字節(jié)為單位)。
此調(diào)用還考慮到任何取自上一個(gè) update 調(diào)用的未處理(已緩存)數(shù)據(jù)和填充。
下一個(gè) update 或 doFinal 調(diào)用的實(shí)際輸出長(zhǎng)度可能小于此方法返回的長(zhǎng)度。
參數(shù): nputLen - 輸入長(zhǎng)度(以字節(jié)為單位)
返回: 所需的輸出緩沖區(qū)大小(以字節(jié)為單位)
⑧public final byte[] getIV() 返回新緩沖區(qū)中的初始化向量 (IV)。
⑨public final AlgorithmParameters getParameters() 返回此 Cipher 使用的參數(shù)。返回的參數(shù)可能與初始化此 Cipher 所使用的參數(shù)相同;如果此 Cipher 需要算法參數(shù)但卻未使用任何參數(shù)進(jìn)行初始化,則返回的參數(shù)將由默認(rèn)值和底層 Cipher 實(shí)現(xiàn)所使用的隨機(jī)參數(shù)值組成。
⑩public final ExemptionMechanism getExemptionMechanism() 返回此 Cipher 使用的豁免 (exemption) 機(jī)制對(duì)象。
11、public final void init(int opmode, Key key) 用密鑰初始化此 Cipher。
為以下 4 種操作之一初始化該 Cipher:加密、解密、密鑰包裝或密鑰解包,具體取決于 opmode 的值。
如果此 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ī)源)。
注意,初始化 Cipher 對(duì)象時(shí),它將失去所有以前獲得的狀態(tài)。換句話說(shuō),初始化 Cipher 相當(dāng)于創(chuàng)建該 Cipher 的一個(gè)新實(shí)例并將其初始化。
參數(shù): opmode - 此 Cipher 的操作模式(為以下之一:ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE 或 UNWRAP_MODE)
key - 密鑰
拋出: InvalidKeyException- 如果給定的 key 不適合初始化此 Cipher;如果此 Cipher 為解密初始化,并且所需算法參數(shù)無(wú)法從給定的 key 確定;如果給定 key 的鍵大小超出所允許的最大值(由已配置的仲裁策略文件確定)。
12、public final void init(int opmode, Key key, SecureRandom random) 用密鑰和隨機(jī)源初始化此 Cipher。
13、public final void init(int opmode, Key key, AlgorithmParameterSpec params) 用密鑰和一組算法參數(shù)初始化此 Cipher。
14、public final void init(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random) 用一個(gè)密鑰、一組算法參數(shù)和一個(gè)隨機(jī)源初始化此 Cipher。
15、public final void init(int opmode, Key key, AlgorithmParameters params) 用密鑰和一組算法參數(shù)初始化此 Cipher。
16、public final void init(int opmode, Key key, AlgorithmParameters params, SecureRandom random) 用一個(gè)密鑰、一組算法參數(shù)和一個(gè)隨機(jī)源初始化此 Cipher。
17、public final void init(int opmode, Certificate certificate) 用取自給定證書的公鑰初始化此 Cipher。
18、public final void init(int opmode, Certificate certificate, SecureRandom random) 用取自給定證書的公鑰和隨機(jī)源初始化此 Cipher。
19、public final byte[] update(byte[] input) 繼續(xù)多部分加密或解密操作(具體取決于此 Cipher 的初始化方式),以處理其他數(shù)據(jù)部分。 處理 input 緩沖區(qū)中的字節(jié),并將結(jié)果存儲(chǔ)在新的緩沖區(qū)中。 如果 input 長(zhǎng)度為 0,則此方法返回 null。
20、public final byte[] update(byte[] input, int inputOffset,int inputLen) 繼續(xù)多部分加密或解密操作(具體取決于此 Cipher 的初始化方式),以處理其他數(shù)據(jù)部分。
21、public final int update(byte[] input, int inputOffset, int inputLen, byte[] output) 繼續(xù)多部分加密或解密操作(具體取決于此 Cipher 的初始化方式),以處理其他數(shù)據(jù)部分。 處理 input 緩沖區(qū)中從 inputOffset 開始(包含)的前 inputLen 個(gè)字節(jié),并將結(jié)果存儲(chǔ)在 output 緩沖區(qū)中。
如果 output 緩沖區(qū)太小無(wú)法保存該結(jié)果,則拋出 ShortBufferException。這種情況下,使用一個(gè)稍大的緩沖區(qū)再次調(diào)用。使用 getOutputSize 確定輸出緩沖區(qū)應(yīng)為多大。 如果 inputLen 為 0,則此方法返回的長(zhǎng)度為 0。
注:此方法應(yīng)該是復(fù)制安全 (copy-safe) 的,這意味著 input 和 output 緩沖區(qū)可引用相同的 byte 數(shù)組,并且在將結(jié)果復(fù)制到輸出緩沖區(qū)時(shí),不會(huì)覆蓋任何未處理的輸入數(shù)據(jù)。
22、public final int update(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) 繼續(xù)多部分加密或解密操作(具體取決于此 Cipher 的初始化方式),以處理其他數(shù)據(jù)部分。
23、public final int update(ByteBuffer input, ByteBuffer output) 繼續(xù)多部分加密或解密操作(具體取決于此 Cipher 的初始化方式),以處理其他數(shù)據(jù)部分。
24、public final byte[] doFinal() throws IllegalBlockSizeException, BadPaddingException 結(jié)束多部分加密或解密操作(具體取決于此 Cipher 的初始化方式)。
處理在上一次 update 操作中緩存的輸入數(shù)據(jù),其中應(yīng)用了填充(如果請(qǐng)求)。結(jié)果將存儲(chǔ)在新緩沖區(qū)中。 結(jié)束時(shí),此方法將此 Cipher 對(duì)象重置為上一次調(diào)用 init 初始化得到的狀態(tài)。即該對(duì)象被重置,并可用于加密或解密(具體取決于調(diào)用 init 時(shí)指定的操作模式)更多的數(shù)據(jù)。
注:如果拋出了任何異常,則再次使用此 Cipher 對(duì)象前需要將其重置。?
返回: 包含結(jié)果的新緩沖區(qū) 拋出: IllegalStateException - 如果此 Cipher 處于錯(cuò)誤狀態(tài)(例如,尚未初始化) IllegalBlockSizeException - 如果此 Cipher 為 Cipher 塊,未請(qǐng)求任何填充(只針對(duì)加密模式),并且由此 Cipher 處理的數(shù)據(jù)總輸入長(zhǎng)度不是塊大小的倍數(shù);如果此加密算法無(wú)法處理所提供的輸入數(shù)據(jù)。 BadPaddingException - 如果此 Cipher 為解密模式,并且未請(qǐng)求填充(或不填充),但解密的數(shù)據(jù)沒有用適當(dāng)?shù)奶畛渥止?jié)進(jìn)行限制
25、public final int doFinal(byte[] output, int outputOffset) 結(jié)束多部分加密或解密操作(具體取決于此 Cipher 的初始化方式)。
26、public final byte[] doFinal(byte[] input) 按單部分操作加密或解密數(shù)據(jù),或者結(jié)束一個(gè)多部分操作。數(shù)據(jù)將被加密或解密(具體取決于此 Cipher 的初始化方式)。
27、public final byte[] doFinal(byte[] input, int inputOffset, int inputLen) 按單部分操作加密或解密數(shù)據(jù),或者結(jié)束一個(gè)多部分操作。數(shù)據(jù)將被加密或解密(具體取決于此 Cipher 的初始化方式)。
28、public final int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output) 按單部分操作加密或解密數(shù)據(jù),或者結(jié)束一個(gè)多部分操作。數(shù)據(jù)將被加密或解密(具體取決于此 Cipher 的初始化方式)。
29、public final int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) 按單部分操作加密或解密數(shù)據(jù),或者結(jié)束一個(gè)多部分操作。數(shù)據(jù)將被加密或解密(具體取決于此 Cipher 的初始化方式)。
30、public final int doFinal(ByteBuffer input, ByteBuffer output) 按單部分操作加密或解密數(shù)據(jù),或者結(jié)束一個(gè)多部分操作。數(shù)據(jù)將被加密或解密(具體取決于此 Cipher 的初始化方式)。
31、public final byte[] wrap(Keykey) throws IllegalBlockSizeException, InvalidKeyException 包裝密鑰。?
拋出:IllegalStateException - 如果此 Cipher 處于錯(cuò)誤狀態(tài)(例如,尚未初始化) IllegalBlockSizeException - 如果此 Cipher 為 Cipher 塊,未請(qǐng)求填充,并且要包裝的密鑰的編碼長(zhǎng)度不是塊大小的倍數(shù)。 InvalidKeyException - 如果不能用此 Cipher 包裝該密鑰,或者這樣做不安全(例如,將一個(gè)硬件保護(hù)的密鑰傳給只能用于軟件保護(hù)的 Cipher)。
32、?
??
1
public final Key?unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm,int wrappedKeyType)throws InvalidKeyException,NoSuchAlgorithmException 解包一個(gè)以前包裝的密鑰。?
參數(shù): wrappedKey - 要解包的密鑰。 wrappedKeyAlgorithm - 與此包裝密鑰關(guān)聯(lián)的算法。 wrappedKeyType - 已包裝密鑰的類型。此類型必須為 SECRET_KEY、PRIVATE_KEY 或 PUBLIC_KEY 之一。 返回: 解包的密鑰。 拋出: IllegalStateException - 如果此 Cipher 處于錯(cuò)誤狀態(tài)(例如,尚未初始化) NoSuchAlgorithmException - 如果沒有一個(gè)已安裝的提供者能夠針對(duì) wrappedKeyAlgorithm 創(chuàng)建類型為 wrappedKeyType 的密鑰。 InvalidKeyException - 如果 wrappedKey 不表示針對(duì) wrappedKeyAlgorithm 的類型為 wrappedKeyType 的已包裝密鑰。
33、public static final int getMaxAllowedKeyLength(String transformation) throws NoSuchAlgorithmException 根據(jù)所安裝的 JCE 仲裁策略文件,返回指定轉(zhuǎn)換的最大密鑰長(zhǎng)度。如果安裝了 JCE 無(wú)限制強(qiáng)度仲裁策略文件,則返回 Integer.MAX_VALUE?
參數(shù): transformation - Cipher 轉(zhuǎn)換。 返回: 最大密鑰長(zhǎng)度(以位為單位) 或 Integer.MAX_VALUE。 拋出: NullPointerException - 如果 transformation 為 null。 NoSuchAlgorithmException - 如果 transformation 不是有效的轉(zhuǎn)換,即格式不為“算法”或“算法/模式/填充”。
34、public static final AlgorithmParameterSpec getMaxAllowedParameterSpec(String transformation) throws NoSuchAlgorithmException?
根據(jù)仲裁策略文件,返回包含最大 Cipher 參數(shù)值的 AlgorithmParameterSpec 對(duì)象。如果安裝了 JCE 無(wú)限制強(qiáng)度仲裁策略文件,或者策略文件中對(duì)用于指定轉(zhuǎn)換的參數(shù)沒有最大限制,則返回 null。
參數(shù): transformation - Cipher 轉(zhuǎn)換。 返回: 保存最大值的 AlgorithmParameterSpec,或者返回 null。?
拋出: NullPointerException - 如果 transformation 為 null。 NoSuchAlgorithmException - 如果 transformation 不是有效的轉(zhuǎn)換,即格式不為“算法”或“算法/模式/填充”。
2. Java中的SecretKeyFactory類
SecretKeyFactory表示秘密密鑰的工廠。類聲明:public class SecretKeyFactory extends Object?
密鑰工廠用來(lái)將密鑰(類型 Key 的不透明加密密鑰)轉(zhuǎn)換為密鑰規(guī)范(底層密鑰材料的透明表示形式),反之亦然。秘密密鑰工廠只對(duì)秘密(對(duì)稱)密鑰進(jìn)行操作。
密鑰工廠為雙工模式,即其允許根據(jù)給定密鑰規(guī)范(密鑰材料)構(gòu)建不透明密鑰對(duì)象,或以適當(dāng)格式獲取密鑰對(duì)象的底層密鑰材料。
應(yīng)用程序開發(fā)人員應(yīng)參閱其提供者文檔,找出 generateSecret和 getKeySpec方法所支持的密鑰規(guī)范。例如,”SunJCE” 提供者提供的 DES 秘密密鑰工廠支持 DESKeySpec 作為 DES 密鑰的透明表示形式,并且該提供者的 Triple DES 密鑰的秘密密鑰工廠支持 DESedeKeySpec 作為 Triple DES 密鑰的透明表示形式。
1、構(gòu)造方法:protected SecretKeyFactory(SecretKeyFactorySpi keyFacSpi, Provider provider, String algorithm) 用來(lái)創(chuàng)建一個(gè) SecretKeyFactory 對(duì)象。?
參數(shù):
keyFacSpi - 委托
provider - 提供者
algorithm - 秘密密鑰算法
2、方法詳細(xì):
①public static final SecretKeyFactory getInstance(String algorithm) throws NoSuchAlgorithmException
返回轉(zhuǎn)換指定算法的秘密密鑰的 SecretKeyFactory 對(duì)象
此方法從首選 Provider 開始遍歷已注冊(cè)安全提供者列表。返回一個(gè)封裝 SecretKeyFactorySpi 實(shí)現(xiàn)的新 SecretKeyFactory 對(duì)象,該實(shí)現(xiàn)取自支持指定算法的第一個(gè) Provider。
注意,可以通過 Security.getProviders() 方法獲取已注冊(cè)提供者列表。?
參數(shù):
algorithm - 所請(qǐng)求的秘密密鑰算法的標(biāo)準(zhǔn)名稱。有關(guān)標(biāo)準(zhǔn)算法名稱的信息,請(qǐng)參閱?java?Cryptography Architecture Reference Guide中的附錄 A
拋出:NoSuchAlgorithmException - 如果沒有任何 Provider 支持指定算法的 SecretKeyFactorySpi 實(shí)現(xiàn)。
②public static final SecretKeyFactory getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
返回轉(zhuǎn)換指定算法的秘密密鑰的 SecretKeyFactory 對(duì)象。
返回一個(gè)封裝 SecretKeyFactorySpi 實(shí)現(xiàn)的新 SecretKeyFactory 對(duì)象,該實(shí)現(xiàn)取自指定的提供者。指定提供者必須在安全提供者列表中注冊(cè)。
拋出異常:?
NoSuchAlgorithmException - 如果不能從指定提供者獲得指定算法的 SecretKeyFactorySpi 實(shí)現(xiàn)。 NullPointerException - 如果指定的算法為 null。 NoSuchProviderException - 如果指定提供者未在安全提供者列表中注冊(cè)。 IllegalArgumentException - 如果 provider 為 null 或空。
③public static final SecretKeyFactory getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException
返回轉(zhuǎn)換指定算法的秘密密鑰的 SecretKeyFactory 對(duì)象。
返回一個(gè)封裝 SecretKeyFactorySpi 實(shí)現(xiàn)的新 SecretKeyFactory 對(duì)象,該實(shí)現(xiàn)取自指定的 Provider 對(duì)象。注意,指定 Provider 對(duì)象無(wú)需在提供者列表中注冊(cè)。
拋出異常:?
NullPointerException - 如果指定的算法為 null。 NoSuchAlgorithmException - 如果不能從指定的 Provider 對(duì)象獲得指定算法的 SecretKeyFactorySpi 實(shí)現(xiàn)。 IllegalArgumentException - 如果 provider 為 null。
④public final Provider getProvider() 返回此 SecretKeyFactory 對(duì)象的提供者。
⑤public final String getAlgorithm()
返回此 SecretKeyFactory 對(duì)象的算法名稱。 此名稱與在某個(gè)創(chuàng)建此 SecretKeyFactory 對(duì)象的 getInstance 調(diào)用中指定的名稱相同。
⑥public final SecretKey generateSecret(KeySpec keySpec) throws InvalidKeySpecException 根據(jù)提供的密鑰規(guī)范(密鑰材料)生成 SecretKey 對(duì)象。
參數(shù):keySpec - 秘密密鑰的規(guī)范(密鑰材料)?
返回:秘密密鑰拋出: InvalidKeySpecException - 如果給定密鑰規(guī)范不適合生成秘密密鑰的秘密密鑰工廠。?
⑦public final KeySpec getKeySpec(SecretKey key, Class keySpec) throws InvalidKeySpecException 以請(qǐng)求的格式返回給定密鑰對(duì)象的規(guī)范(密鑰材料)。參數(shù):key - 密鑰 keySpec - 所請(qǐng)求的格式,密鑰材料將以此格式返回 返回:所請(qǐng)求格式的底層密鑰規(guī)范(密鑰材料) 拋出:InvalidKeySpecException - 如果所請(qǐng)求的密鑰規(guī)范不適合給定的密鑰(例如,與 key 和 keySpec 關(guān)聯(lián)的算法不匹配,或者 key 在加密硬件設(shè)備上引用一個(gè)密鑰而 keySpec 是基于軟件的密鑰規(guī)范),或者無(wú)法處理給定的密鑰(例如,給定的密鑰具有此秘密密鑰工廠不支持的算法或格式)。?
⑧public final SecretKey translateKey(SecretKey key) throws InvalidKeyException將一個(gè)密鑰對(duì)象(其提供者未知或可能不受信任)轉(zhuǎn)換為此秘密密鑰工廠的相應(yīng)密鑰對(duì)象。參數(shù):key - 其提供者未知或不受信任的密鑰 返回:已轉(zhuǎn)換的密鑰
拋出:InvalidKeyException - 如果此秘密密鑰工廠無(wú)法處理給定的密鑰。
例如下面例子:
try {// 獲取密鑰工廠類對(duì)象SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");byte[] DESkey = "abcdefghijk".getBytes("UTF-8");// 設(shè)置密鑰DESKeySpec keySpec = new DESKeySpec(DESkey);// 設(shè)置密鑰參數(shù)Key key = keyFactory.generateSecret(keySpec);// 得到密鑰對(duì)象 } catch (Exception e) {e.printStackTrace(); }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
3.類PBEKeySpec
所有已實(shí)現(xiàn)的接口:?
KeySpec
public class PBEKeySpec extends Object implements KeySpec
可隨同基于密碼的加密法 (PBE) 使用的供用戶選擇的密碼。
可以將密碼視為某種原始密鑰內(nèi)容,由此加密機(jī)制使用其導(dǎo)出一個(gè)密鑰。
不同的 PBE 機(jī)制可能對(duì)每一個(gè)密碼字符使用不同的位數(shù)。例如,在 PKCS #5 中定義的 PEB 機(jī)制僅僅關(guān)注每一個(gè)字符的低 8 位,而 PKCS #12 關(guān)注每一個(gè)字符的全 16 位。
通過創(chuàng)建一個(gè)合適的密鑰工廠實(shí)例來(lái)將密碼轉(zhuǎn)換成為一個(gè) PBE 密鑰。例如,PKCS #5 的密鑰工廠僅根據(jù)每個(gè)密碼字符的低 8 位來(lái)構(gòu)造 PBE 密鑰,而 PKCS #12 的密鑰工廠將使用每個(gè)字符的全 16 位。
還要注意,此類以 char 數(shù)組而不是 String 對(duì)象的形式存儲(chǔ)密碼(這可能更具邏輯性),因?yàn)?String 類是不可變的,當(dāng)不再需要存儲(chǔ)在其中的密碼時(shí)沒有任何途徑來(lái)重寫其內(nèi)部值。因此,此類需要以 char 數(shù)組作密碼,以便在完成后進(jìn)行重寫。詳細(xì)的見Java的文檔:http://download.oracle.com/technetwork/java/javase/6/docs/zh/api/javax/crypto/spec/PBEKeySpec.html
4.一個(gè)完整的例子
package cn.date20150908.com;import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream;import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import javax.management.PersistentMBean;public class MyPbe {public static void main(String[] args)throws Exception{//定義需要進(jìn)行加密的數(shù)據(jù) String pass="liyanhao";System.out.println("加密前的數(shù)據(jù):"+pass);//對(duì)數(shù)據(jù)進(jìn)行加密 secretEncrypt(pass);//對(duì)數(shù)據(jù)進(jìn)行解密 secretDecrypt("c:/PBencrypted.data","c:/PBsecret.key"); }public static void secretEncrypt(String data) throws Exception{//使用PBEWithMD5AndDES算法獲取Cipher實(shí)例Cipher cipher=Cipher.getInstance("PBEWithMD5AndDES");//初始化密鑰(跟cipher的初始化的參數(shù)是相同的)SecretKeyFactory keyFactory=SecretKeyFactory.getInstance("PBEWithMD5AndDES");PBEKeySpec pbeKeySpec=new PBEKeySpec("password".toCharArray());SecretKey secretKey = keyFactory.generateSecret(pbeKeySpec);//初始化Cipher為加密器 /*PBEParameterSpecpublic PBEParameterSpec(byte[] salt,int iterationCount)為 PKCS #5 標(biāo)準(zhǔn)中所定義的基于密碼的加密法構(gòu)造一個(gè)參數(shù)集合。參數(shù):salt - salt。復(fù)制該 salt 的內(nèi)容來(lái)防止后續(xù)修改。iterationCount - 迭代計(jì)數(shù)。 拋出:NullPointerException - 如果 salt 為 null。*/PBEParameterSpec parameterSpec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8}, 1000);cipher.init(Cipher.ENCRYPT_MODE, secretKey,parameterSpec);//對(duì)數(shù)據(jù)進(jìn)行加密byte[] encryptedData =cipher.doFinal(data.getBytes());System.out.println("加密后的數(shù)據(jù)"+new String (encryptedData));//將密鑰進(jìn)行持久化和序列化FileOutputStream keyFos=new FileOutputStream("c:/PBsecret.key");ObjectOutputStream keyOos=new ObjectOutputStream(keyFos);keyOos.writeObject(secretKey);keyOos.close();keyOos.close();//將加密后的數(shù)據(jù)進(jìn)行持久化 FileOutputStream encryptedDataFos=new FileOutputStream("c:/PBencrypted.data");encryptedDataFos.write(encryptedData);encryptedDataFos.close();}public static void secretDecrypt(String dataPath,String keypath)throws Exception{//通過IO流獲得密鑰和加密數(shù)據(jù)FileInputStream keyFis=new FileInputStream(keypath);ObjectInputStream keyois=new ObjectInputStream(keyFis);//使用PBEWithMD5AndDES算法獲取Cipher實(shí)例Cipher cipher=Cipher.getInstance("PBEWithMD5AndDES");//初始化密鑰SecretKey secretKey=(SecretKey)keyois.readObject();keyois.close();//初始化Cipher為解密器PBEParameterSpec pbeParameterSpec=new PBEParameterSpec(new byte[]{1,2,3,4,5,6,7,8},1000 );cipher.init(Cipher.DECRYPT_MODE, secretKey,pbeParameterSpec);//獲得加密后的數(shù)據(jù)FileInputStream encryptedDataFis=new FileInputStream(dataPath);ByteArrayOutputStream bos=new ByteArrayOutputStream();copyStream(encryptedDataFis,bos);//獲得解密后的數(shù)據(jù) byte[] decryptedData =cipher.doFinal(bos.toByteArray());bos.close();encryptedDataFis.close();System.out.println("解密后的數(shù)據(jù)"+new String(decryptedData));}public static void copyStream(FileInputStream fis ,ByteArrayOutputStream bos) throws Exception{ byte[] buf = new byte[1024]; int len = -1; while((len=fis.read(buf))!=-1){ bos.write(buf,0,len); } } }總結(jié)
以上是生活随笔為你收集整理的看雪论坛追加加密解密的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017-AHU校赛网络赛解题报告
- 下一篇: WebRTC 的黎明