前言:
如今各位老铁们对“netdes解密工具”可能比较关心,我们都想要剖析一些“netdes解密工具”的相关知识。那么小编也在网上收集了一些对于“netdes解密工具””的相关内容,希望小伙伴们能喜欢,同学们快快来学习一下吧!@Java讲坛杨33
引入加解密的目的
实际开发中,经常涉及一些业务数据是具有隐私性的,并且不情愿被外人看到这些隐私信息。所以使用Java语言开发,就必须在开发具体业务逻辑代码的时候,引入加解密的工具,把隐私数据保护起来。
下面就用编码封装我常用的两个加解密工具类DES、AES。
DES加解密
DES是一种对称的加解密算法。对称的意思就是加密和解密使用的密钥key是相同的。
直接上工具类代码:
import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;/** * DES加解密工具类 */public class Des3Util { private static final String ALGORITHM = "DESede"; private static final String ENCODING = "UTF-8"; private static final String HEX_SOURCE = "0123456789ABCDEF"; /** * 字节码转十六进制字符串 * @param sources 字节码 * @return */ private static String byteToHex(byte[] sources) { if(sources == null || sources.length == 0){ return null; } StringBuffer result = new StringBuffer(); for(byte source : sources){ String tmp = (Integer.toHexString(source & 0XFF)); if(tmp.length() == 1){ result.append("0" + tmp); }else{ result.append(tmp); } } return result.toString().toUpperCase(); } /** * 十六进制字符串转字节码 * @param source 十六进制字符串 * @return */ public static byte[] hexToByte(String source) { if(source.length() % 2 != 0){ throw new IllegalArgumentException("给定的十六进制字符串的长度不是偶数"); } char[] sourceChars = source.toUpperCase().toCharArray(); int length = sourceChars.length/2; byte buffer[] = new byte[length]; for(int index = 0;index < length; index++) { buffer[index] = (byte) (HEX_SOURCE.indexOf(sourceChars[index*2]) << 4 | HEX_SOURCE.indexOf(sourceChars[index*2 + 1])); } return buffer; } /** * 根据密钥字符串生成密钥字节数组 * @param key 密钥 * @return 密钥字节数组 * @throws Exception */ private static byte[] buildDesKey(String key) throws Exception { byte[] keyByte = new byte[24]; byte[] temp = key.getBytes(ENCODING); if (keyByte.length > temp.length) { //如果temp不够24位,则拷贝temp数组整个长度的内容到key数组中 System.arraycopy(temp, 0, keyByte, 0, temp.length); } else { //如果temp大于24位,则拷贝temp数组24个长度的内容到key数组中 System.arraycopy(temp, 0, keyByte, 0, keyByte.length); } return keyByte; } /** * 加密 * @param source 待加密的字符串 * @param key 密钥 * @return 加密后的字符串 * @throws Exception */ public static String encode(String source, String key) throws Exception { byte[] text = source.getBytes(ENCODING); Cipher cipher = Cipher.getInstance(ALGORITHM + "/CBC/PKCS5Padding"); SecretKey secretKey = new SecretKeySpec(buildDesKey(key), ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(new byte[cipher.getBlockSize()])); byte[] cipherBytes = cipher.doFinal(text); return byteToHex(cipherBytes); } /** * 解密 * @param source 待解密的加密串 * @param key 密钥 * @return 解密后的字符串 * @throws Exception */ public static String decode(String source, String key) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM + "/CBC/PKCS5Padding"); SecretKey secretKey = new SecretKeySpec(buildDesKey(key), ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(new byte[cipher.getBlockSize()])); return new String(cipher.doFinal(hexToByte(source))); } /** * 测试DES加解密 * @param args * @throws Exception */ public static void main(String[] args) throws Exception { String key = "8681d91f1d56458385c9fc23b221828b"; //加密 System.out.println(encode("马云", key)); //解密 System.out.println(decode("1E27D89F0421A8A6", key)); }}AES加解密
AES是DES的加强版,比DES的加解密强度更高。
直接上工具类代码:
import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.spec.SecretKeySpec;/** * AES加解密工具类 */public class AesUtil { /** * 秘钥长度 */ private static final int keysize = 128; /** * 加密方式 */ private static final String algorithm = "AES"; /** * 编码方式 */ private static final String charSet = "UTF-8"; /** * 十六进制字符 */ private static final String HEX_SOURCE = "0123456789ABCDEF"; /** * 加密 * @param source 待加密字符串 * @param key 秘钥 * @return 加密完的十六进制字符串;如果加密失败返回空 */ public static String encrypt(String source, String key) { if(source == null || source.trim().length() == 0 || key == null || key.trim().length() == 0){ return null; } try{ KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed(key.getBytes()); keyGenerator.init(keysize, secureRandom); SecretKeySpec secretKeySpec = new SecretKeySpec(keyGenerator.generateKey().getEncoded(), algorithm); Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); byte[] sourceByte = cipher.doFinal(source.getBytes(charSet)); return byteToHex(sourceByte); }catch(Exception e){ System.err.println(e); return null; } } /** * 解密 * @param source 待解密十六进制字符串 * @param key 秘钥 * @return 加密后的字符串;如果解密失败返回null */ public static String decrypt(String source, String key) { if(source == null || source.trim().length() == 0 || key == null || key.trim().length() == 0){ return null; } try{ byte[] sourceByte = hexToByte(source); KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm); SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed(key.getBytes()); keyGenerator.init(keysize, secureRandom); SecretKeySpec secretKeySpec = new SecretKeySpec(keyGenerator.generateKey().getEncoded(), algorithm); Cipher cipher = Cipher.getInstance(algorithm); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); return new String(cipher.doFinal(sourceByte),"UTF-8"); }catch(Exception e){ return null; } } /** * 字节码转十六进制字符串 * @param sources 字节码 * @return */ private static String byteToHex(byte[] sources) { if(sources == null || sources.length == 0){ return null; } StringBuffer result = new StringBuffer(); for(byte source : sources){ String tmp = (Integer.toHexString(source & 0XFF)); if(tmp.length() == 1){ result.append("0" + tmp); }else{ result.append(tmp); } } return result.toString().toUpperCase(); } /** * 十六进制字符串转字节码 * @param source 十六进制字符串 * @return */ private static byte[] hexToByte(String source){ if(source.length() % 2 != 0){ throw new IllegalArgumentException("给定的十六进制字符串的长度不是偶数"); } char[] sourceChars = source.toUpperCase().toCharArray(); int length = sourceChars.length/2; byte buffer[] = new byte[length]; for(int index = 0;index < length;index++) { buffer[index] = (byte) (HEX_SOURCE.indexOf(sourceChars[index*2]) << 4 | HEX_SOURCE.indexOf(sourceChars[index*2 + 1])); } return buffer; } /** * 测试AES加解密 * @param args */ public static void main(String[] args) { String key = "8681d91f1d56458385c9fc23b221828b"; //加密 System.out.println(encrypt("马云", key)); //解密 System.out.println(decrypt("DBBDAAE0F2B2999E0CA47CB3B7698C38", key)); }}
到此,本次知识分享就结束了,谢谢大家对我的创作方面的鼓励。我会继续努力。
作者:杨33,北京互联网公司在职Java开发,专注分享写作干货。欢迎关注我,期待你的点赞评论。
标签: #netdes解密工具