(学习笔记)Java的3DES与DES加密实现
2016-09-19 23:04
477 查看
简介:3DES(或称为Triple DES)是三重数据加密算法,块密码的通称。它相当于是对每个数据块应用三次DES加密算法。由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法。
使用Java的javax.crypto包即可简单实现,代码如下:
运行结果如图所示:
使用Java的javax.crypto包即可简单实现,代码如下:
package DESede; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class DESede { private final static String encryptType = "DESede";//DESede或者DES public static void main(String[] args) throws Exception { //生成随机密钥,如果不想系统自动生成,则自定义密钥,根据需求而定 // KeyGenerator keygen = KeyGenerator.getInstance(encryptType); // SecureRandom random = new SecureRandom(); // keygen.init(random); // byte [] key = keygen.generateKey().getEncoded(); //自定义DESede的密钥,必须为24字节 byte [] key = "abcdefghijklmnopqrstuvwx".getBytes(); //如果是DES加密,密钥必须为8字节即可 //byte [] key = "abcdefgh".getBytes(); //需要加密的内容 byte [] content = "admin".getBytes(); System.out.println("加密前的内容为:"+new String(content)); //加密内容并转化为16进制的字符串 String encryptContent =byteTo16(encrypt(key, content)); //打印密文 System.out.println("加密后的内容为:"+encryptContent); //将加密的16进制字符串转换为byte字节数组 byte [] encryptContentByte = toByteArray(encryptContent); //解密,并打印出原文 System.out.println("解密后的内容为:"+new String(decrypt(key,encryptContentByte))); } /** * 将byte字节数组转换为16进制的字符串 * b 需要转换的字节数组 * **/ public static String byteTo16(byte [] b) { StringBuffer result = new StringBuffer(); for(int i = 0;i<b.length;i++) { if((b[i]&0xff)<0x10) { result.append("0"); } result.append(Long.toString(b[i]&0xff, 16)); } return result.toString().toUpperCase(); } /** * 将16进制的字符串转换为byte字节数组 * **/ public static byte [] toByteArray(String str16) { char [] c = str16.toCharArray(); byte [] b = new byte[c.length/2]; for(int i = 0;i<b.length;i++) { int pos = i * 2; b[i] = (byte)("0123456789ABCDEF".indexOf(c[pos]) << 4 | "0123456789ABCDEF".indexOf(c[pos+1])); } return b; } /** * DESede加密 * k 密钥 * content 加密内容 * */ public static byte [] encrypt(byte [] k,byte [] content) { try { SecretKey key = new SecretKeySpec(k, encryptType); Cipher cipher = Cipher.getInstance(encryptType); cipher.init(Cipher.ENCRYPT_MODE, key); return cipher.doFinal(content); } catch (Exception e) { e.printStackTrace(); } return null; } /** * DESede解密 * k 密钥 * content 解密内容 * */ public static byte [] decrypt(byte [] k,byte [] content) { try { SecretKey key = new SecretKeySpec(k, encryptType); Cipher cipher = Cipher.getInstance(encryptType); cipher.init(Cipher.DECRYPT_MODE, key); return cipher.doFinal(content); } catch(Exception e) { e.printStackTrace(); } return null; } }
运行结果如图所示:
相关文章推荐
- Java IO 实现文件复制 -Java 学习笔记 (25)
- 关于java打印功能的最简单实现的学习笔记
- Java学习笔记——文本操作(记事本实现)
- java学习笔记——自定义实现Stack集合
- 学习java笔记 --- 一个实现Iterable<E>接口的小范例
- 链栈实现算法 - Java 学习笔记(26)
- Java学习笔记---字符串操作(人民币大写转换的实现)
- Java学习笔记——文本操作(记事本实现)
- Java学习笔记(三)Map接口及其重要实现类的用法
- java学习笔记—自定义实现linkedList集合
- Java 死锁的实现 -Java学习笔记(28)
- Java基础学习笔记(七)Set接口及其实现子类
- 用JS实现移动的窗口 - 流星絮语 JAVA学习笔记 - CSDNBlog
- Java学习笔记之 swing 基本实现QQ截屏功能
- Java 学习笔记 (3) -抽象类 abstract 接口 interface 内部类 inner class 继承 extends 实现 implements 包 package
- Java 线程同步问题 生产者-消费者 算法实现 -Java学习笔记(29)
- java学习笔记:【从网络获取图像资源】实现
- 设计模式学习笔记以及java代码实现
- Java与Flex学习笔记(9)----用ExternalInterface实现Flex与外部容器交互
- 基于JAVA的水泥三维图像特征提取系统设计与实现 之一 JAVA 3D学习笔记