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

DES

  1. public class DESUtil {
  2.  
  3. static final String ALGORITHM = "DES";
  4.  
  5. /**
  6. * 生成文本格式的DES Key
  7. * @return
  8. * @throws Exception
  9. */
  10. public static String getKey() throws Exception{
  11. KeyGenerator generator = KeyGenerator.getInstance(ALGORITHM);
  12. generator.init(new SecureRandom());//加盐
  13. return Base64Util.encode(generator.generateKey().getEncoded());
  14. }
  15.  
  16. /**
  17. * 从文本 格式DES Key转换成SecretKey对象
  18. * @param key
  19. * @return
  20. */
  21. public static SecretKey parseKeyFromString(String key)throws Exception{
  22. DESKeySpec desKeySpec = new DESKeySpec(Base64Util.decode(key));
  23. SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
  24. SecretKey secretKey = factory.generateSecret(desKeySpec);
  25. return secretKey;
  26. }
  27.  
  28. /**
  29. * DES 加密
  30. * @param data
  31. * @param key
  32. * @return
  33. * @throws Exception
  34. */
  35. public static String encrypt(String data,String key)throws Exception{
  36. SecretKey secretKey = parseKeyFromString(key);
  37. Cipher cipher = Cipher.getInstance(ALGORITHM);
  38. cipher.init(Cipher.ENCRYPT_MODE, secretKey);
  39. byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
  40. return Base64Util.encode(bytes);
  41. }
  42.  
  43. /**
  44. * DES 解密
  45. * @param data
  46. * @param key
  47. * @return
  48. * @throws Exception
  49. */
  50. public static String decrypt(String data,String key)throws Exception{
  51. SecretKey secretKey = parseKeyFromString(key);
  52. Cipher cipher = Cipher.getInstance(ALGORITHM);
  53. cipher.init(Cipher.DECRYPT_MODE, secretKey);
  54. byte[] bytes = cipher.doFinal(Base64Util.decode(data));
  55. return new String(bytes,"UTF-8");
  56. }
  57.  
  58. public static void main(String[] args)throws Exception {
  59. String str = "Hello,DES";
  60. String key = getKey();
  61. System.out.println("原文:" + str);
  62. System.out.println("密钥:" + key);
  63. String encryptedStr = encrypt(str, key);
  64. System.out.println("加密后:" + encryptedStr);
  65. String decryptedStr = decrypt(encryptedStr, key);
  66. System.out.println("解密后:" + decryptedStr);
  67. }
  68.  
  69. }

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

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

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

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

测试:

  1. 原文:Hello,DES
  2. 密钥:8ePQx0m1I4k=
  3. 加密后:bM06WR8OIL2sQOB8SUSXRA==
  4. 解密后:Hello,DES

AES

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

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

PBE

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

  1. public class PBEUtil {
  2.  
  3. static final String ALGORITHM = "PBEWITHMD5andDES";
  4.  
  5. private static SecretKey parseKeyFromString(String key) throws Exception{
  6. PBEKeySpec pbeKey = new PBEKeySpec(key.toCharArray());
  7. SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
  8. return factory.generateSecret(pbeKey);
  9. }
  10.  
  11. /**
  12. * PBE 加密
  13. * @param data
  14. * @param key
  15. * @return
  16. * @throws Exception
  17. */
  18. public static String encrypt(String data,String key,byte[] salt)throws Exception{
  19. SecretKey secretKey = parseKeyFromString(key);
  20. Cipher cipher = Cipher.getInstance(ALGORITHM);
  21. PBEParameterSpec params = new PBEParameterSpec(salt, 100);
  22. cipher.init(Cipher.ENCRYPT_MODE, secretKey,params);
  23. byte[] bytes = cipher.doFinal(data.getBytes("UTF-8"));
  24. return Base64Util.encode(bytes);
  25. }
  26.  
  27. /**
  28. * DES 解密
  29. * @param data
  30. * @param key
  31. * @return
  32. * @throws Exception
  33. */
  34. public static String decrypt(String data,String key,byte[] salt)throws Exception{
  35. SecretKey secretKey = parseKeyFromString(key);
  36. Cipher cipher = Cipher.getInstance(ALGORITHM);
  37. PBEParameterSpec params = new PBEParameterSpec(salt, 100);
  38. cipher.init(Cipher.DECRYPT_MODE, secretKey,params);
  39. byte[] bytes = cipher.doFinal(Base64Util.decode(data));
  40. return new String(bytes,"UTF-8");
  41. }
  42.  
  43. public static void main(String[] args)throws Exception {
  44. String str = "Hello,PBE";
  45. String key = "abc";
  46. byte[] salt = new byte[8];
  47. new Random().nextBytes(salt);
  48. System.out.println("原文:" + str);
  49. System.out.println("密钥:" + key);
  50. String encryptedStr = encrypt(str, key,salt);
  51. System.out.println("加密后:" + encryptedStr);
  52. String decryptedStr = decrypt(encryptedStr, key,salt);
  53. System.out.println("解密后:" + decryptedStr);
  54. }
  55.  
  56. }

参考资料:

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. 向TRichEdit插入图片的单元

    很简单, 就3个函数, 直接看代码吧 unit RichEditBmp; { 2005-03-04 LiChengbin Added: Insert bitmap or gif into RichEd ...

  2. Python之uuid模块

    UUID是128位的全局唯一标识符,通常由32字节的字符串表示. 它可以保证时间和空间的唯一性,也称为GUID,全称为: UUID —— Universally Unique IDentifier P ...

  3. fio——IO基准测试

    简介 fio是IO工具,既可以用于基准测试,也可以用于硬件的压力测试验证(stress/hardware verification). 支持13种不同的IO引擎(sync.mmap.libaio.po ...

  4. 解决弹出蒙层滑动穿透问题-vue

    最近开发过程中遇到一些小问题(似乎问题总是那么多),但一直没什么时间去优化与解决.程序员不能被业务绑架,有时间还是花点在代码上

  5. LKD: Chapter 6 Kernel Data Structures

    这一章我们研究四种主要的数据结构: linked lists, queues, maps, binary trees. Linked Lists:(<linux/list.h>) 在lin ...

  6. tpshop使用自带极光推送

    推送逻辑在common里面的PushLogic.php;在后台网站->商城设置->推送设置,将极光的ID,密码填一下系统会自动加入数据库里面. 在你所需推送的PHP类里面引用这个文件即可. ...

  7. Bone Collector-HDU

    Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like ...

  8. pku夏令营面试

    北大面试题目: 一.内存交换 内存交换(对换)的基本思想是,把处于等待状态(或在CPU调度原则下被剥夺运行权利) 的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出:把准备好竞争CPU运行的程序 ...

  9. Java开发步骤

    3.编辑Java源程序 使用纯文本编辑器,比如记事本notpad.exe:EditPlus.UltraEdit等专业的纯文本编辑器. Word不是纯文本编辑器. 需求:写一个Java程序,在控制台打印 ...

  10. 使用ThinkPHP的扩展功能

    文件上传类的代码位于“\ThinkPHP\Libabry\Think\Uplod.class.php”,实例化电偶用即可.1:在Home模块Index控制器test方法中实现文件上传功能.打开文件\A ...