博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串加密
阅读量:5245 次
发布时间:2019-06-14

本文共 4698 字,大约阅读时间需要 15 分钟。

1 package com.springcloud.util;  2   3 import java.security.Key;  4 import java.security.Security;  5   6 import javax.crypto.Cipher;  7 /**  8  * 加密类  9  * @author  10  * 11  */ 12 public class EncryptionDecryption { 13     /** 默认加密key */ 14     private static String strDefaultKey = "Defaul"; 15  16     /** 加密工具 */ 17     private Cipher encryptCipher = null; 18  19     /** 解密工具 */ 20     private Cipher decryptCipher = null; 21     /** 22      * 将byte数组转换为表示16进制值的字符串, 如:byte[]{8,18}转换为:0812, 和public static byte[] 23      * hexStr2ByteArr(String strIn) 互为可逆的转换过程 24      *  25      * @param arrB 26      *            需要转换的byte数组 27      * @return 转换后的字符串 28      * @throws Exception 29      *  30      */ 31     public static String byteArr2HexStr(byte[] arrB) throws Exception { 32         int length = arrB.length; 33         // 每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍 34         StringBuffer sb = new StringBuffer(length * 2); 35         for (int i = 0; i < length; i++) { 36             int intTmp = arrB[i]; 37             // 把负数转换为正数 38             while (intTmp < 0) { 39                 intTmp = intTmp + 256; 40             } 41             // 小于0F的数需要在前面补0 42             if (intTmp < 16) { 43                 sb.append("0"); 44             } 45             sb.append(Integer.toString(intTmp, 16)); 46         } 47         return sb.toString(); 48     } 49  50     /** 51      * 将表示16进制值的字符串转换为byte数组, 和public static String byteArr2HexStr(byte[] arrB) 52      * 互为可逆的转换过程 53      * @param strIn 54      *            需要转换的字符串 55      * @return 转换后的byte数组 56      * @throws Exception 57      * 58      */ 59     public static byte[] hexStr2ByteArr(String strIn) throws Exception { 60         byte[] arrB = strIn.getBytes(); 61         int iLen = arrB.length; 62         // 两个字符表示一个字节,所以字节数组长度是字符串长度除以2 63         byte[] arrOut = new byte[iLen / 2]; 64         for (int i = 0; i < iLen; i = i + 2) { 65             String strTmp = new String(arrB, i, 2); 66             arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16); 67         } 68         return arrOut; 69     } 70  71     /** 72      * 默认构造方法,使用默认密钥 73      *  74      * @throws Exception 75      */ 76     public EncryptionDecryption() throws Exception { 77         this(strDefaultKey); 78     } 79  80     /** 81      * 指定密钥构造方法 82      *  83      * @param strKey 84      *            指定的密钥 85      * @throws Exception 86      */ 87     public EncryptionDecryption(String strKey) throws Exception { 88         Security.addProvider(new com.sun.crypto.provider.SunJCE()); 89         Key key = getKey(strKey.getBytes()); 90         encryptCipher = Cipher.getInstance("DES"); 91         encryptCipher.init(Cipher.ENCRYPT_MODE, key); 92         decryptCipher = Cipher.getInstance("DES"); 93         decryptCipher.init(Cipher.DECRYPT_MODE, key); 94     } 95     /** 96      * 加密字节数组 97      *  98      * @param arrB 99      *            需加密的字节数组100      * @return 加密后的字节数组101      * @throws Exception102      */103     public byte[] encrypt(byte[] arrB) throws Exception {104         return encryptCipher.doFinal(arrB);105     }106     /**107      * 加密字符串108      * 109      * @param strIn110      *            需加密的字符串111      * @return 加密后的字符串112      * @throws Exception113      */114     public String encrypt(String strIn) throws Exception {115         return byteArr2HexStr(encrypt(strIn.getBytes()));116     }117     /**118      * 解密字节数组119      * 120      * @param arrB121      *            需解密的字节数组122      * @return 解密后的字节数组123      * @throws Exception124      */125     public byte[] decrypt(byte[] arrB) throws Exception {126         return decryptCipher.doFinal(arrB);127     }128 129     /**130      * 解密字符串131      * @param strIn132      *            需解密的字符串133      * @return 解密后的字符串134      * @throws Exception135      */136     public String decrypt(String strIn) throws Exception {137         try {138             return new String(decrypt(hexStr2ByteArr(strIn)));139         } catch (Exception e) {140             return "";141         }142     }143     /**144      * 从指定字符串生成密钥,密钥所需的字节数组长度为8位 不足8位时后面补0,超出8位只取前8位145      * @param arrBTmp146      *            构成该字符串的字节数组147      * @return 生成的密钥148      * @throws java.lang.Exception149      */150     private Key getKey(byte[] arrBTmp) throws Exception {151         // 创建一个空的8位字节数组(默认值为0)152         byte[] arrB = new byte[8];153         // 将原始字节数组转换为8位154         for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {155             arrB[i] = arrBTmp[i];156         }157         // 生成密钥158         Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");159         return key;160     }161 162 }

本代码摘自某大神博客。

转载于:https://www.cnblogs.com/lfyu/p/9248817.html

你可能感兴趣的文章
电脑高手常用的五个按钮
查看>>
心得5--JSP标签和java bean详细介绍
查看>>
jquey ajax 将变量值封装json传入JAVA action获取解析
查看>>
Log4net_配置
查看>>
高精度正整数除法 大整数除法
查看>>
2016/9/9
查看>>
剑指offer 面试48题
查看>>
Python(四):数字连珠2
查看>>
GitLab 安装(推荐)
查看>>
预加载图片
查看>>
codevs1226 倒水问题
查看>>
SQL Server 2012使用OFFSET/FETCH NEXT分页及性能测试
查看>>
(线段树)敌兵布阵--hdu--1166 (入门)
查看>>
Javascript 对象的创建和属性的判定
查看>>
通过pycharm使用git
查看>>
相邻div,一个跟着另一个自适应高度
查看>>
上架打包错误:error itms-90086
查看>>
js获取元素宽度高度
查看>>
Detection of Glacier Calving Margins with Convolutional Neural Networks: A Case Study
查看>>
UVA-11865 Stream My Contest (朱-刘 算法+二分)
查看>>