自己写的AES和RSA加密解密工具
说明:本工具并未自己实现加密解密算法,使用jdk内置加解密工具和commons-codec工具进行加解密
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.CRC32; import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /**
* @ClassName: EncryptUtils
* @Description: 加密、解密、压缩工具
* @author: liuyx
* @date: 2016年5月10日上午9:07:42
*/
public class EncryptUtils extends Base64 {
public static final String KEY_ALGORITHM_RSA = "RSA";
public static final String KEY_ALGORITHM_AES = "AES"; private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey"; public static final String SIGNATURE_ALGORITHM_MD5_RSA = "MD5withRSA";
/**
*
* @Title: getCRC32Value
* @author:liuyx @date:2016年5月10日09:19:29
* @Description: 获取字符串对应的重复概率较小的整形
* @param str
* 传入32位字符串
* @return
*/
public static String getCRC32Value(String str) {
CRC32 crc32 = new CRC32();
crc32.update(str.getBytes());
return Long.toString(crc32.getValue());
} /*AES相关------start*/
/**
*
* @Title: getAesRandomKeyString
* @author:liuyx
* @date:2016年5月10日上午9:30:15
* @Description: 获取AES随机密钥字符串
* @return
*/
public static String getAESRandomKeyString() {
// 随机生成密钥
KeyGenerator keygen;
try {
keygen = KeyGenerator.getInstance(KEY_ALGORITHM_AES);
SecureRandom random = new SecureRandom();
keygen.init(random);
Key key = keygen.generateKey();
// 获取秘钥字符串
String key64Str = encodeBase64String(key.getEncoded());
return key64Str;
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
return null;
} } /**
*
* @Title: encryptByAESAndBase64
* @author:liuyx
* @date:2016年5月10日上午9:40:37
* @Description: 使用AES加密,并返回经过BASE64处理后的密文
* @param base64EncodedAESKey
* 经过BASE64加密后的AES秘钥
* @param dataStr
* @return
*/
public static String encryptByAESAndBase64(String base64EncodedAESKey, String dataStr) {
SecretKey secretKey = restoreAESKey(base64EncodedAESKey); // 初始化加密组件
Cipher cipher;
try {
cipher = Cipher.getInstance(KEY_ALGORITHM_AES);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
// 加密后的数据,首先将字符串转为byte数组,然后加密,为便于保存先转为base64
String encryptedDataStr = encodeBase64String(cipher.doFinal(dataStr.getBytes()));
return encryptedDataStr;
} catch (Exception e) {
// e.printStackTrace();
return null;
}
} /**
*
* @Title: decryptByAESAndBase64
* @author:liuyx
* @date:2016年5月10日上午11:24:47
* @Description: 使用AES解密,并返回经过BASE64处理后的密文
* @param base64EncodedAESKey
* @param encryptedDataStr
* @return
*/
public static String decryptByAESAndBase64(String base64EncodedAESKey, String encryptedDataStr) {
SecretKey secretKey = restoreAESKey(base64EncodedAESKey);
try {
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_AES);
// 将加密组件的模式改为解密
cipher.init(Cipher.DECRYPT_MODE, secretKey);
// 和上面的加密相反,先解base64,再解密,最后将byte数组转为字符串
String decryptedDataStr = new String(cipher.doFinal(Base64.decodeBase64(encryptedDataStr)));
return decryptedDataStr;
} catch (Exception e) {
// TODO: handle exception
return null;
} } /**
*
* @Title: restoreAESKey
* @author:liuyx
* @date:2016年5月10日上午9:53:01
* @Description: 还原BASE64加密后的AES密钥
* @param base64EncodedAESKey
* @return
*/
public static SecretKey restoreAESKey(String base64EncodedAESKey) {
// 还原秘钥字符串到秘钥byte数组
byte[] keyByteArray = decodeBase64(base64EncodedAESKey);
// 重新形成秘钥,SecretKey是Key的子类
SecretKey secretKey = new SecretKeySpec(keyByteArray, KEY_ALGORITHM_AES);
return secretKey;
} /*AES相关------end*/ /*RSA相关------start*/
/**
*
* @Title: getRSARandomKeyPair
* @author:liuyx
* @date:2016年5月10日上午10:00:04
* @Description: 生成RSA密钥对
* @return
*/
public static Map getRSARandomKeyPair() {
KeyPairGenerator keyPairGen;
try {
keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM_RSA);
keyPairGen.initialize(512);
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); String publicKeyStr = encodeBase64String(publicKey.getEncoded());
String privateKeyStr = encodeBase64String(privateKey.getEncoded()); Map<String, String> keyMap = new HashMap<String, String>(2);
keyMap.put(PUBLIC_KEY, publicKeyStr);
keyMap.put(PRIVATE_KEY, privateKeyStr);
return keyMap;
} catch (NoSuchAlgorithmException e) {
//e.printStackTrace();
return null;
} } /**
*
* @Title: encryptByRSAPublicKeyAndBase64
* @author:liuyx
* @date:2016年5月10日上午10:50:00
* @Description: RSA公钥加密:使用RSA公钥(BASE64加密后的字符串)对数据进行加密
* @param publicRSAKey
* @param dataStr
* @return
*/
public static String encryptByRSAPublicKeyAndBase64(String publicRSAKey,String dataStr) {
byte[] data = dataStr.getBytes();
// 对公钥解密
Key decodePublicKey = restoreRSAPublicKeyFromBase64KeyEncodeStr(publicRSAKey); // 对数据加密
Cipher cipher;
try {
cipher = Cipher.getInstance(KEY_ALGORITHM_RSA);
cipher.init(Cipher.ENCRYPT_MODE, decodePublicKey);
byte[] encodedData = cipher.doFinal(data);
String encodedDataStr = encodeBase64String(encodedData);
return encodedDataStr;
} catch (Exception e) {
// TODO Auto-generated catch block
return null;
} }
/**
*
* @Title: decryptByRSAPublicKeyAndBase64
* @author:liuyx
* @date:2016年5月10日上午10:56:03
* @Description: RSA公钥解密:使用RSA公钥(BASE64加密后的字符串)对数据进行解密
* @param publicRSAKey
* @param encryptedDataStr
* @return
*/
public static String decryptByRSAPublicKeyAndBase64(String publicRSAKey, String encryptedDataStr) {
//还原公钥
Key decodePublicKey = restoreRSAPublicKeyFromBase64KeyEncodeStr(publicRSAKey);
try {
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_RSA);
cipher.init(Cipher.DECRYPT_MODE, decodePublicKey);
byte[] decodedData = cipher.doFinal(Base64.decodeBase64(encryptedDataStr));
String decodedDataStr = new String(decodedData);
return decodedDataStr;
} catch (Exception e) {
// TODO: handle exception
return null;
} } /**
*
* @Title: getSignFromEncryptedDataWithPrivateKey
* @author:liuyx
* @date:2016年5月10日上午11:08:13
* @Description: 生成RSA签名:使用base64加密后的私钥和加密后的数据(byte数组形式),获取加密数据签名
* @param privateRSAKey
* @param encryotedDataStr
* @return
*/
public static String getSignFromEncryptedDataWithPrivateKey(String privateRSAKey,String encryotedDataStr) {
byte[] data = decodeBase64(encryotedDataStr);
//加密后的数据+私钥,生成签名
Key decodePrivateKey = restoreRSAPrivateKeyFromBase64KeyEncodeStr(privateRSAKey);
Signature signature;
try {
signature = Signature.getInstance(SIGNATURE_ALGORITHM_MD5_RSA);
signature.initSign((PrivateKey)decodePrivateKey); //用的是私钥
signature.update(data); //用的是加密后的数据字节数组
//取得签名
String sign = Base64.encodeBase64String((signature.sign()));
return sign;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
} } /**
*
* @Title: verifySign
* @author:liuyx
* @date:2016年5月10日上午11:18:06
* @Description: 验证RSA签名
* @param publicRSAKey
* @param sign
* @param encryotedDataStr
* @return
*/
public static boolean verifySign(String publicRSAKey,String sign,String encryotedDataStr) {
byte[] data = decodeBase64(encryotedDataStr);
Key decodePublicKey = restoreRSAPublicKeyFromBase64KeyEncodeStr(publicRSAKey);
//初始化验证签名
Signature signature;
try {
signature = Signature.getInstance(SIGNATURE_ALGORITHM_MD5_RSA);
signature.initVerify((PublicKey )decodePublicKey); //用的是公钥
signature.update(data); //用的是加密后的数据字节数组
boolean ret = signature.verify(decodeBase64(sign));
return ret;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return false;
} /**
*
* @Title: encryptByRSAPrivateKeyAndBase64
* @author:liuyx
* @date:2016年5月10日上午11:00:03
* @Description: RSA私钥加密:使用RSA私钥(BASE64加密后的字符串)对数据进行加密
* @param privateRSAKey
* @param dataStr
* @return
*/
public static String encryptByRSAPrivateKeyAndBase64(String privateRSAKey,String dataStr) {
byte[] data = dataStr.getBytes();
// 对私钥解密
Key decodePrivateKey = restoreRSAPrivateKeyFromBase64KeyEncodeStr(privateRSAKey); // 对数据加密
Cipher cipher;
try {
cipher = Cipher.getInstance(KEY_ALGORITHM_RSA);
cipher.init(Cipher.ENCRYPT_MODE, decodePrivateKey);
byte[] encodedData = cipher.doFinal(data);
String encodedDataStr = encodeBase64String(encodedData);
return encodedDataStr;
} catch (Exception e) {
// TODO Auto-generated catch block
return null;
} } /**
*
* @Title: decryptByRSAPrivateKeyAndBase64
* @author:liuyx
* @date:2016年5月10日上午11:26:44
* @Description: RSA私钥解密:使用RSA私钥(BASE64加密后的字符串)对数据进行解密
* @param privateRSAKey
* @param encryptedDataStr
* @return
*/
public static String decryptByRSAPrivateKeyAndBase64(String privateRSAKey, String encryptedDataStr) {
//还原私钥
Key decodePrivateKey = restoreRSAPrivateKeyFromBase64KeyEncodeStr(privateRSAKey);
try {
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM_RSA);
cipher.init(Cipher.DECRYPT_MODE, decodePrivateKey);
byte[] decodedData = cipher.doFinal(Base64.decodeBase64(encryptedDataStr));
String decodedDataStr = new String(decodedData);
return decodedDataStr;
} catch (Exception e) {
// TODO: handle exception
return null;
} } /*
* 获取base64加密后的字符串的原始公钥
*/
private static Key restoreRSAPublicKeyFromBase64KeyEncodeStr(String keyStr) {
byte[] keyBytes = Base64.decodeBase64(keyStr);
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
Key publicKey = null;
try {
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM_RSA);
publicKey = keyFactory.generatePublic(x509KeySpec);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return publicKey;
} /*
* 获取base64加密后的字符串的原始私钥
*/
private static Key restoreRSAPrivateKeyFromBase64KeyEncodeStr(String keyStr) {
byte[] keyBytes = Base64.decodeBase64(keyStr);
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); Key privateKey=null;
try {
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM_RSA);
privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return privateKey;
}
/*RSA相关------end*/ public static void main(String[] args) {
String str = "981hf98w7`9h5fdjk09qy56hty4gahguewqpg{}d[}]df2,,,1,4";
System.out.println("原字符串:"+str);
String aesKey = EncryptUtils.getAESRandomKeyString();
String aesEncryptedStr = EncryptUtils.encryptByAESAndBase64(aesKey, str);
System.out.println("AES加密后:"+aesEncryptedStr);
String aesDecryptedStr = EncryptUtils.decryptByAESAndBase64(aesKey, aesEncryptedStr);
System.out.println("AES解密后:"+aesDecryptedStr); Map<String,String> keyPair = EncryptUtils.getRSARandomKeyPair();
String publicRSAKey = keyPair.get(EncryptUtils.PUBLIC_KEY);
String privateRSAKey = keyPair.get(EncryptUtils.PRIVATE_KEY); String encryptedStr = EncryptUtils.encryptByRSAPublicKeyAndBase64(publicRSAKey, str);
System.out.println("公钥加密后:"+encryptedStr);
String decryptedStr = EncryptUtils.decryptByRSAPrivateKeyAndBase64(privateRSAKey, encryptedStr);
System.out.println("私钥解密后:"+decryptedStr); encryptedStr = EncryptUtils.encryptByRSAPrivateKeyAndBase64(privateRSAKey, str);
System.out.println("私钥加密后:"+encryptedStr); String sign = EncryptUtils.getSignFromEncryptedDataWithPrivateKey(privateRSAKey, encryptedStr);
System.out.println("签名:"+sign);
boolean verifyResult = EncryptUtils.verifySign(publicRSAKey, sign, encryptedStr);
System.out.println("签名验证结果:"+verifyResult); decryptedStr = EncryptUtils.decryptByRSAPublicKeyAndBase64(publicRSAKey, encryptedStr);
System.out.println("公钥解密后:"+decryptedStr);
}
}
异常的处理都是简单的返回了null,实际使用时请自行调整异常处理。
自己写的AES和RSA加密解密工具的更多相关文章
- 使用java实现对称加密解密(AES),非对称加密解密(RSA)
对称加密:双方采用同样的秘钥进行加密和解密.特点是速度快,但是安全性没有非对称加密高 非对称加密:接收方生成的公有秘钥公布给发送方,发送方使用该公有秘钥加密之后,发送给接收方,然后接收方使用私有秘钥解 ...
- C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法
因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
- C# Java间进行RSA加密解密交互
原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...
- C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出
差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...
- RSA 加密 解密 公钥 私钥 签名 加签 验签
http://blog.csdn.net/21aspnet/article/details/7249401# http://www.ruanyifeng.com/blog/2013/06/rsa_al ...
- RSA加密解密,String转PublicKey、PrivateKey;附Base64.JAR
网络请求的数据需要加密,服务器给的他们那一套在Android一直报错,自己写了一个: package com.cc.common.util; import javax.crypto.Cipher; i ...
- RSA加密解密与加签验签
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...
- 使用polarssl进行RSA加密解密
RSA算法的原理就不提了,网上有很多介绍的文章,因为项目中使用RSA加密,所以需要找一个RSA加密的算法,之前尝试过使用Crypto++库,无奈Crypto++其中使用了大量的模版,各种继承,看着头大 ...
随机推荐
- sql 存储过程中top 后面跟参数的问题
之前存储过程中有top的情况,都是拼接sql,然后通过exec执行,进行查询结果,很不方便. 今天研究了,原来top后面是可以直接写参数的. 只需要top 后面的参数加上小括号就好了 eg: TOP ...
- LeetCode 8 String to Integer (string转int)
题目来源:https://leetcode.com/problems/string-to-integer-atoi/ Implement atoi to convert a string to an ...
- javascript 全局变量 局部变量 var 与不加var的区别
一.外部的为全局,内部的为局部变量. 二.加var为局部变量(在方法内),不加var为全局变量(当方法内有一次使用后) <script type="text/javascrip ...
- PL/SQL之--包
一.包 包是一组相关过程.函数.常量.变量.游标.异常等PL/SQL程序设计元素的组合.它类似于C++和Java中的类,其中变量相当于类中的成员变量,过程和函数相当于类中的方法.通过使用包,可以使开发 ...
- android怎么连接sqlite数据库?
SQLite数据库首先先建立SQLiteOpenHelper()的子类实现SQLiteOpenHelper中的OnCreate()方法和构造方法. this class takes care of o ...
- 前端mock数据之mockjax和mockjson
用处 在前后台共同进行一个项目的时候常会遇到一种情景, 后台定义好接口,前端按照接口进行开发, 当前端开发完成后台接口却还没有开发完成, 这个时候要进行接口测试, 只能等后台开发完成才能测试, 在这中 ...
- java Timer(定时调用、实现固定时间执行)
最近需要用到定时调用的功能.可以通过java的Timer类来进行定时调用,下面是有关Timer的一些相关知识. 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了run方法的一个 ...
- LAMP编译参数查看
Linux下查看Nginx.Napache.MySQL.PHP的编译参数的命令如下: 1.nginx编译参数:#/usr/local/nginx/sbin/nginx -V2.apache编译参数:# ...
- J2EE笔记2
1. 部署并启动 tomcat 服务器.1). 解压 apache-tomcat-6.0.16.zip 到一个非中文目录下2). 配置一个环境变量. java_home(指向 JDK 安装的根目录) ...
- jquery/js实现验证聚焦,失焦
jquery实现验证聚焦,失焦方法: 我还是喜欢用jquery来实现,不管页面中多少个输入框需要实现聚焦,失焦,都公有,我常用的方法是: 遍历该页面中的input框,获取输入框中的val值,当该输入框 ...