需要引入jar包:commons-codec-1.7.jar
package com.gnet.mis.util;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
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.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gnet.mis.framework.util.Consts;
/**
* 密码工具类。
*
*/
public class CryptoUtils {
protected static Logger logger = LoggerFactory.getLogger(ReflectionUtils.class);
public static void main(String[] args) {
byte[] key = generatorKey(CryptoType.AES);
System.out.println(Base64.encodeBase64String(key));
try {
String str = "1";
String cr = encrypt(str, Consts.COOKIE_KEY, CryptoType.AES);
System.out.println("cr=" + cr);
String de = decrypt(cr, Consts.COOKIE_KEY, CryptoType.AES);
System.out.println("de=" + de);
}
catch (Exception e) {
e.printStackTrace();
}
}
/**
* 使用信息摘要加密算法加密
*
* @param type
* @param content
* @return
* @throws NoSuchAlgorithmException
*/
public final static byte[] messageDigest(MessageDigestType type, String content) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance(type.name());
md.update(content.getBytes());
return md.digest();
}
/**
* 加密数据
*
* @param data 待加密数据
* @param key 密钥
* @param type 加密类型
* @return
* @throws Exception
*/
public static String encrypt(String data, String key, CryptoType type) throws Exception {
Key k = toKey(Base64.decodeBase64(key), type); // 还原密钥
// 使用PKCS7Padding填充方式,这里就得这么写了(即调用BouncyCastle组件实现)
// Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
Cipher cipher = Cipher.getInstance(type.name()); // 实例化Cipher对象,它用于完成实际的加密操作
cipher.init(Cipher.ENCRYPT_MODE, k); // 初始化Cipher对象,设置为加密模式
return Base64.encodeBase64String(cipher.doFinal(data.getBytes())); // 执行加密操作。加密后的结果通常都会用Base64编码进行传输
}
/**
* 解密数据
*
* @param data 待解密数据
* @param key 密钥
* @param type 解密类型
* @return
* @throws Exception
*/
public static String decrypt(String data, String key, CryptoType type) throws Exception {
Key k = toKey(Base64.decodeBase64(key), type);
Cipher cipher = Cipher.getInstance(type.name());
cipher.init(Cipher.DECRYPT_MODE, k); // 初始化Cipher对象,设置为解密模式
return new String(cipher.doFinal(Base64.decodeBase64(data))); // 执行解密操作
}
/**
* 转换密钥
*/
public static Key toKey(byte[] key, CryptoType type) throws Exception {
return new SecretKeySpec(key, type.name());
}
/**
* @param type
* @return
*/
public static byte[] generatorKey(CryptoType type) {
try {
KeyGenerator kgen = KeyGenerator.getInstance(type.name());
kgen.init(128, new SecureRandom());
return kgen.generateKey().getEncoded();
}
catch (NoSuchAlgorithmException e) {
logger.error("generator key error", e);
e.printStackTrace();
}
return null;
}
/**
* 使用128位解密
*
* @param type 解密算法
* @param data
* @param key
* @return
* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
*/
public static byte[] decrypt(CryptoType type, byte[] data, byte[] key) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
SecretKey secretKey = new SecretKeySpec(key, type.name());
return decrypt(type, data, secretKey);
}
/**
* 使用128位解密
*
* @param type 解密算法
* @param data
* @param password
* @return
* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
*/
public static byte[] decrypt(CryptoType type, byte[] data, String password) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
return decrypt(type, data, password.getBytes());
}
/**
* 使用128位解密
*
* @param type 解密算法
* @param content
* @param password
* @return
* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
*/
public static byte[] decrypt(CryptoType type, String content, String password) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
return decrypt(type, content.getBytes(), password.getBytes());
}
/**
* 解密
*
* @param type 解密算法
* @param data
* @param secretKey
* @return
* @throws NoSuchPaddingException
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
private static byte[] decrypt(CryptoType type, byte[] data, SecretKey secretKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// 得到解密器
Cipher cipher = Cipher.getInstance(type.name());
// 用指定的密钥和模式初始化Cipher对象
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 解密
return cipher.doFinal(data);
}
/**
* 使用128位机密
*
* @param content 需要加密的内容
* @param password 加密密码
* @return
*/
public static byte[] encrypt(CryptoType type, String content, byte[] key) {
return encrypt(type, content.getBytes(), key);
}
/**
* 使用128位加密
*
* @param data 需要加密的内容
* @param key 加密密码
* @return
*/
public static byte[] encrypt(CryptoType type, byte[] data, byte[] key) {
SecretKeySpec sks = new SecretKeySpec(key, type.name());
// 加密随机数生成器 (RNG)
// SecureRandom sr = new SecureRandom(key);
return encrypt(type, data, sks); // 加密
}
/**
* 使用128位机密
*
* @param content 需要加密的内容
* @param password 加密密码
* @return
*/
public static byte[] encrypt(CryptoType type, String content, String password) {
return encrypt(type, content.getBytes(), password.getBytes()); // 加密
}
/**
* 加密
*
* @param type
* @param data
* @param secretKey
* @return
*/
public static byte[] encrypt(CryptoType type, byte[] data, SecretKey secretKey) {
// SecretKey sk = new DESedeKeySpec();
// SecretKeyFactory sk = SecretKeyFactory.getInstance(type.name());
// SecretKeySpec sks = new SecretKeySpec(secretKey.getEncoded(), type.name());
SecureRandom sr = new SecureRandom();
try {
Cipher cipher = Cipher.getInstance(type.name());// 创建密码器
cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);// 初始化
return cipher.doFinal(data); // 加密
}
catch (NoSuchAlgorithmException e) {
logger.error("encrypt error", e);
e.printStackTrace();
}
catch (NoSuchPaddingException e) {
logger.error("encrypt error", e);
e.printStackTrace();
}
catch (InvalidKeyException e) {
logger.error("encrypt error", e);
e.printStackTrace();
}
catch (IllegalBlockSizeException e) {
logger.error("encrypt error", e);
e.printStackTrace();
}
catch (BadPaddingException e) {
logger.error("encrypt error", e);
e.printStackTrace();
}
return null;
}
public enum CryptoType {
AES, DES;
}
public enum MessageDigestType {
MD5, SHA
}
}
package com.gnet.mis.util;
import com.gnet.mis.framework.util.Consts;
import com.gnet.mis.util.CryptoUtils.CryptoType;
/**
* 加密解密算法
*
*/
public class SyncInterfaceUtil {
public SyncInterfaceUtil() {
}
/**
* 解析密钥
* passwordCode生成规则:使用dsc加密算法,将时间的转化为长整型(从1970年1月1日起的毫秒的数量表示日期)+“MIS”+MIS操作人员loginID
* @param passwordCode
* @return
*
*/
public static boolean isValidPasswordCode(String base64_passwordCode) {
try {
if(base64_passwordCode == null || "".equals(base64_passwordCode)){
return false;
}
//key
byte[] key = ByteUtils.toByteArray(Consts.SYNC_INTERFACE_PWD_REPLACE_KEY);
byte[] data = ByteUtils.toByteArray(base64_passwordCode);
String passwordCode = "";
try {
passwordCode = new String(CryptoUtils.decrypt(CryptoType.AES, data, key));
System.out.println(passwordCode);
}
catch (Exception e) {
// e.printStackTrace();
return false;
}
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 加密密钥
/ * passwordCode生成规则:使用dsc加密算法,将时间的转化为长整型(从1970年1月1日起的毫秒的数量表示日期)+“ROADSHOW”+路演操作人员loginID
* @param passwordCode
* @return base64_passwordCode
*/
public static String encryptPasswordCode(String passwordCode){
String base64_passwordCode = "";
try {
//key
byte[] key = ByteUtils.toByteArray(Consts.SYNC_INTERFACE_PWD_REPLACE_KEY);
byte[] data = CryptoUtils.encrypt(CryptoType.AES, passwordCode, key);
base64_passwordCode = ByteUtils.toHexString(data);
}
catch (Exception e) {
e.printStackTrace();
}
return base64_passwordCode;
}
}
package com.gnet.mis.util;
import org.apache.commons.codec.binary.Base64;
/**
* 处理byte工具类
*
*/
public class ByteUtils {
/**
* 将byte[]转换16进制数
*
* @param bytes 字节数组
* @return
*/
public static String toHexString(byte[] bytes) {
return Base64.encodeBase64String(bytes);
}
/**
* 将base64字符串转换为数组
*
* @param base64String
* @return
*/
public static byte[] toByteArray(String base64String) {
return Base64.decodeBase64(base64String);
}
}
分享到:
相关推荐
MD5 单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 ...RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密函数 获取Hash描述表 RSA签名 RSA 签名验证
《易飞用户加密解密详解》 在信息技术领域,数据安全是至关重要的议题,而用户加密解密技术正是保障信息安全的重要手段。本文将围绕“易飞用户加密解密”这一主题,深入探讨其原理、应用及操作流程,帮助读者更好地...
在本文中,我们将深入探讨如何在SpringBoot中实现接口的加密解密统一处理,以及如何通过自定义注解来灵活控制加密解密的执行。 首先,我们创建两个自定义注解,`DecryptRequest`和`EncryptResponse`,用于标识哪些...
DES加密解密算法的C语言实现 DES(Data Encryption Standard)是一种对称密钥 BLOCK 加密算法,使用 56 位密钥对 64 位数据块进行加密。下面是 DES 加密解密算法的 C 语言实现的知识点总结。 字节与二进制转换 在...
这个程序应当包含了上述知识点的具体应用,你可以通过阅读源代码、编译和运行来进一步理解和学习AES加密解密的实现细节。这个实战例程可以帮助开发者更好地掌握Qt环境下的加密解密操作,提高数据安全保护能力。
URL参数加密解密;使用简便;URL参数加密解密;使用简便;URL参数加密解密;使用简便;URL参数加密解密;使用简便;
Java实现的RSA加密解密算法示例 本文主要介绍了Java实现的RSA加密解密算法,结合实例形式分析了Java RSA加密解密算法的相关实现技巧。 知识点1:RSA加密解密算法简介 RSA加密解密算法是一种非对称加密算法,由Ron...
**C# RSA加密解密详解** 在信息安全领域,加密技术是一种至关重要的手段,用于保护数据的隐私和安全性。RSA(Rivest-Shamir-Adleman)算法是一种非对称加密算法,广泛应用于网络通信、数据存储等领域。C#作为.NET...
《深入理解ENC文件加密解密工具:以PrimaSoft Encryption Utility为例》 在信息安全日益重要的今天,文件加密解密工具成为保护数据隐私的关键工具。"ENC文件加密解密工具",特别是PrimaSoft Encryption Utility,是...
标题中的“3DES加密解密工具”指的是一个用于执行三重数据加密标准(3DES,Triple DES)的软件工具,这种工具通常用于保护敏感数据的安全,确保信息在传输过程中的机密性。3DES是DES(Data Encryption Standard,...
经典代码(带详解) 函数authcode($string, $operation, $key, ...第六种 函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。
本项目"文件加密解密(完整项目)"专注于利用C#进行文件的安全处理,确保数据在传输和存储时的隐私性。 一、C#加密技术基础 C#中实现文件加密主要依赖于.NET Framework提供的加密类库,如System.Security....
"java实现文件加密解密" Java 实现文件的加密与解密是指利用 Java 语言将资源文件(包括图片、动画等类型)进行简单的加密和解密。这种策略的原因和好处是将准备好的资源存储在云上,使用时通过网络进行读取即可,...
本实例将聚焦于JAVA数据加密解密的实践应用。 首先,让我们理解加密和解密的基本概念。加密是一种将明文(可读信息)转化为密文(不可读信息)的过程,以保护数据不被未经授权的用户访问。解密则是加密的逆过程,将...
C# .net MD5加密解密工具及加密解密类。使用方便,可直接下载加密解密代码在项目中使用。
在这个特定的案例中,"MFC实现文本文件加密解密"是一个使用MFC框架编写的程序,它允许用户对文本文件进行加密和解密操作,确保敏感数据在传输或存储时的安全性。 在VC2010环境下,开发者通常会利用MFC的类库,如...
脚本加密解密器是一种工具,它的主要功能是将脚本代码进行加密处理,以使其在未经授权的情况下无法被轻易读取或理解,同时也能提供解密机制,使得在需要执行时能够正确解读并运行加密后的脚本。 脚本加密通常涉及到...
这个名为"vb.net加密解密源代码"的项目,是利用Visual Studio 2008开发的一个小型应用程序,提供了对数据进行加解密的功能。下面我们将详细探讨相关的知识点。 1. **VB.NET基础**: VB.NET是微软公司开发的一种...
QT C++ AES字符串加密解密类库是一种在C++编程环境中使用QT框架实现的高级加密标准(AES)加密和解密工具。QT是一个流行的开源跨平台应用开发框架,广泛应用于桌面、移动和嵌入式系统。AES是目前广泛应用的对称加密...
"Android APK 加密 解密工具"就是这样一个专门用于加密和解密APK文件的实用程序,它可以帮助开发者增加额外的安全层,确保只有经过授权的用户能够安装和运行应用。 首先,我们需要理解APK加密的基本原理。通常,APK...