Java安全编程:DES加密解密
2013-10-30 17:15
330 查看
DES加密是最常用的对称加密算法之一。所谓“对称加密”指的就是从明文加密到密文和从密文解密到明文用的都是相同的一套密钥与之相对应的就是“非对称加密”。其它常见的对称加密算法还有IDEA、RC2、RC4、SKIPJACK、RC5、AES等。
DES加密可以给字节数组加密,也可以给文件加密。当然在加解密之前我们需要获取密钥,获取密钥可以通过我们给定的字节数组或者生成一个随机的密钥。密钥其实就是一个8个长度的字节数组。
从DESKeySpec类的构造函数中可以看出,只能传入一个8位的字节数组实例化。
获得密钥后我们就可以进行字节数组和文件的加解密工作。
DES加密可以给字节数组加密,也可以给文件加密。当然在加解密之前我们需要获取密钥,获取密钥可以通过我们给定的字节数组或者生成一个随机的密钥。密钥其实就是一个8个长度的字节数组。
/** * 生成一个随机的DES密钥 * @throws Exception */ public static Key randomKey() throws Exception{ KeyGenerator generator = KeyGenerator.getInstance("DES"); SecretKey key = generator.generateKey(); byte[] arrKey = key.getEncoded(); System.out.println(Arrays.toString(arrKey)); System.out.println("密钥Base64转码:" + Base64.encodeBase64String(arrKey)); System.out.println("密钥16进制显示:" + Hex.encodeHexString(arrKey)); return key; }
/** * 根据byte数组获得密钥对象 * @param arrKey * @return * @throws Exception */ public static Key getKey(byte[] arrKey) throws Exception { //实例化DES密钥材料 DESKeySpec spec = new DESKeySpec(arrKey); //实例化DES密钥工厂 SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); return factory.generateSecret(spec); }
从DESKeySpec类的构造函数中可以看出,只能传入一个8位的字节数组实例化。
public DESKeySpec(byte abyte0[]) throws InvalidKeyException { this(abyte0, 0); } public DESKeySpec(byte abyte0[], int i) throws InvalidKeyException { if(abyte0.length - i < 8) { throw new InvalidKeyException("Wrong key size"); } else { a = new byte[8]; System.arraycopy(abyte0, i, a, 0, 8); return; } }
获得密钥后我们就可以进行字节数组和文件的加解密工作。
/** * 加密字节数组形式的数据 * @param data * @param key * @return * @throws Exception */ public static byte[] encryptByteArr(byte[] data, Key key) throws Exception { // using DES in ECB mode Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // 用密匙初始化Cipher对象 cipher.init(Cipher.ENCRYPT_MODE, key); return cipher.doFinal(data); }
/** * 解密字节数组形式的密文 * @param data * @param key * @return * @throws Exception */ public static byte[] decryptByteArr(byte[] data, Key key) throws Exception { // using DES in ECB mode Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); // 用密匙初始化Cipher对象 cipher.init(Cipher.DECRYPT_MODE, key); return cipher.doFinal(data); }
/** * DES加密文件 * @param file 明文文件 * @param dest 加密后的密文文件 * @param key 密钥 * @throws NoSuchAlgorithmException * @throws NoSuchPaddingException * @throws InvalidKeyException * @throws IOException */ public static void encryptFile(File file, File dest, Key key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException { Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.ENCRYPT_MODE, key); InputStream is = new FileInputStream(file); OutputStream out = new FileOutputStream(dest); CipherInputStream cis = new CipherInputStream(is, cipher); byte[] buffer = new byte[1024]; int r; while ((r = cis.read(buffer)) > 0) { out.write(buffer, 0, r); } cis.close(); is.close(); out.close(); }
/** * DES解密文件 * @param file 需要解密的密文文件 * @param dest 解密出的明文文件 * @param key 密钥 * @throws NoSuchAlgorithmException * @throws NoSuchPaddingException * @throws InvalidKeyException * @throws IOException */ public static void decryptFile(File file, File dest, Key key) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException { Cipher cipher = Cipher.getInstance("DES"); cipher.init(Cipher.DECRYPT_MODE, key); InputStream is = new FileInputStream(file); OutputStream out = new FileOutputStream(dest); CipherInputStream cis = new CipherInputStream(is, cipher); byte[] buffer = new byte[1024]; int r; while ((r = cis.read(buffer)) > 0) { out.write(buffer, 0, r); } cis.close(); is.close(); out.close(); }
相关文章推荐
- Java安全编程:RSA加密解密
- 20145337实验五Java网络编程及安全
- Java 并发编程实践基础 读书笔记: 第二章 构建线程安全应用程序
- Java 网络编程 安全 Socket
- java 并发编程---安全共享对象策略
- 关于Des加密(Android与ios 与后台java服务器之间的加密解密
- 兼容PHP和Java的des加密解密代码分享
- Web Service安全机制探讨-Java基础-Java-编程开发
- java DES加密文件上传数据库,下载解密文件
- JAVA安全篇网站登陆加密解密
- Android平台和java平台 DES加密解密互通程序及其不能互通的原因
- Java安全学习笔记(十)-输出流的加密和解密
- crypto-js des加密与解密 与java运行结果不一致的问题
- Java的多线程编程模型2--怎样才线程安全
- 【Java安全技术探索之路系列:Java可扩展安全架构】之十九:JGSS(三):JGSS编程模型.md
- JAVA 并发编程随笔【七】线程安全与共享资源
- RSA - Java编程: 用Cipher进行RSA加解密
- 兼容PHP和Java的des加密解密示例代码分享
- DES - Java编程: 使用DES加密/解密
- 20145331实验五 Java网络编程及安全