当前位置:网站首页>RSA加密和解密工具
RSA加密和解密工具
2022-06-09 16:40:00 【如花。】
import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import cn.com.hwqh.user.service.impl.UserServiceImpl;
import cn.com.hwqh.user.util.utility.MyConfiguration;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
/** * @ClassName: RSAUtil * @version: 1.0 * @description: RSA加密和解密工具 **/
public class RSAUtil {
private static Logger logger = LoggerFactory.getLogger(RSAUtil.class);
/** * 数字签名,密钥算法 */
private static final String RSA_KEY_ALGORITHM = "RSA";
/** * 数字签名签名/验证算法 */
private static final String SIGNATURE_ALGORITHM = "MD5withRSA";
/** * RSA密钥长度,RSA算法的默认密钥长度是1024密钥长度必须是64的倍数,在512到65536位之间 */
private static final int KEY_SIZE = 1024;
/** * 私钥 */
public static final String PRIVATE_KEY = MyConfiguration.create().getString("private.key");
/** * 生成密钥对 */
private static Map<String, String> initKey() throws Exception {
KeyPairGenerator keygen = KeyPairGenerator.getInstance(RSA_KEY_ALGORITHM);
SecureRandom secrand = new SecureRandom();
/** * 初始化随机产生器 */
secrand.setSeed("initSeed".getBytes());
/** * 初始化密钥生成器 */
keygen.initialize(KEY_SIZE, secrand);
KeyPair keys = keygen.genKeyPair();
byte[] pub_key = keys.getPublic().getEncoded();
String publicKeyString = Base64.encodeBase64String(pub_key);
byte[] pri_key = keys.getPrivate().getEncoded();
String privateKeyString = Base64.encodeBase64String(pri_key);
Map<String, String> keyPairMap = new HashMap<>();
keyPairMap.put("publicKeyString", publicKeyString);
keyPairMap.put("privateKeyString", privateKeyString);
return keyPairMap;
}
/** * 密钥转成字符串 * * @param key * @return */
public static String encodeBase64String(byte[] key) {
return Base64.encodeBase64String(key);
}
/** * 密钥转成byte[] * * @param key * @return */
public static byte[] decodeBase64(String key) {
return Base64.decodeBase64(key);
}
/** * 公钥加密 * * @param data 加密前的字符串 * @param publicKey 公钥 * @return 加密后的字符串 * @throws Exception */
public static String encryptByPubKey(String data, String publicKey) throws Exception {
byte[] pubKey = RSAUtil.decodeBase64(publicKey);
byte[] enSign = encryptByPubKey(data.getBytes(), pubKey);
return Base64.encodeBase64String(enSign);
}
/** * 公钥加密 * * @param data 待加密数据 * @param pubKey 公钥 * @return * @throws Exception */
public static byte[] encryptByPubKey(byte[] data, byte[] pubKey) throws Exception {
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/** * 私钥加密 * * @param data 加密前的字符串 * @param privateKey 私钥 * @return 加密后的字符串 * @throws Exception */
public static String encryptByPriKey(String data, String privateKey) throws Exception {
byte[] priKey = RSAUtil.decodeBase64(privateKey);
byte[] enSign = encryptByPriKey(data.getBytes(), priKey);
return Base64.encodeBase64String(enSign);
}
/** * 私钥加密 * * @param data 待加密的数据 * @param priKey 私钥 * @return 加密后的数据 * @throws Exception */
public static byte[] encryptByPriKey(byte[] data, byte[] priKey) throws Exception {
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/** * 公钥解密 * * @param data 待解密的数据 * @param pubKey 公钥 * @return 解密后的数据 * @throws Exception */
public static byte[] decryptByPubKey(byte[] data, byte[] pubKey) throws Exception {
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, publicKey);
return cipher.doFinal(data);
}
/** * 公钥解密 * * @param data 解密前的字符串 * @param publicKey 公钥 * @return 解密后的字符串 * @throws Exception */
public static String decryptByPubKey(String data, String publicKey) throws Exception {
byte[] pubKey = RSAUtil.decodeBase64(publicKey);
byte[] design = decryptByPubKey(Base64.decodeBase64(data), pubKey);
return new String(design);
}
/** * 私钥解密 * * @param data 待解密的数据 * @param priKey 私钥 * @return * @throws Exception */
public static byte[] decryptByPriKey(byte[] data, byte[] priKey) throws Exception {
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/** * 私钥解密 * * @param data 解密前的字符串 * @param privateKey 私钥 * @return 解密后的字符串 * @throws Exception */
public static String decryptByPriKey(String data, String privateKey) throws Exception {
byte[] priKey = RSAUtil.decodeBase64(privateKey);
byte[] design = decryptByPriKey(Base64.decodeBase64(data), priKey);
return new String(design);
}
/** * 私钥解密 * * @param data 解密前的字符串 * @param privateKey 私钥 * @return 解密后的字符串 * @throws Exception */
public static String myDecryptByPriKey(String data) throws Exception {
byte[] priKey = RSAUtil.decodeBase64(PRIVATE_KEY);
byte[] design = decryptByPriKey(Base64.decodeBase64(data), priKey);
return new String(design);
}
/** * RSA签名 * * @param data 待签名数据 * @param priKey 私钥 * @return 签名 * @throws Exception */
public static String sign(byte[] data, byte[] priKey) throws Exception {
// 取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey);
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
// 生成私钥
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec);
// 实例化Signature
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
// 初始化Signature
signature.initSign(privateKey);
// 更新
signature.update(data);
return Base64.encodeBase64String(signature.sign());
}
/** * RSA校验数字签名 * * @param data 待校验数据 * @param sign 数字签名 * @param pubKey 公钥 * @return boolean 校验成功返回true,失败返回false */
public boolean verify(byte[] data, byte[] sign, byte[] pubKey) throws Exception {
// 实例化密钥工厂
KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM);
// 初始化公钥
X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey);
// 产生公钥
PublicKey publicKey = keyFactory.generatePublic(x509KeySpec);
// 实例化Signature
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
// 初始化Signature
signature.initVerify(publicKey);
// 更新
signature.update(data);
// 验证
return signature.verify(sign);
}
public static void main(String[] args) {
try {
Map<String, String> keyMap = initKey();
String publicKeyString = keyMap.get("publicKeyString");
String privateKeyString = keyMap.get("privateKeyString");
logger.info("公钥:" + publicKeyString);
logger.info("私钥:" + privateKeyString);
// 待加密数据
String data = "admin123";
// 公钥加密
String encrypt = RSAUtil.encryptByPubKey(data, publicKeyString);
// 私钥解密
String decrypt = RSAUtil.decryptByPriKey(encrypt, privateKeyString);
logger.info("加密前:" + data);
logger.info("加密后:" + encrypt);
logger.info("解密后:" + decrypt);
} catch (Exception e) {
e.printStackTrace();
}
}
}
边栏推荐
- [typecho]找到非markdown脚本语言编写的文章
- 关于在C#中因没有添加:mysql.data.dll 而报错这件事
- pyepics数组 -- 4
- About not adding mysql data. DLL
- 关联数组&正则表达式
- Chapter I Introduction to esql
- Top level templates (including contract, tender, graduation defense and other templates in all aspects of work)
- Pyepics -- alarm: respond when a PV is out of range
- 使用tesseract识别图片中的文字
- pyepics CA -- 3
猜你喜欢

Merge MP4 files with ffmpeg

ue4 bsp画刷中光源需要重建(x未构建对象)

在初始化时启动mysql服务时显示net不是内部和外部的命令,也不是可运行的程序。如何解决该问题?这与net.exe缺失有关吗

"Forget to learn again" shell Basics - 28. Description of conditional expressions in awk

构建绵羊(非常见物种)BSgenome参考基因组

MDK 5.37 error: unknown register name ‘control‘ 和 Error: C9932E: Cannot obtain license for Compiler

Error occurred when pychart installs the scratch Library‘

使用tesseract识别图片中的文字

Top level templates (including contract, tender, graduation defense and other templates in all aspects of work)

【華東師範大學】初試複試考研資料分享
随机推荐
Pyepics device: collection of PVS
批量删除功能——后台mapper层sql语句解析
中原银行统一日志平台
管理学博士申请考核经验分享——信息收集篇
这么多大学,考研人数大幅上涨!最高超70%!
一款高颜值开源知识管理工具
使用PrimeCache加速你的电脑!
Word tutorial, how to change line spacing in word?
虚拟存储机制
JLINK RTT printing floating point numbers and negative numbers
Kali intranet penetration shell
科研实习 | 北京大学可视化与可视分析实验室招收暑期实习生和推免研究生
干货|移动端App自动化之触屏操作自动化
Right click the project to add a reference, prompting that the call to the COM component returned an error HResult e_ FAIL
冰峰上市IPO,能冲破“本地品牌”的束缚吗?
La seconde guerre mondiale a été piégée dans ces 4 points d'erreur, un an de plus pour rien!
With so many universities, the number of people taking the postgraduate entrance examination has risen sharply! Up to 70%!
CPU program interrupt
小程序启动性能优化实践
Sbio | Chenyun group of Zhejiang University Review on the interaction mechanism between bacteria and fungi in agriculture