最近在研究区块链里的一些加密算法,用Java简单实现了一下,发现部分算法都是通过
javax.crypto.Cipher
类来完成的,特地写一篇文章介绍一下这个类。
类的定义和初始化
javax.crypto.Cipher
类是从jdk1.4就开始引入,所属jdk拓展包Java Cryptographic Extension(JCE)框架
,该框架主要用于加密解密和密码功能.其代码定义如下:
密码 = Cipher.getInstance(类型)
其中 类型 参数有两种写法:
1. "算法/模式/填充"
2. "算法"
目前已支持的算法
总共支持以下加密算法: AES / DES / DESede / RSA
类型 值 | 密码长度 | 说明 |
---|---|---|
AES/CBC/NoPadding | 128 | AES算法的CBC模式实现 |
AES/CBC/PKCS5Padding | 128 | AES算法的CBC模式实现, 并用PKCS5Padding规则填充 |
AES/ECB/NoPadding | 128 | AES算法的ECB模式实现 |
AES/ECB/PKCS5Padding | 128 | AES算法的ECB模式实现, 并用PKCS5Padding规则填充 |
DES/CBC/NoPadding | 56 | |
DES/CBC/PKCS5Padding | 56 | |
DESede/CBC/NoPadding | 168 | |
DESede/CBC/PKCS5Padding | 168 | |
DESede/ECB/NoPadding | 168 | |
DESede/ECB/PKCS5Padding | 168 | |
RSA/ECB/PKCS1Padding | (1024, 2048) | 密码长度有范围可选 |
RSA/ECB/OAEPWithSHA-1AndMGF1Padding | (1024, 2048) | 密码长度有范围可选 |
RSA/ECB/OAEPWithSHA-256AndMGF1Padding | (1024, 2048) | 密码长度有范围可选 |
其中常见的加密模式
有以下几种
ECB
(Electronic Codebook Book, 电码本模式)表示将明文分成若干小段, 然后对每小段进行加密
CBC
(Cipher Block Chaining, 密码分组链接模式)表示先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密
其中常见的填充规则
有以下几种
大部分情况下,明文并非刚好N位的倍数。对于最后一个分组,如果长度小于N位,则需要用数据填充至N位
这里不做详细阐述
Cipher类里面常用到的方法
修饰符与返回值 | 方法名(不带参数) | 说明 |
---|---|---|
void | init() | 使用密钥和一组算法参数初始化此密码 |
static Cipher | getInstance() | 返回Cipher实现指定转换的对象 |
byte[ ] | doFinal() | 完成多部分加密或解密操作,具体取决于此密码的初始化方式 |
… | … | …更多请查看官方API… |
一些示例代码
示例代码都丢到Gitee上去了, 有兴趣的可以点击查看