Java常用的加密解密类(对称加密类)
Java常用的加密解密类
原文转载至:http://blog.csdn.net/wyc_cs/article/details/8793198
- 1704
对于加密与解密是一个很复杂的学科,如果想了解更深入的加密解密知识可以参考其它资料,本文只讲解一部分加密解密的使用方式。
常用的加密解密可以分为:信息摘要算法:MD5,SHA(也就是单向加密理论上无法解密)、对称加密算法 :DES,3DES,AES、非对称加密算法:RSA,DSA
本文只讲解单向加密和对称加密,关于非对称加密在以后的时间里进行添加。直接上代码,亲测可以运行:
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import javax.crypto.Cipher;
- import javax.crypto.KeyGenerator;
- import javax.crypto.SecretKey;
- import javax.crypto.spec.SecretKeySpec;
- /**
- * 加密解密工具类
- */
- public class EncryptUtils {
- /**
- * 进行MD5加密
- *
- * @param info 要加密的信息
- * @return String 加密后的字符串
- */
- public String encryptToMD5(String info) {
- byte[] digesta = null;
- try {
- // 得到一个md5的消息摘要
- MessageDigest alga = MessageDigest.getInstance("MD5");
- // 添加要进行计算摘要的信息
- alga.update(info.getBytes());
- // 得到该摘要
- digesta = alga.digest();
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- // 将摘要转为字符串
- String rs = byte2hex(digesta);
- return rs;
- }
- /**
- * 进行SHA加密
- *
- * @param info 要加密的信息
- * @return String 加密后的字符串
- */
- public String encryptToSHA(String info) {
- byte[] digesta = null;
- try {
- // 得到一个SHA-1的消息摘要
- MessageDigest alga = MessageDigest.getInstance("SHA-1");
- // 添加要进行计算摘要的信息
- alga.update(info.getBytes());
- // 得到该摘要
- digesta = alga.digest();
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- // 将摘要转为字符串
- String rs = byte2hex(digesta);
- return rs;
- }
- /**
- * 根据一定的算法得到相应的key
- * @param src
- * @return
- */
- public String getKey(String algorithm,String src){
- if(algorithm.equals("AES")){
- return src.substring(0, 16);
- }else if(algorithm.equals("DES")){
- return src.substring(0, 8);
- }else{
- return null;
- }
- }
- /**
- * 得到AES加密的key
- * @param src
- * @return
- */
- public String getAESKey(String src){
- return this.getKey("AES", src);
- }
- /**
- * 得到DES加密的key
- * @param src
- * @return
- */
- public String getDESKey(String src){
- return this.getKey("DES", src);
- }
- /**
- * 创建密匙
- *
- * @param algorithm 加密算法,可用 AES,DES,DESede,Blowfish
- * @return SecretKey 秘密(对称)密钥
- */
- public SecretKey createSecretKey(String algorithm) {
- // 声明KeyGenerator对象
- KeyGenerator keygen;
- // 声明 密钥对象
- SecretKey deskey = null;
- try {
- // 返回生成指定算法的秘密密钥的 KeyGenerator 对象
- keygen = KeyGenerator.getInstance(algorithm);
- // 生成一个密钥
- deskey = keygen.generateKey();
- } catch (NoSuchAlgorithmException e) {
- e.printStackTrace();
- }
- // 返回密匙
- return deskey;
- }
- /**
- * 创建一个AES的密钥
- * @return
- */
- public SecretKey createSecretAESKey() {
- return createSecretKey("AES");
- }
- /**
- * 创建一个DES的密钥
- * @return
- */
- public SecretKey createSecretDESKey() {
- return createSecretKey("DES");
- }
- /**
- * 根据相应的加密算法、密钥、源文件进行加密,返回加密后的文件
- * @param Algorithm 加密算法:DES,AES
- * @param key
- * @param info
- * @return
- */
- public String encrypt(String Algorithm, SecretKey key, String info) {
- // 定义要生成的密文
- byte[] cipherByte = null;
- try {
- // 得到加密/解密器
- Cipher c1 = Cipher.getInstance(Algorithm);
- // 用指定的密钥和模式初始化Cipher对象
- // 参数:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)
- c1.init(Cipher.ENCRYPT_MODE, key);
- // 对要加密的内容进行编码处理,
- cipherByte = c1.doFinal(info.getBytes());
- } catch (Exception e) {
- e.printStackTrace();
- }
- // 返回密文的十六进制形式
- return byte2hex(cipherByte);
- }
- /**
- * 根据相应的解密算法、密钥和需要解密的文本进行解密,返回解密后的文本内容
- * @param Algorithm
- * @param key
- * @param sInfo
- * @return
- */
- public String decrypt(String Algorithm, SecretKey key, String sInfo) {
- byte[] cipherByte = null;
- try {
- // 得到加密/解密器
- Cipher c1 = Cipher.getInstance(Algorithm);
- // 用指定的密钥和模式初始化Cipher对象
- c1.init(Cipher.DECRYPT_MODE, key);
- // 对要解密的内容进行编码处理
- cipherByte = c1.doFinal(hex2byte(sInfo));
- } catch (Exception e) {
- e.printStackTrace();
- }
- return new String(cipherByte);
- }
- /**
- * 根据相应的解密算法、指定的密钥和需要解密的文本进行解密,返回解密后的文本内容
- * @param Algorithm 加密算法:DES,AES
- * @param key 这个key可以由用户自己指定 注意AES的长度为16位,DES的长度为8位
- * @param sInfo
- * @return
- */
- public static String decrypt(String Algorithm, String sSrc, String sKey) throws Exception {
- try {
- // 判断Key是否正确
- if (sKey == null) {
- throw new Exception("Key为空null");
- }
- // 判断采用AES加解密方式的Key是否为16位
- if (Algorithm.equals("AES") && sKey.length() != 16) {
- throw new Exception("Key长度不是16位");
- }
- // 判断采用DES加解密方式的Key是否为8位
- if (Algorithm.equals("DES") && sKey.length() != 8) {
- throw new Exception("Key长度不是8位");
- }
- byte[] raw = sKey.getBytes("ASCII");
- SecretKeySpec skeySpec = new SecretKeySpec(raw, Algorithm);
- Cipher cipher = Cipher.getInstance(Algorithm);
- cipher.init(Cipher.DECRYPT_MODE, skeySpec);
- byte[] encrypted1 = hex2byte(sSrc);
- try {
- byte[] original = cipher.doFinal(encrypted1);
- String originalString = new String(original);
- return originalString;
- } catch (Exception e) {
- throw e;
- }
- } catch (Exception ex) {
- throw ex;
- }
- }
- /**
- * 根据相应的加密算法、指定的密钥、源文件进行加密,返回加密后的文件
- * @param Algorithm 加密算法:DES,AES
- * @param key 这个key可以由用户自己指定 注意AES的长度为16位,DES的长度为8位
- * @param info
- * @return
- */
- public static String encrypt(String Algorithm, String sSrc, String sKey) throws Exception {
- // 判断Key是否正确
- if (sKey == null) {
- throw new Exception("Key为空null");
- }
- // 判断采用AES加解密方式的Key是否为16位
- if (Algorithm.equals("AES") && sKey.length() != 16) {
- throw new Exception("Key长度不是16位");
- }
- // 判断采用DES加解密方式的Key是否为8位
- if (Algorithm.equals("DES") && sKey.length() != 8) {
- throw new Exception("Key长度不是8位");
- }
- byte[] raw = sKey.getBytes("ASCII");
- SecretKeySpec skeySpec = new SecretKeySpec(raw, Algorithm);
- Cipher cipher = Cipher.getInstance(Algorithm);
- cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
- byte[] encrypted = cipher.doFinal(sSrc.getBytes());
- return byte2hex(encrypted);
- }
- /**
- * 采用DES随机生成的密钥进行加密
- * @param key
- * @param info
- * @return
- */
- public String encryptToDES(SecretKey key, String info) {
- return encrypt("DES", key, info);
- }
- /**
- * 采用DES指定密钥的方式进行加密
- * @param key
- * @param info
- * @return
- * @throws Exception
- */
- public String encryptToDES(String key, String info) throws Exception {
- return encrypt("DES", info, key);
- }
- /**
- * 采用DES随机生成密钥的方式进行解密,密钥需要与加密的生成的密钥一样
- * @param key
- * @param sInfo
- * @return
- */
- public String decryptByDES(SecretKey key, String sInfo) {
- return decrypt("DES", key, sInfo);
- }
- /**
- * 采用DES用户指定密钥的方式进行解密,密钥需要与加密时指定的密钥一样
- * @param key
- * @param sInfo
- * @return
- */
- public String decryptByDES(String key, String sInfo) throws Exception {
- return decrypt("DES", sInfo, key);
- }
- /**
- * 采用AES随机生成的密钥进行加密
- * @param key
- * @param info
- * @return
- */
- public String encryptToAES(SecretKey key, String info) {
- return encrypt("AES", key, info);
- }
- /**
- * 采用AES指定密钥的方式进行加密
- * @param key
- * @param info
- * @return
- * @throws Exception
- */
- public String encryptToAES(String key, String info) throws Exception {
- return encrypt("AES", info, key);
- }
- /**
- * 采用AES随机生成密钥的方式进行解密,密钥需要与加密的生成的密钥一样
- * @param key
- * @param sInfo
- * @return
- */
- public String decryptByAES(SecretKey key, String sInfo) {
- return decrypt("AES", key, sInfo);
- }
- /**
- * 采用AES用户指定密钥的方式进行解密,密钥需要与加密时指定的密钥一样
- * @param key
- * @param sInfo
- * @return
- */
- public String decryptByAES(String key, String sInfo) throws Exception {
- return decrypt("AES", sInfo, key);
- }
- /**
- * 十六进制字符串转化为2进制
- *
- * @param hex
- * @return
- */
- public static byte[] hex2byte(String strhex) {
- if (strhex == null) {
- return null;
- }
- int l = strhex.length();
- if (l % 2 == 1) {
- return null;
- }
- byte[] b = new byte[l / 2];
- for (int i = 0; i != l / 2; i++) {
- b[i] = (byte) Integer.parseInt(strhex.substring(i * 2, i * 2 + 2), 16);
- }
- return b;
- }
- /**
- * 将二进制转化为16进制字符串
- *
- * @param b 二进制字节数组
- * @return String
- */
- public static String byte2hex(byte[] b) {
- String hs = "";
- String stmp = "";
- for (int n = 0; n < b.length; n++) {
- stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
- if (stmp.length() == 1) {
- hs = hs + "0" + stmp;
- } else {
- hs = hs + stmp;
- }
- }
- return hs.toUpperCase();
- }
- /**
- * 测试
- *
- * @param args
- */
- public static void main(String[] args) {
- EncryptUtils encryptUtils = new EncryptUtils();
- String source = "www.putiman.com";
- System.out.println("Hello经过MD5:" + encryptUtils.encryptToMD5(source));
- System.out.println("Hello经过SHA:" + encryptUtils.encryptToSHA(source));
- System.out.println("========随机生成Key进行加解密==============");
- // 生成一个DES算法的密匙
- SecretKey key = encryptUtils.createSecretDESKey();
- String str1 = encryptUtils.encryptToDES(key, source);
- System.out.println("DES加密后为:" + str1);
- // 使用这个密匙解密
- String str2 = encryptUtils.decryptByDES(key, str1);
- System.out.println("DES解密后为:" + str2);
- // 生成一个AES算法的密匙
- SecretKey key1 = encryptUtils.createSecretAESKey();
- String stra = encryptUtils.encryptToAES(key1, source);
- System.out.println("AES加密后为:" + stra);
- // 使用这个密匙解密
- String strb = encryptUtils.decryptByAES(key1, stra);
- System.out.println("AES解密后为:" + strb);
- System.out.println("========指定Key进行加解密==============");
- try {
- String AESKey = encryptUtils.getAESKey(encryptUtils.encryptToSHA(source));
- String DESKey = encryptUtils.getDESKey(encryptUtils.encryptToSHA(source));
- System.out.println(AESKey);
- System.out.println(DESKey);
- String str11 = encryptUtils.encryptToDES(DESKey, source);
- System.out.println("DES加密后为:" + str11);
- // 使用这个密匙解密
- String str12 = encryptUtils.decryptByDES(DESKey, str11);
- System.out.println("DES解密后为:" + str12);
- // 生成一个AES算法的密匙
- String strc = encryptUtils.encryptToAES(AESKey, source);
- System.out.println("AES加密后为:" + strc);
- // 使用这个密匙解密
- String strd = encryptUtils.decryptByAES(AESKey, strc);
- System.out.println("AES解密后为:" + strd);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
更多文章见:http://www.16boke.com
Java常用的加密解密类(对称加密类)的更多相关文章
- DotNet加密方式解析--对称加密
离过年又近了一天,回家已是近在咫尺,有人欢喜有人愁,因为过几天就得经历每年一度的装逼大戏,亲戚朋友加同学的各方显摆,所以得靠一剂年终奖来装饰一个安稳的年,在这里我想起了一个题目“论装逼的技术性和重要性 ...
- 各种加密解密函数(URL加密解密、sha1加密解密、des加密解密)
原文:各种加密解密函数(URL加密解密.sha1加密解密.des加密解密) 普通hash函数如md5.sha1.base64等都是不可逆函数.虽然我们利用php可以利用这些函数写出可逆函数来.但是跨语 ...
- JAVA加密解密DES对称加密算法
下面用DES对称加密算法(设定一个密钥,然后对所有的数据进行加密)来简单举个例子. 首先,生成一个密钥KEY. 我把它保存到key.txt中.这个文件就象是一把钥匙.谁拥有它,谁就能解开我们的类文件. ...
- java加解密算法--对称加密工作模式
对称加密又分为分组加密和序列密码.分组密码,也叫块加密(block cyphers),一次加密明文中的一个块.是将明文按一定的位长分组,明文组经过加密运算得到密文组,密文组经过解密运算(加密运算的逆运 ...
- java加密算法入门(二)-对称加密详解
1.简单介绍 什么是对称加密算法? 对称加密算法即,加密和解密使用相同密钥的算法. 优缺点: 优点:算法公开.计算量小.加密速度快.加密效率高. 缺点: (1)交易双方都使用同样钥匙,安全性得不到保证 ...
- Java进阶(八)Java加密技术之对称加密 非对称加密 不可逆加密算法
对称加密 非对称加密 不可逆加密算法 根据密钥类型不同可以将现代密码技术分为两类:对称加密算法(私钥密码体系)和非对称加密算法(公钥密码体系). 1 对称加密算法 原理 对称加密算法中,数据加密和解密 ...
- 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#
前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...
- DES加密解密与AES加密解密
随着开发时间的变长,当初认为比较难的东西,现在渐渐也就变的不那么难了!特别对于一些经常很少使用的类,时间长了之后渐渐就陌生了.所以在这里写一些日后可能会用到的加密与解密. 一.AES加密算法和DES加 ...
- ssl原理,非对称加密握手,对称加密传输
SSL的基本思想是用非对称加密来建立链接(握手阶段),用对称加密来传输数据(传输阶段).这样既保证了密钥分发的安全,也保证了通信的效率. SSL握手,单方服务器认证(一般的浏览器上网) SSL握手,双 ...
- MD5加密,Base64加密/解密,AES加密/解密
1.从github上下载GTMBase64-master和AESCrypt-ObjC-master导入工程,如下图所示. 2.使用前的配置及注意事项: (1) 在build phases中的GTMBa ...
随机推荐
- java.io.FileNotFoundException: antlr-2.7.7.jar (系统找不到指定的路径。)[待解决]
严重: Failed to destroy the filter named [struts2] of type [org.apache.struts2.dispatcher.ng.filter.St ...
- 解决Ubuntu下adb无法联接手机终端
1.首先确认开发者选项中USB调试是否打开. 2.在终端输入lsusb,如下图: 查看设备是否已经连接,如果没有此选项,请检查你的手机数据线是否正常连接,否则你的手机就可以用来防身和砸核桃了. 3.在 ...
- Jmeter系列培训(1)--开山篇
一直以来,我们不断分享,有的人喜欢,也有的人不喜欢,这都没什么,喜欢的点个赞,留个言,不喜欢的就不看好了,今天我们继续,关于jmeter我们分享了很多工作遇到的问题的解决方案,但是很多 ...
- HDU 1853
http://acm.hdu.edu.cn/showproblem.php?pid=1853 和下题一模一样,求一个图环的并,此题的题干说的非常之裸露 http://www.cnblogs.com/x ...
- magento导航栏中如何加入home主页
magento在导航栏中加入home主页是很简单的,几个步骤即可在magento导航栏中加入home主页! 下面简单介绍下如何在magento导航栏中加入home主页: 首先我们打开对应应用的模板文件 ...
- Ubuntu终端及VI 快捷键
Ubuntu终端 快捷键 功能 Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+k 删除此处至末尾的所有内容 Ctrl+u 删除此处至开始的所有内容 Ct ...
- spring boot 热部署devtools实现
1.devtools spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot ...
- Select2 用法
http://www.cnblogs.com/wuhuacong/p/4761637.html 2.这个做详细参考 http://www.jianshu.com/p/c5ab74b91b2e 3.ht ...
- memsql 基本完全免费了
一个很好的消息是memesql 从6.7 版本开始,对于用户来说已经可以免费使用了(ha 以及安全功能),只是目前有一个 限制是集群内存最大可以使用的是128G,但是一般来说已经够用. 参考资料 ht ...
- 实战:mysql检查物理磁盘中的二进制日志文件是否有丢失
版权声明:日常札记,乐于分享 https://blog.csdn.net/yangzhawen/article/details/32103555 场景:有时候由于磁盘损坏或人为原因错误删除了磁盘中的二 ...