Java安全学习笔记(四)--CBC方式解密

来源:互联网 发布:美国传播学专业知乎 编辑:程序博客网 时间:2024/06/06 02:25
Java安全学习笔记(三)--CBC方式加密 讲述了CBC方式如何加密,本实例演示CBC如何解密。
CBC方式解密的技术要点:
1.获取密钥文件路径
2.获取密文
3.获取初始向量
4.获取EncCBC.dat中剩余的数据部分
5.取得密钥
6.解密
package core;import java.io.FileInputStream;import java.io.ObjectInputStream;import java.security.Key;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;public class DEC_CBC {public static void main(String[] args) throws Exception {// 获取密钥文件路径String path = System.getProperty("user.dir"); // 获取程序当前路径path = path + "/key1.dat";// 得到密钥的路径//System.out.println(path);//获取密文FileInputStream in=new FileInputStream("EncCBC.dat");//获取初始向量byte[] rand=new byte[8];in.read(rand);//从in中读取8字节的对应初始向量的随机数IvParameterSpec iv=new IvParameterSpec(rand);//利用rand[]获得初始向量IvParameterSpec//获取EncCBC.dat中剩余的数据部分int num=in.available(); //判断剩余字节数量byte[] ctext=new byte[num];in.read(ctext);//把剩余数据读到ctext[]数组中//取得密钥FileInputStream f1=new FileInputStream(path); //获取密钥ObjectInputStream b=new ObjectInputStream(f1);//创建对象输入流Key k=(Key) b.readObject(); //从ObjectInputStream中读取key对象//解密Cipher cp=Cipher.getInstance("DESede/CBC/PKCS5Padding");//获取密码器实例cp.init(Cipher.DECRYPT_MODE, k, iv);//三个参数:第一个参数表示是解密模式,第二个参数是密钥key,第三个参数是加密算法IvParameterSpecbyte[] ptext=cp.doFinal(ctext); //执行解密String p=new String(ptext,"UTF8");System.out.println("CBC解密后的字符串为: ");System.out.println(p);}}



源程序解读:
key1.dat文件的生成可参考Java安全学习笔记(二)--创建对称密钥,EncCBC.dat的生成可参考Java安全学习笔记(三)--CBC方式加密
在本程序中获取初始向量使用了文件输入流的read()方法从文件EncCBC.dat中读取前8个子节点对应初始向量的随机数,并用其创建IvParameterSpec对象。
EncCBC.dat文件中剩余部分为加密结果,因此使用文件输入流的available()方法判断剩余字节的数量,并创建相应大小的字节数组,读入数据。密钥必须和加密时所用的密钥相同
进行解密操作与加密的操作相同,只是在初始化密码器时使用Cipher.DECRYPT_MODE表示进行解密。


原创粉丝点击