Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
使用 CFB
和 OFB
之类的模式,Cipher 块可以加密单元中小于该 Cipher 的实际块大小的数据。请求这样一个模式时,可以指定一次处理的位数(可选):将此数添加到模式名称中,正如 "DES/CFB8/NoPadding
" 和 "DES/OFB32/PKCS5Padding
" 转换所示。如果未指定该数,则将使用特定于提供者的默认值。(例如,SunJCE 提供者对 DES 使用默认的 64 位)。因此,通过使用如 CFB8 或 OFB8 的 8 位模式,Cipher 块可以被转换为面向字节的 Cipher 流。
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
(以字节为单位),返回保存下一个 update
或 doFinal
操作结果所需的输出缓冲区长度(以字节为单位)。
此调用还考虑到任何取自上一个 update
调用的未处理(已缓存)数据和填充。
下一个 update
或 doFinal
调用的实际输出长度可能小于此方法返回的长度。
参数: 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
。可以用 getParameters
或 getIV
获取生成的参数(如果该参数为 IV)。
如果此 Cipher(包括其底层反馈或填充方案)需要随机字节(例如,用于参数生成),那么它将使用具有最高优先级的已安装提供者的 SecureRandom
实现作为随机源获取这些字节。(如果已安装的提供者都不提供 SecureRandom 实现,则将使用系统提供的随机源)。
注意,初始化 Cipher 对象时,它将失去所有以前获得的状态。换句话说,初始化 Cipher 相当于创建该 Cipher 的一个新实例并将其初始化。
参数: opmode
- 此 Cipher 的操作模式(为以下之一:ENCRYPT_MODE
、DECRYPT_MODE
、WRAP_MODE
或 UNWRAP_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, AlgorithmParameterSpec params, SecureRandom random) 用一个密钥、一组算法参数和一个随机源初始化此 Cipher。
15、public final void init(int opmode, Key key, AlgorithmParameters params) 用密钥和一组算法参数初始化此 Cipher。
16、public final void init(int opmode, Key key, AlgorithmParameters params, SecureRandom random) 用一个密钥、一组算法参数和一个随机源初始化此 Cipher。
17、public final void init(int opmode, Certificate certificate) 用取自给定证书的公钥初始化此 Cipher。
18、public final void init(int opmode, Certificate certificate, SecureRandom random) 用取自给定证书的公钥和随机源初始化此 Cipher。
19、public final byte[] update(byte[] input) 继续多部分加密或解密操作(具体取决于此 Cipher 的初始化方式),以处理其他数据部分。 处理 input
缓冲区中的字节,并将结果存储在新的缓冲区中。 如果 input
长度为 0,则此方法返回 null
。
20、public final byte[] update(byte[] input, int inputOffset,int inputLen) 继续多部分加密或解密操作(具体取决于此 Cipher 的初始化方式),以处理其他数据部分。
21、public final int update(byte[] input, int inputOffset, int inputLen, byte[] output) 继续多部分加密或解密操作(具体取决于此 Cipher 的初始化方式),以处理其他数据部分。 处理 input
缓冲区中从 inputOffset
开始(包含)的前 inputLen
个字节,并将结果存储在 output
缓冲区中。
如果 output
缓冲区太小无法保存该结果,则抛出 ShortBufferException
。这种情况下,使用一个稍大的缓冲区再次调用。使用 getOutputSize
确定输出缓冲区应为多大。 如果 inputLen
为 0,则此方法返回的长度为 0。
注:此方法应该是复制安全 (copy-safe) 的,这意味着 input
和 output
缓冲区可引用相同的 byte 数组,并且在将结果复制到输出缓冲区时,不会覆盖任何未处理的输入数据。
22、public final int update(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) 继续多部分加密或解密操作(具体取决于此 Cipher 的初始化方式),以处理其他数据部分。
23、public final int update(ByteBuffer input, ByteBuffer output) 继续多部分加密或解密操作(具体取决于此 Cipher 的初始化方式),以处理其他数据部分。
24、public final byte[] doFinal() throws IllegalBlockSizeException, BadPaddingException 结束多部分加密或解密操作(具体取决于此 Cipher 的初始化方式)。
处理在上一次 update
操作中缓存的输入数据,其中应用了填充(如果请求)。结果将存储在新缓冲区中。 结束时,此方法将此 Cipher 对象重置为上一次调用 init
初始化得到的状态。即该对象被重置,并可用于加密或解密(具体取决于调用 init
时指定的操作模式)更多的数据。
注:如果抛出了任何异常,则再次使用此 Cipher 对象前需要将其重置。
返回: 包含结果的新缓冲区
IllegalStateException
- 如果此 Cipher 处于错误状态(例如,尚未初始化)
IllegalBlockSizeException
- 如果此 Cipher 为 Cipher 块,未请求任何填充(只针对加密模式),并且由此 Cipher 处理的数据总输入长度不是块大小的倍数;如果此加密算法无法处理所提供的输入数据。
BadPaddingException
- 如果此 Cipher 为解密模式,并且未请求填充(或不填充),但解密的数据没有用适当的填充字节进行限制
25、public final int doFinal(byte[] output, int outputOffset) 结束多部分加密或解密操作(具体取决于此 Cipher 的初始化方式)。
26、public final byte[] doFinal(byte[] input) 按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
27、public final byte[] doFinal(byte[] input, int inputOffset, int inputLen) 按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
28、public final int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output) 按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
29、public final int doFinal(byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) 按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
30、public final int doFinal(ByteBuffer input, ByteBuffer output) 按单部分操作加密或解密数据,或者结束一个多部分操作。数据将被加密或解密(具体取决于此 Cipher 的初始化方式)。
31、public final byte[] wrap(Keykey) throws IllegalBlockSizeException, InvalidKeyException 包装密钥。
抛出:IllegalStateException
- 如果此 Cipher 处于错误状态(例如,尚未初始化)
IllegalBlockSizeException
- 如果此 Cipher 为 Cipher 块,未请求填充,并且要包装的密钥的编码长度不是块大小的倍数。
InvalidKeyException
- 如果不能用此 Cipher 包装该密钥,或者这样做不安全(例如,将一个硬件保护的密钥传给只能用于软件保护的 Cipher)。
public final Key unwrap(byte[] wrappedKey, String wrappedKeyAlgorithm,int wrappedKeyType)throws InvalidKeyException,NoSuchAlgorithmException 解包一个以前包装的密钥。
wrappedKey
- 要解包的密钥。
wrappedKeyAlgorithm
- 与此包装密钥关联的算法。
wrappedKeyType
- 已包装密钥的类型。此类型必须为 SECRET_KEY
、PRIVATE_KEY
或 PUBLIC_KEY
之一。
返回: 解包的密钥。
IllegalStateException
- 如果此 Cipher 处于错误状态(例如,尚未初始化)
NoSuchAlgorithmException
- 如果没有一个已安装的提供者能够针对 wrappedKeyAlgorithm
创建类型为 wrappedKeyType
的密钥。
InvalidKeyException
- 如果 wrappedKey
不表示针对 wrappedKeyAlgorithm
的类型为 wrappedKeyType
的已包装密钥。
33、public static final int getMaxAllowedKeyLength(String transformation) throws NoSuchAlgorithmException 根据所安装的 JCE 仲裁策略文件,返回指定转换的最大密钥长度。如果安装了 JCE 无限制强度仲裁策略文件,则返回 Integer.MAX_VALUE
参数: transformation
- Cipher 转换。
返回: 最大密钥长度(以位为单位) 或 Integer.MAX_VALUE。
NullPointerException
- 如果 transformation
为 null。
NoSuchAlgorithmException
- 如果 transformation
不是有效的转换,即格式不为“算法”或“算法/模式/填充”。
34、public static final AlgorithmParameterSpec getMaxAllowedParameterSpec(String transformation) throws NoSuchAlgorithmException
根据仲裁策略文件,返回包含最大 Cipher 参数值的 AlgorithmParameterSpec 对象。如果安装了 JCE 无限制强度仲裁策略文件,或者策略文件中对用于指定转换的参数没有最大限制,则返回 null。
参数: transformation
- Cipher 转换。 返回: 保存最大值的 AlgorithmParameterSpec,或者返回 null。
抛出: NullPointerException
- 如果 transformation
为 null。
NoSuchAlgorithmException
- 如果 transformation
不是有效的转换,即格式不为“算法”或“算法/模式/填充”。
一、先看一个简单加密,解密实现1.1 加密/*** content: 加密内容* slatKey: 加密的盐,16位字符串* vectorKey: 加密的向量,16位字符串*/public String encrypt(String content, String slatKey, String vectorKey) throwsException {Cipher cipher= Cipher.g...
Cipher类为加密和解密提供密码功能。它构成了Java Cryptographic Extension(JCE)框架的核心。在本章的上述内容中,只完成了密钥的处理,并未完成加密与解密的操作。这些核心操作需要通过Cipher类来实现。
// 此类为加密和解密提供密码功能
public class Cipher
extends Object
Cipher类是一个引擎类,它需要通过getIn
javax.crypto.Cipher类提供加密和解密功能,该类是JCE框架的核心。import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import java.security.Key;/**
* @author someone
* @create 2017-10-10 9:44
public class Ciph
1、javax.crypto.Cipher 类提供加密和解密的功能,它构成了Java加密扩展(JCE)框架的核心。
2、Cipher 的 getInstance(String transformation) 方法可以获取实例,参数 transformation 表示转换名称,包括:加密算法/反馈模式/填充方案。加密算法是必选项,反馈模式与填充方案可以不写使用默认值。如:
Cipher cipher = Cipher.getInstance("AES");
Cipher c =
转自Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密 - 蔡昭凯 - 博客园一、先看一个简单加密,解密实现 1.1 加密 1.2 解密 1.3 代码解释 上面简单实现了AES("AES/CBC/PKCS5Padding")的加密和解密。可以看到代码中主要的https://www.cnblogs.com/caizhaokai/p/10944667.html
一、先看一个简单加密,解密实现
1.1 加密
* content: 加密内容
* slatKey: 加密的
1.BASE64加密/解密
2.MD5(Message Digest Algorithm)加密
3.DES(Data Encryption Standard)对称加密/解密
4.AES(Advanced Encryption Standard) 加密/解密
5.HMAC(Hash Message Authentication Code,散列消息鉴别码)
6.恺撒加密
7.SHA(Secure Hash Algorithm,安全散列算法)
8.RSA 加密/解密
9.PBE 加密/解密
1.BASE64
在开发时,总要涉及到数据的加密与解密,之前一直有些糊涂,最近看了 jce.jar的源码,来整理记录一下
JCA(Java Cryptography Architecture): Java密码体系结构
JCE(Java Cryptography Extension):它是一组包,提供用于加密、密钥生成和协商以及 Message Authentication Code(MAC)算法的框架和实现。它提供了对称、不对称、块和流密码的加密支持,并且还支持安全流
这里需要注意引入的是spring-cloud-starter-config而不是spring-cloud-config-server至于为什么后面介绍
2.在bootstrap中添加加密秘钥
此处举例秘钥为123456,当然也可以设置更复杂的密码
后面springcloudconfig设置为false,具体为什么笔者也没有搞清楚,后面有介绍如果不这么设置的话
public static byte[] encrypt(byte[] msgBuf, byte[] keyBuf, byte[] iv) {
Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
DESedeKeySpec keySpec = new DESedeKeySpec(keyBuf);
一、问题描述及试用场景:
在项目规范中,有时需要对一些数据进行加密解密,常见的就是前后端加密参数在网络上传输。一方面,数据在网络上是以加密的方式传输的,原数据不可见。另一方面,如果数据被更改,服务端通过加密参数与前端传过来的密文比较即可判断出数据是否已被更改。常用加密方式有:MD5,HMAC,RSA,SHA等。
二、样例代
转载:JDK安全模块JCE核心Cipher使用详解
javax.crypto.Cipher,翻译为密码,其实叫做密码器更加合适。Cipher是JCA(Java Cryptographic Extension,Java加密扩展)的核心,提供基于多种加解密算法的加解密功能。在不了解Cipher之前,我们在完成一些需要加解密的模块的时候总是需要到处拷贝代码,甚至有些错误的用法也被无数次拷贝,踩坑之后又要拷贝补坑的代码。为什么不尝试理解Cipher然后合理地使用呢?
3.知识补充
Cipher.
javax.crypto.Cipher类提供加密和解密功能,该类是JCE框架的核心。一,与所有的引擎类一样,可以通过调用Cipher类中的getInstance静态工厂方法得到Cipher对象。public static Cipher getInstance(String transformation);public static Cipher getInstance(String