Java CBC加密

概要:

CBC使用一个8个字节的随机数(称为初始向量,IV)来加密第一个分组,然后使用得到的密文加密第二个分组,加密第二个分组得到的密文再加密第三个分组,……。这样,即使两个分组相同,得到的密文也不同。本实例演示了使用CBC加密方式以及初始向量进行加密的编程步骤。

| |目录

技术要点

使用CBC方式对字符串进行加密的技术要点如下:

  • 生成密钥。

  • 生成初始向量。

  • 获取密码器。

  • 初始化密码器,并执行加密。

代码实现

说明:key1.dat 文件的获取请参考Java 创建对称密钥

package net.xsoftlab.baike;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.security.Key;
import java.util.Random;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;

public class ENCCBC {
	public static void main(String args[]) throws Exception {
		String s = "你好Java你好Java你好Java你好Java";
		String path = System.getProperty("user.dir") + "//key1.dat"; // 得到密钥的路径
		FileInputStream f1 = new FileInputStream(path);// 获取密钥
		ObjectInputStream b = new ObjectInputStream(f1);// 创建对象输入流
		Key k = (Key) b.readObject();// 从 ObjectInputStream 读取对象
		// 生成初始化向量
		byte[] rand = new byte[8];
		Random r = new Random();// 创建随机数生成器
		r.nextBytes(rand);// 生成随机字节并将其置于rand字节数组中
		// 使用 rand中的字节作为 IV 来初始化一个IvParameterSpec对象。
		IvParameterSpec iv = new IvParameterSpec(rand);
		// 加密
		Cipher cp = Cipher.getInstance("DESede/CBC/PKCS5Padding");
		cp.init(Cipher.ENCRYPT_MODE, k, iv);
		byte ptext[] = s.getBytes("UTF8");
		byte ctext[] = cp.doFinal(ptext);
		// 打印加密结果
		System.out.println("输出加密结果为:");
		for (int i = 0; i < ctext.length; i++) {
			System.out.print(ctext[i] + ",");
			if ((i + 1) % 5 == 0)
				System.out.println();
		}
		// 保存加密结果
		FileOutputStream f2 = new FileOutputStream("EncCBC.dat");
		f2.write(rand);
		f2.write(ctext);
	}
}

程序解读

1.在本程序主要是通过下面的语句来获取密钥,与前面所讲的方法相同,在这里就不详细说明了。

FileInputStream f1=new FileInputStream(path);//获取密钥
ObjectInputStream b=new ObjectInputStream(f1);//创建对象输入流
Key k=(Key)b.readObject();//从ObjectInputStream读取对象

2.使用CBC方式首先要生成初始向量,然后在获取密码器对象时通过getInstance()方法的参数设定加密方式。在本程序中主要是通过下面的语句来生成初始向量的,该语句利用随机数生成的byte数组为初始值创建IvParameterSpec对象。

IvParameterSpec iv=new IvParameterSpec(rand);

3.在获取密码器时,通过getInstance()方法的参数指定加密方式,该参数DESede/CBC/PKCS5Padding由3个参数组成。其中第1个参数DESede代表所用的加密算法;第2个参数CBC即加密模式,除了CBC外,还有NONE、ECB、CFB、OFB和PCBC等可以用;第3个参数为填充模式,对称加密常用的填充方式称为PKCS#5 padding,如果加密算法不进行填充,则填充方式为No padding。

4.一切准备工作就绪,接下来,就需要执行加密操作了。与前面的程序相比,在其参数中增加了一项初始化向量,即第2步得到的iv。执行加密时同样使用doFinal()方法对字节数组进行加密。具体代码如下所示:

Cipher cp=Cipher.getInstance("DESede/CBC/PKCS5Padding");
cp.init(Cipher.ENCRYPT_MODE,k,iv);
byte ptext[]=s.getBytes("UTF8");
byte ctext[]=cp.doFinal(ptext);


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消