本文以使用DES对称加密算法为例使用jdk对数据进行加密解密。

首先需要了解Provider类,它是jdk引入的密码服务提供者概念,实现了Java安全性的一部分或者全部。Provider 可能实现的服务包括:
算法(如DES、RSA、MD5);密钥的生成、转换和管理。
通常java运行时环境至少安装了一个名字为“SUN”的预设Provider,如果查看本机支持的Provider类型可以通过以下代码:

[java] view plaincopyprint?
  1. for(Provider p : Security.getProviders()){
  2. System.out.println(p.getName()+":"+p.getInfo());
  3. }
        for(Provider p : Security.getProviders()){System.out.println(p.getName()+":"+p.getInfo());  }

我本机运行结果为:

[java] view plaincopyprint?
  1. SUN:SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
  2. SunRsaSign:Sun RSA signature provider
  3. SunJSSE:Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
  4. SunJCE:SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
  5. SunJGSS:Sun (Kerberos v5, SPNEGO)
  6. SunSASL:Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)
  7. XMLDSig:XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
  8. SunPCSC:Sun PC/SC provider
  9. SunMSCAPI:Sun's Microsoft Crypto API provider
SUN:SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
SunRsaSign:Sun RSA signature provider
SunJSSE:Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
SunJCE:SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
SunJGSS:Sun (Kerberos v5, SPNEGO)
SunSASL:Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)
XMLDSig:XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
SunPCSC:Sun PC/SC provider
SunMSCAPI:Sun's Microsoft Crypto API provider

从结果中可以看到名称为“SunJCE”的Provider提供DES、Triple DES(即3DES), AES、RSA、Diffie-Hellman等算法的实现,下面使用此Provider完成对称加密。

KeyGenerator类提供(对称)密钥生成器的功能,使用getInstance 类方法构造,代码如下:

[java] view plaincopyprint?
  1. KeyGenerator kg = KeyGenerator.getInstance("DES","SunJCE");
KeyGenerator kg = KeyGenerator.getInstance("DES","SunJCE");

SecretKey类是对称密钥的封装类,它不包含方法或常量,其唯一目的是分组对称密钥(并为其提供类型安全),从kg中获取

[java] view plaincopyprint?
  1. SecretKey key = kg.generateKey();
SecretKey key = kg.generateKey();

以上是产生密钥的过程,真正实现对数据加解密功能的类是Cipher,此类为加密和解密提供密码功能,它构成了 Java Cryptographic Extension (JCE) 框架的核心。
为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求“转换”的名称传递给它,还可以指定Provider的名称,本文中采用“SunJCE”。
“转换”是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案(反馈模式和填充方案可以理解为 加密前对数据的预处理)
“转换”具有以下两种形式:“算法/模式/填充”或“算法”(这种情况,使用模式和填充方案特定于Provider的默认值)。本例中采用以下有效的转换:

[java] view plaincopyprint?
  1. Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反馈模式,PKCS5Padding的填充方案
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反馈模式,PKCS5Padding的填充方案

使用CBC反馈模式需要一个初始化向量,由类IvParameterSpec来完成,它需要是一个长度为8的byte数组。

Cipher的init方法负责初始化,初始化需要指定模式和密钥,密钥本文采用上面已经生成的key,模式有四种ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE、UNWRAP_MODE分别表示加密、解密、密钥包装或密钥解包。
如果加密则采用方法init(Cipher.ENCRYPT_MODE, key);
如果解密则采用方法init(Cipher.DECRYPT_MODE, key);
WRAP_MODE、UNWRAP_MODE模式是用来实现数字信封用的,本文不作介绍。
通常对数据进行加解密,使用方法doFinal(byte[] input),传入参数是byte数组。
为了在http协议下快速传输数据,且某些系统中只能使用ASCII字符,通常采用Base64编码。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。还可以提高可视性。

通过以上分析可以得到以下代码:

[java] view plaincopyprint?
  1. import java.io.IOException;
  2. import java.io.UnsupportedEncodingException;
  3. import java.security.InvalidAlgorithmParameterException;
  4. import java.security.InvalidKeyException;
  5. import java.security.NoSuchAlgorithmException;
  6. import java.security.NoSuchProviderException;
  7. import javax.crypto.BadPaddingException;
  8. import javax.crypto.Cipher;
  9. import javax.crypto.IllegalBlockSizeException;
  10. import javax.crypto.KeyGenerator;
  11. import javax.crypto.NoSuchPaddingException;
  12. import javax.crypto.SecretKey;
  13. import javax.crypto.spec.IvParameterSpec;
  14. import sun.misc.BASE64Decoder;
  15. import sun.misc.BASE64Encoder;
  16. public class SecurityTest {
  17. //密钥生成器
  18. private KeyGenerator kg;
  19. //对称密钥
  20. private SecretKey key;
  21. //加解密时的初始化向量must be 8 bytes long
  22. private IvParameterSpec iv;
  23. //Cipher,加解密主体实例
  24. private Cipher c;
  25. //该构造方法初始化DES密钥和Cipher
  26. public SecurityTest() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, UnsupportedEncodingException{
  27. kg = KeyGenerator.getInstance("DES","SunJCE");
  28. key = kg.generateKey();
  29. iv = new IvParameterSpec("12345678".getBytes("UTF-8"));
  30. c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反馈模式,PKCS5Padding的填充方案 ,SunJCE:Provider
  31. }
  32. /**
  33. * DES加密
  34. */
  35. public String encrypt(String src) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException{
  36. //初始化-- ENCRYPT_MODE:加密模式, key:密钥,iv:初始化向量
  37. c.init(Cipher.ENCRYPT_MODE, key, iv);
  38. byte[] srcByte = src.getBytes();
  39. //加密
  40. byte[] targetByte = c.doFinal(srcByte);
  41. //Base64编码
  42. String targetString = new BASE64Encoder().encode(targetByte);
  43. return targetString;
  44. }
  45. /**
  46. * DES解密
  47. */
  48. public String decrypt(String srcString) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException, InvalidAlgorithmParameterException {
  49. //初始化-- DECRYPT_MODE:解密模式, key:密钥,iv:初始化向量
  50. c.init(Cipher.DECRYPT_MODE, key, iv);
  51. //Base64解码
  52. byte[] srcByte = new BASE64Decoder().decodeBuffer(srcString);
  53. //解密
  54. byte[] targetByte = c.doFinal(srcByte);
  55. return new String(targetByte);
  56. }
  57. public static void main(String[] args) throws Exception {
  58. SecurityTest test = new SecurityTest();
  59. String src = "使用JKD进行加解密--DES算法测试!__小印";
  60. System.out.println("原文:" + src);
  61. String secret = test.encrypt(src);
  62. System.out.println("密文:" + secret);
  63. String target = test.decrypt(secret);
  64. System.out.println("解密得到原文:" + target);
  65. }
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;public class SecurityTest {//密钥生成器private KeyGenerator kg; //对称密钥  private SecretKey key;  //加解密时的初始化向量must be 8 bytes longprivate IvParameterSpec iv;//Cipher,加解密主体实例private Cipher c;  //该构造方法初始化DES密钥和Cipher  public SecurityTest() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, UnsupportedEncodingException{kg = KeyGenerator.getInstance("DES","SunJCE");  key = kg.generateKey();iv = new IvParameterSpec("12345678".getBytes("UTF-8"));c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反馈模式,PKCS5Padding的填充方案 ,SunJCE:Provider}  /** * DES加密*/  public String encrypt(String src) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException{  //初始化-- ENCRYPT_MODE:加密模式, key:密钥,iv:初始化向量c.init(Cipher.ENCRYPT_MODE, key, iv);  byte[] srcByte = src.getBytes();  //加密byte[] targetByte = c.doFinal(srcByte); //Base64编码String targetString = new BASE64Encoder().encode(targetByte);return targetString;  }  /** * DES解密 */  public String decrypt(String srcString) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException, InvalidAlgorithmParameterException {  //初始化-- DECRYPT_MODE:解密模式, key:密钥,iv:初始化向量c.init(Cipher.DECRYPT_MODE, key, iv); //Base64解码byte[] srcByte = new BASE64Decoder().decodeBuffer(srcString);//解密byte[] targetByte = c.doFinal(srcByte);  return new String(targetByte);  }  public static void main(String[] args) throws Exception {  SecurityTest test = new SecurityTest();  String src = "使用JKD进行加解密--DES算法测试!__小印";  System.out.println("原文:" + src);String secret = test.encrypt(src);    System.out.println("密文:" + secret); String target = test.decrypt(secret);System.out.println("解密得到原文:" + target);  } 

我本机运行结果为:

[java] view plaincopyprint?
  1. 原文:使用JKD进行加解密--DES算法测试!__小印
  2. 密文:P8Xi4Jfvq9Eus0c1OTE32wK60rjHwPxZ8tRiElxOd5m69+vI37IGtw==
  3. 解密得到原文:使用JKD进行加解密--DES算法测试!__小印
原文:使用JKD进行加解密--DES算法测试!__小印
密文:P8Xi4Jfvq9Eus0c1OTE32wK60rjHwPxZ8tRiElxOd5m69+vI37IGtw==
解密得到原文:使用JKD进行加解密--DES算法测试!__小印

注意:本文采用的是随机密钥,所以每次运行得到的密文是不一样的,jdk也提供自定义的密钥 ^_^

使用JDK中的安全包对数据进行加解密相关推荐

  1. Python-使用U盾完成数据的加解密(使用国密算法SKF接口)

    Python-使用U盾完成数据的加解密(使用国密算法SKF接口) 1-涉及的内容 2-动态库涉及的函数,及结构体 2.1 相关结构体 2.2 相关函数 3-Python实现 4-测试结果 5-UI可视 ...

  2. SpringBoot中如何灵活的实现接口数据的加解密功能?

    数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...

  3. 文件传输-对数据进行加解密的方法!

    由于项目安全要求,需要使用RSA算法对部分关键数据进行加密,并使用OAEPWithSHA-256AndMGF1对数据进行填充.通过搜索最终选择较为通用OpenSSL库,但OpenSSL的RSA算法默认 ...

  4. SpringBoot 基于RequestBodyAdvice 和 ResponseBodyAdvice 实现数据的加/解密(采用 RSA 算法 ),“船新版本”!

    一.前言: 数据是企业的第四张名片,企业级开发中少不了数据的加密传输.为了预防请求数据被劫持篡改,一般都会对传输的数据进行加密操作,如果每个接口都由我们自己去手动加密和解密,那么工作量太大而且代码冗余 ...

  5. boot数据加解密 spring_SpringBoot实现接口数据的加解密功能

    一.加密方案介绍 对接口的加密解密操作主要有下面两种方式: 自定义消息转换器 优势:仅需实现接口,配置简单. 劣势:仅能对同一类型的MediaType进行加解密操作,不灵活. 使用spring提供的接 ...

  6. SpringBoot中如何灵活的实现接口数据的加解密...

    对接口的加密解密操作主要有下面两种方式: 自定义消息转换器 优势:仅需实现接口,配置简单. 劣势:仅能对同一类型的MediaType进行加解密操作,不灵活. 使用spring提供的接口RequestB ...

  7. java tar压缩工具类_分享apache的commons-compress的TarUtils压缩工具类对文件数据进行加解密、解析及格式化校验等操作...

    一.前言 基于apache的commons-compress包中的org.apache.commons.compress.archivers.tar.TarUtils打包工具类对文件进行加解密.并对加 ...

  8. Java项目安全发布--Jar包(class)加解密实践

    一.背景 有项目需要在客户机器上进行本地部署,这就涉及到自家代码的安全性问题.需要保证以下几点: 代码不能被他人"窃取"(保证源码不可见) 不能通过已有项目复制一份系统出来(即使源 ...

  9. 数据加密-国密SM2对数据进行加解密

    1 什么是SM2 RSA算法的危机在于其存在亚指数算法,对ECC算法而言一般没有亚指数攻击算法. SM2椭圆曲线公钥密码算法:我国自主知识产权的商用密码算法,是ECC(Elliptic Curve C ...

最新文章

  1. 基于颜色特征,形状特征和纹理特征的数字图像的检索(Digital Image Retrieval)MATLAB GUI实现
  2. 功能强大的 C++ redis 客户端库增加至 acl 项目中
  3. Using-更精彩更有用的做法-短签名
  4. Winsock—I/O模型之选择模型(一)
  5. 桌面虚拟化之资源分配
  6. 【STM32】OLED 显示实验代码详解
  7. Linux gdb调试器
  8. SQLLite (二) :sqlite3_open, sqlite3_exec, slite3_close
  9. Spark之Spark概述
  10. 研究生计划-心得征程
  11. vue-js 特殊变量$event常识
  12. POJ3630——简单Trie树
  13. SCN风波又起,2019年6月之前Oracle必须升级吗?
  14. c语言中实型变量的三种类型,在C语言中实型变量分为两种类型.doc
  15. Visual C++开发类似QQ游戏大厅全过程
  16. 【Codeforces 760 B Frodo and pillows】+ 二分
  17. django -- url映射
  18. 【mixly】APDS9960第三方库开发
  19. 免费领取三个月苹果ARCADE订阅教程
  20. Servlet+jsp开发图书管理系统流程。

热门文章

  1. [转载From少数派] 码字必备:18 款优秀的 Markdown 写作工具 | 2015 年度盘点
  2. 计算机加法的电路原理及proteus仿真
  3. Linux基础和命令大全
  4. NSSCTF web题记录
  5. 访问ftp服务器不显示文件夹权限问题,访问ftp服务器显示无权限问题
  6. php fpm 错误日志在哪,php fpm如何开启错误日志
  7. 今天睡眠质量记录77
  8. windows 10修改host,有效解决权限问题,请惠存
  9. 取得平均薪水最高的部门的部门名称
  10. 《评人工智能如何走向新阶段》后记(再续22)