java中的Cipher类(一)

2014-11-24 07:20:08 · 作者: · 浏览: 4

该类位于javax.crypto包下,声明为 public class Cipher extends Object

此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心。

为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求转换 的名称传递给它。还可以指定提供者的名称(可选)。

转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案。

转换具有以下形式:

算法/模式/填充”或

算法

(后一种情况下,使用模式和填充方案特定于提供者的默认值)。例如,以下是有效的转换:

     Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
 

使用 CFBOFB 之类的模式,Cipher 块可以加密单元中小于该 Cipher 的实际块大小的数据。请求这样一个模式时,可以指定一次处理的位数(可选):将此数添加到模式名称中,正如 "DES/CFB8/NoPadding" 和 "DES/OFB32/PKCS5Padding" 转换所示。如果未指定该数,则将使用特定于提供者的默认值。(例如,SunJCE 提供者对 DES 使用默认的 64 位)。因此,通过使用如 CFB8 或 OFB8 的 8 位模式,Cipher 块可以被转换为面向字节的 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、构造方法
protected Cipher(CipherSpi cipherSpi, Provider provider, String transformation)
参数: cipherSpi - 代理 provider - 提供者 transformation - 转换

3、方法摘要

①public static final Cipher getInstance(String transformation) 返回实现指定转换的 Cipher 对象。transformation - 转换的名称,例如 DES/CBC/PKCS5Padding

②public static final Cipher getInstance(String transformation, String provider) 返回实现指定转换的 Cipher 对象

③public static final Cipher getInstance(String transformation, Provider provider) 返回实现指定转换的 Cipher 对象。

④public final Provider getProvider() 返回此 Cipher 对象的提供者。

⑤public final String getAlgorithm() 返回此 Cipher 对象的算法名称。

⑥public final int getBlockSize() 返回块的大小(以字节为单位)。

⑦public final int getOutputSize(int inputLen)

根据给定的输入长度 inputLen(以字节为单位),返回保存下一个 updatedoFinal 操作结果所需的输出缓冲区长度(以字节为单位)。

此调用还考虑到任何取自上一个 update 调用的未处理(已缓存)数据和填充。

下一个 updatedoFinal 调用的实际输出长度可能小于此方法返回的长度。

参数: nputLen - 输入长度(以字节为单位)

返回: 所需的输出缓冲区大小(以字节为单位)

⑧public final byte[] getIV() 返回新缓冲区中的初始化向量 (IV)。

⑨public final AlgorithmParameters getParameters() 返回此 Cipher 使用的参数。返回的参数可能与初始化此 Cipher 所使用的参数相同;如果此 Cipher 需要算法参数但却未使用任何参数进行初始化,则返回的参数将由默认值和底层 Cipher 实现所使用的随机参数值组成。

⑩public final ExemptionMechanism getExemptionMechanism() 返回此 Cipher 使用的豁免 (exemption) 机制对象。

11、public final void init(int opmode, Key key) 用密钥初始化此 Cipher。

为以下 4 种操作之一初始化该 Cipher:加密、解密、密钥包装或密钥解包,具体取决于 opmode 的值。

如果此 Cipher 需要任何无法从给定 key 派生的算法参数,则在为加密或密钥包装初始化时,底层 Cipher 实现应自己生成所需的参数(使用特定于提供者的默认值或随机值);在为解密或密钥解包初始化时,将引发 InvalidKeyException。可以用 getParametersgetIV 获取生成的参数(如果该参数为 IV)。

如果此 Cipher(包括其底层反馈或填充方案)需要随机字节(例如,用于参数生成),那么它将使用具有最高优先级的已安装提供者的 SecureRandom 实现作为随机源获取这些字节。(如果已安装的提供者都不提供 SecureRandom 实现,则将使用系统提供的随机源)。

注意,初始化 Cipher 对象时,它将失去所有以前获得的状态。换句话说,初始化 Cipher 相当于创建该 Cipher 的一个新实例并将其初始化。

参数: opmode - 此 Cipher 的操作模式(为以下之一:ENCRYPT_MODEDECRYPT_MODEWRAP_MODEUNWRAP_MODE

key - 密钥

抛出: InvalidKeyException- 如果给定的 key 不适合初始化此 Cipher;如果此 Cipher 为解密初始化,并且所需算法参数无法从给定的 key 确定;如果给定 key 的键大小超出所允许的最大值(由已配置的仲裁策略文件确定)。

12、public final void init(int opmode, Key key, SecureRandom random) 用密钥和随机源初始化此 Cipher。

13、public final void init(int opmode, Key key, AlgorithmParameterSpec params) 用密钥和一组算法参数初始化此 Cipher。

14、public final void init(int opmode, Key key, AlgorithmParamet