前面的仅仅是做了编码或者摘要,下面看看真正的加密技术。

DES

public class DESUtil {

    static final String ALGORITHM = "DES";

    /**
* 生成文本格式的DES Key
* @return
* @throws Exception
*/
public static String getKey() throws Exception{
KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
generator.init(new SecureRandom());//加盐
return Base64Util.encode(generator.generateKey().getEncoded());
} /**
* 从文本 格式DES Key转换成SecretKey对象
* @param key
* @return
*/
public static SecretKey parseKeyFromString(String key)throws Exception{
DESKeySpec desKeySpec = new DESKeySpec(Base64Util.decode(key));
SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey secretKey = factory.generateSecret(desKeySpec);
return secretKey;
} /**
* DES 加密
* @param data
* @param key
* @return
* @throws Exception
*/
public static String encrypt(String data,String key)throws Exception{
SecretKey secretKey = parseKeyFromString(key);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
return Base64Util.encode(bytes);
} /**
* DES 解密
* @param data
* @param key
* @return
* @throws Exception
*/
public static String decrypt(String data,String key)throws Exception{
SecretKey secretKey = parseKeyFromString(key);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] bytes = cipher.doFinal(Base64Util.decode(data));
return new String(bytes,"UTF-8");
} public static void main(String[] args)throws Exception {
String str = "Hello,DES";
String key = getKey();
System.out.println("原文:" + str);
System.out.println("密钥:" + key);
String encryptedStr = encrypt(str, key);
System.out.println("加密后:" + encryptedStr);
String decryptedStr = decrypt(encryptedStr, key);
System.out.println("解密后:" + decryptedStr);
} }

类似DESKeySpec,Java中很多*KeySpec的类都实现了KeySpec的空接口,Java只关心某个类是否是一种Key的实现,至于具体如何实现的是具体加密解密算法要关心的。

再次看到Base64的身影,由此可以看出,Base64其实充当着字符串和byte数组之间的转换器,真实的的密钥数据其实是byte类型的,但是在阅读和传输过程中字符串比较方便,所以我们能看到的很多密钥信息其实都是Base64编码。

Ciper为密文工具类,它是一个很高级的抽象类,有很多种Cipher的实现,可以通过Cipher.getInstance()方法获取到。

getInstance方法接收的算法名称非常多:

测试:

原文:Hello,DES
密钥:8ePQx0m1I4k=
加密后:bM06WR8OIL2sQOB8SUSXRA==
解密后:Hello,DES

AES

AES是DES的升级版,解决了DES的很多不足,上述DES代码改成AES的改动很小:

static final String ALGORITHM = "AES";
/**
* 从文本 格式AES Key转换成SecretKey对象
* @param key
* @return
*/
public static SecretKey parseKeyFromString(String key)throws Exception{
SecretKey secretKey = new SecretKeySpec(Base64Util.decode(key), ALGORITHM);
return secretKey;
}

PBE

PBE与DES、AES同属对称加密,不同之处在于其密钥可以由用户管理,即密钥可以不用通过KeyGenerator来生成,可以是任意字符。为了增强安全性,PBE强制必须要有参数(java.security.spec.AlgorithmParameterSpec),可以理解为强制加盐,否则将报错。

public class PBEUtil {

    static final String ALGORITHM = "PBEWITHMD5andDES";

    private static SecretKey parseKeyFromString(String key) throws Exception{
PBEKeySpec pbeKey = new PBEKeySpec(key.toCharArray());
SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
return factory.generateSecret(pbeKey);
} /**
* PBE 加密
* @param data
* @param key
* @return
* @throws Exception
*/
public static String encrypt(String data,String key,byte[] salt)throws Exception{
SecretKey secretKey = parseKeyFromString(key);
Cipher cipher = Cipher.getInstance(ALGORITHM);
PBEParameterSpec params = new PBEParameterSpec(salt, 100);
cipher.init(Cipher.ENCRYPT_MODE, secretKey,params);
byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
return Base64Util.encode(bytes);
} /**
* DES 解密
* @param data
* @param key
* @return
* @throws Exception
*/
public static String decrypt(String data,String key,byte[] salt)throws Exception{
SecretKey secretKey = parseKeyFromString(key);
Cipher cipher = Cipher.getInstance(ALGORITHM);
PBEParameterSpec params = new PBEParameterSpec(salt, 100);
cipher.init(Cipher.DECRYPT_MODE, secretKey,params);
byte[] bytes = cipher.doFinal(Base64Util.decode(data));
return new String(bytes,"UTF-8");
} public static void main(String[] args)throws Exception {
String str = "Hello,PBE";
String key = "abc";
byte[] salt = new byte[8];
new Random().nextBytes(salt);
System.out.println("原文:" + str);
System.out.println("密钥:" + key);
String encryptedStr = encrypt(str, key,salt);
System.out.println("加密后:" + encryptedStr);
String decryptedStr = decrypt(encryptedStr, key,salt);
System.out.println("解密后:" + decryptedStr);
} }

参考资料:

http://snowolf.iteye.com/blog/380034

http://snowolf.iteye.com/blog/380761

Java加密与解密笔记(二) 对称加密的更多相关文章

  1. Java加密与解密笔记(三) 非对称加密

    非对称的特点是加密和解密时使用的是不同的钥匙.密钥分为公钥和私钥,用公钥加密的数据只能用私钥进行解密,反之亦然. 另外,密钥还可以用于数字签名.数字签名跟上文说的消息摘要是一个道理,通过一定方法对数据 ...

  2. Java加密与解密笔记(一) Base64和数据摘要算法

    对加密解密下面的内容一定要先理解: 甲乙双方要通信,中间的连接可能被人窃听甚至篡改.解决办法就是把传输的内容进行加密,用密文去传输,这样即使被监听也没办法知道信息的具体内容. 加密时,甲乙双方可以约定 ...

  3. Java加密与解密笔记(四) 高级应用

    术语列表: CA:证书颁发认证机构(Certificate Authority) PEM:隐私增强邮件(Privacy Enhanced Mail),是OpenSSL使用的一种密钥文件. PKI:公钥 ...

  4. 非对称加解密 Asymmetric encryption 对称加密和非对称加密的区别

    考虑这样一个问题:一切的装备文件都存储在 Git 长途库房,RAR密码破解装备文件中的一些信息又是比较灵敏的.所以,我们需求对这些灵敏信息进行加密处理.首要的加密方法分为两种:一种是同享密钥加 密(对 ...

  5. 【Quick 3.3】资源脚本加密及热更新(二)资源加密

    [Quick 3.3]资源脚本加密及热更新(二)资源加密 注:本文基于Quick-cocos2dx-3.3版本编写 一.介绍 在前一篇文章中介绍了代码加密,加密方式是XXTEA.对于资源文件来说,同样 ...

  6. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  7. Java常用的加密解密类(对称加密类)

    Java常用的加密解密类 原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198 原创 2013年04月12日 14:33:35 1704 ...

  8. java 加密与解密艺术二

    首先需要明确的是RSA的密钥对不能手动指定,需要通过代码系统生成 接下来我们来介绍下生成密钥对 package com.weiyuan.test; import java.security.KeyPa ...

  9. Java Des加解密方法(c#加密Java解密)

    最近我们用Java把一个用.net编写的老系统重新做了翻版,但是登录还是用.net的登录.这样就会遇到一个比较棘手的问题,我们登录用的cookie信息都是.net用des加密的,但我们不得不用Java ...

随机推荐

  1. 【Java进阶】---map集合排序

    map集合排序         这篇文章讲的不仅仅是map排序,比如把对象按某一属性排序,它都可以解决这些问题.   比如,有N个对象,每个对象有个属性就是成绩,成绩分:优秀,良好,合格.那我们如何按 ...

  2. AIO5物料清单(BOM)列表,搜索编码和名称无效

    问题: AIO5物料清单(BOM)列表,搜索编码和名称无效.如图: 原因分析 AIO5的BOM是在二次开发平台上做的,在制作自定义单据的时候[查询参数设置]没有设置.如下图: 解决方案 工具:AIO5 ...

  3. es6环境搭建

    安装node环境 地址:https://nodejs.org/en/download/ 建立项目目录 建立一个项目目录es6-demo,并在目录下建立两个子文件夹src和dist: src:源代码es ...

  4. PL/SQL 游标 (实验七)

    PL/SQL 游标 emp.dept 目标表结构及数据 要求 基于部门表建立游标dept_cursor1,使用记录变量接收游标数据,输出部门表信息: 显示格式: 部 门 号: XXX 部门名称: XX ...

  5. Python学习笔记 set&&dict

    dict 是个好东西啊,这个东东是类似于c++里面的map.其形式为 dict={key:value,key:value....} 这个东西好玩的地方主要在于 1.他的key值查找采用的是哈希算法,速 ...

  6. 数据结构 集合_集合(数学)抽象数据类型的C语言实现

    链表是实现集合的一种理想的方式.将List以typedef的方式重命名为Set.这样做能保留链表简洁的特性,还能使集合具有了一些多态的特性. 使用这种方法的最大好处就是可以使用list_next来遍历 ...

  7. Java第一季

    1.Java常量的应用 语法:final 常量名 = 值: final String LOVE = "IMOOC"; final double PI = 3.14 举一个简单的例子 ...

  8. Android OpenGL ES 开发(二): OpenGL ES 环境搭建

    零:环境搭建目的 为了在Android应用程序中使用OpenGL ES绘制图形,必须要为他们创建一个视图容器.其中最直接或者最常用的方式就是实现一个GLSurfaceView和一个GLSurfaceV ...

  9. ASP.NET Core 一步步搭建个人网站(2)_一键部署和用户注册登录

    俗话说,磨刀不费砍柴工.为了更方便的进行项目管理,我们先将个人网站项目配置一下,满足以下2个目标: VS2017中支持Git存储库,绑定Github项目,实现本地VS程序与线上Github一键代码提交 ...

  10. 域名和ip不能访问的原因

    centos的话可能默认可能会有firewalld,可以执行 systemctl stop firewalld systemctl disable firewalld 禁用后在看看,前提都是域名得备案 ...