当前位置:网站首页>RSA 非对称 加密解密 加签验签工具
RSA 非对称 加密解密 加签验签工具
2022-07-27 03:44:00 【bug修复机器人】
import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* @Author:
* @Description: RSA 非对称 加密解密 加签验签工具
* @Date: Created in 15:01 2016/4/9
*/
public class AbutmentRSAUtil {
public static final String SHA1_WITH_RSA = "SHA1WithRSA";
private static final String SHA256_WITH_RSA = "SHA256WithRSA";
public static final String MD5_WITH_RSA = "MD5WithRSA";
public static final int KEY_SIZE_2048 = 2048;
public static final int KEY_SIZE_1024 = 1024;
/**
* SHA1WithRSA签名
*/
public static String sign(String in,String pivateKey,String algorithm) throws Exception{
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.decodeBase64(pivateKey));
KeyFactory keyf = KeyFactory.getInstance("RSA");
PrivateKey priKey = keyf.generatePrivate(priPKCS8);
Signature signa = Signature.getInstance(algorithm!=null?algorithm:SHA256_WITH_RSA);
signa.initSign(priKey);
signa.update(in.getBytes());
byte[] signdata = signa.sign();
return Base64.encodeBase64String(signdata);
}
/**
* SHA1WithRSA签名
*/
public static String sign(String in,String pivateKey) throws Exception{
return sign(in,pivateKey,null);
}
/**
* SHA1WithRSA验签
*/
public static boolean isValid(String in,String signData,String publicKey,String algorithm) throws Exception{
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] encodedKey = Base64.decodeBase64(publicKey);
PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));
Signature signa = Signature.getInstance(algorithm!=null?algorithm:SHA256_WITH_RSA);
signa.initVerify(pubKey);
signa.update(in.getBytes());
byte[] sign_byte = Base64.decodeBase64(signData);
boolean flag = signa.verify(sign_byte);
return flag;
}
/**
* SHA1WithRSA验签
*/
public static boolean isValid(String in,String signData,String publicKey) throws Exception{
return isValid(in,signData,publicKey, null);
}
/**
* RSA公钥加密
*/
public static String encrypt( String str, String publicKey) throws Exception{
//base64编码的公钥
byte[] decoded = Base64.decodeBase64(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
//RSA加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
return outStr;
}
/**
* 私钥加密
*/
public static String privateEncrypt( String str, String privateKey) throws Exception{
//base64编码的公钥
byte[] decoded = Base64.decodeBase64(privateKey);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
//RSA加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, priKey);
String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
return outStr;
}
/**
* RSA私钥解密
*/
public static String decrypt(String str, String privateKey) throws Exception{
//64位解码加密后的字符串
byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
//base64编码的私钥
byte[] decoded = Base64.decodeBase64(privateKey);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
//RSA解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, priKey);
String outStr = new String(cipher.doFinal(inputByte));
return outStr;
}
/**
* RSA公钥解密
*/
public static String publicDecrypt(String str, String publicKey) throws Exception{
//64位解码加密后的字符串
byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
//base64编码的私钥
byte[] decoded = Base64.decodeBase64(publicKey);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
//RSA解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, pubKey);
String outStr = new String(cipher.doFinal(inputByte));
return outStr;
}
/**
* 随机生成密钥对
* 也可以用阿里的生成工具
*/
public static void genKeyPair(Integer keySize) throws NoSuchAlgorithmException {
if(keySize==null){
keySize = KEY_SIZE_2048;
}
// KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
// 初始化密钥对生成器,密钥大小为96-1024位
keyPairGen.initialize(keySize, new SecureRandom());
// 生成一个密钥对,保存在keyPair中
KeyPair keyPair = keyPairGen.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到私钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 得到公钥
String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));
// 得到私钥字符串
String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));
// 将公钥和私钥保存到Map
System.out.println("公钥:"+publicKeyString);
System.out.println("私钥:"+privateKeyString);
}
public static void main(String[] args) throws NoSuchAlgorithmException {
genKeyPair(null);
}
}边栏推荐
- ISG index shows that the it and business service market in the Asia Pacific region fell sharply in the second quarter
- 电商分账系统重要吗,平台应该如何选择分账服务商呢?
- 技术分享 | 需要小心配置的 gtid_mode
- Elastic open source community: Developer Recruitment
- JS modify the key value of the object array
- Framework learning journey: init process startup process
- From scratch, C language intensive Lecture 4: array
- [C language] recursively explain the tower of Hanoi problem
- PX4模块设计之十二:High Resolution Timer设计
- Eureka service registry
猜你喜欢

【小样本分割】MSANet: Multi-Similarity and Attention Guidance for Boosting Few-Shot Segmentation

shel自动设置目录权限

Cool Lehman VR panorama paves the way for you to start a business

卷积神经网络——灰度图像的卷积

项目参数做成可配置项,@ConfigurationProperties注解的使用

Framework learning journey: init process startup process

Ribbon load balancing principle and some source codes

The project parameters are made into configurable items, and the @configurationproperties annotation is used

VR panorama gold rush "careful machine" (Part 1)

HEAD detached from origin/...导致push失败
随机推荐
ArrayList与LinkedList区别
Ribbon load balancing principle and some source codes
tcp协议知识详解
PX4模块设计之十二:High Resolution Timer设计
【软件工程期末复习】知识点+大题详解(E-R图、数据流图、N-S盒图、状态图、活动图、用例图....)
法解析的外部符号 “public: virtual __cdecl nvinfer1::YoloLayerPlugin::~YoloLayerPlugin(void)“ “public: virtua
Standard C language 11
Word/Excel 固定表格大小,填写内容时,表格不随单元格内容变化
Principle of bean validation --07
Elastic认证考试:30天必过速通学习指南
js修改对象数组的key值
JMeter learning notes 004-csv file line number control cycle times
VR panorama gold rush "careful machine" (Part 1)
spicy之evt接口定义文件
Plato farm has a new way of playing, and the arbitrage eplato has secured super high returns
els_ 画矩形、代码规划和备份
微信input组件添加清除图标,点击清空不生效
深度剖析 —— 动态内存管理
Remember the major performance problems caused by a TCP packet loss
网工知识角|只需四个步骤,教会你使用SecureCRT连接到eNSP,常用工具操作指南必看