RSA加密解密+加签验签+生成公私钥对方法(完整版)

RSA加密解密+加签验签+⽣成公私钥对⽅法(完整版)
RSA加密解密(包含⽣成公私钥对⽅法)
package com.len.util;
import sun.misc.BASE64Decoder;
pto.BadPaddingException;
pto.Cipher;
pto.IllegalBlockSizeException;
pto.NoSuchPaddingException;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
/**
* 加签验签,私钥加签,公钥验签
* 加密解密,公钥加密,私钥解密
企业财务通则
* 2019年7⽉29⽇13:43:25
* @author ful
*
*/
public class Sha1withRSAUtil {
//加签验签的公钥
private static String PUBLIC_KEY ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4L/7MhR99+yswtvSr0dKen";
public static final String KEY_ALGORITHM = "RSA";
public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
//加密解密的公钥
private static String PUBLIC_KEY2 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLL3buJCUeWdIXufBUSthNVdR6f5wZXlm/GSNKHOG=";
//加密解密的私钥
private static String PRIVATE_KEY2 = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIsvdu4kJR5Z0he58FRK2E1V1Hp/nBleWb8ZI0IZ TaX5hqwbKmEkFaocswUoc4bzoHXwSNHVek8UjpNuYG7PCRmNIL2bVaXOvsv8EFAQ67mk17+aSPhHNETajRgjE7nJvZSsdLEa2fmtBHBxzNOEUT/f4wfnZ 3AJ/vju/3nX9a21AgMBAAECgYB55VPPNDCd6CQrS1jDOdk9wZGYxvG69fq7dhR+6xIp7eKYECKJeMTQetn+BnNHGU7Ke2oK+19mqqZDUEN8SC26vCqpg w8cmFgqTMCYc4i7wnQaOlE20X/sonFZNz4plEIe3SQbQeBlgr/sl80QPgsAnTMFWCCZ1yX1FbSyjs4ucQJBAMJ1qRwoiO9yMUUzNEBWNar6JU4TXybG0s MimUFe6SMAzct5wR0IDD+V4O+ps1Rwu51v8ltes80/+3BFvUBiHTMCQQC3O7WTPpk1V8LRE7bn3Hjh8QdLkdAi13cKaz8Y+vraLJuiuEgnFnUTfTqRmRJ4p 1ejb0XPhI+HaVEd+985P3l3AkEAi7roTWeDHiu747Grdh98aONeMwAQe1ia0cTmwuZkN9a4CeHvNeE2i+oyu4QBbEelSLfMOoOOR4oWLtKt7rmRqQJASPH CRU4EXBIGAongpMlGblwv1UvFGjnAsCslwWIY/0YG526JetYb4ZhW+qN/kPy9jNi9Z/GT2gp5OoCMyxOT3QJBAKEduCHZpY5Jre5i9s7tWm94WO7UAAxi9f9 3aXHuf7DKgZ8psX+/FQd59jTcajWJX9NN/aTjlRNaapLzayGvdWk=";
/**
* 验证签名
*
* @param signString
* @param sign
* @return
* @throws Exception
*/
public static boolean verify(String signString, String sign) throws Exception {
byte[] data = decryptBASE64(signString);
byte[] signs = Bytes();
try {
//实例化
Signature signature = Instance(SIGNATURE_ALGORITHM);
// 解密由base64编码的公钥
byte[] keyBytes = decryptBASE64(PUBLIC_KEY);
// 构造X509EncodedKeySpec对象
// 构造X509EncodedKeySpec对象
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
// KEY_ALGORITHM 指定的加密算法
KeyFactory keyFactory = Instance(KEY_ALGORITHM);
// 取公钥对象
PublicKey pubKey = atePublic(keySpec);
//初始化
signature.initVerify(pubKey);
//更新
signature.update(signs);
//验签
return signature.verify(data);
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {        // TODO Auto-generated catch block
e.printStackTrace();
}
合肥五里墩立交桥
return false;
}
/**
* 加密数据
* @param originData
* @return
*/
public static String encodeData(String originData){
白板说try {
// 取公钥对象
PublicKey pubKey = getPublicKey(PUBLIC_KEY2);
Cipher cipher = Instance("RSA");
cipher.init(Cipher.ENCRYPT_MODE,pubKey);
byte[] bytesEncrypt = cipher.Bytes());
//Base64编码
byte[] bytesEncryptBase64 = Encoder().encode(bytesEncrypt);
return new String(bytesEncryptBase64);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
环境保护部环境规划院
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 解密数据
* @param encodeData
* @return
*/
public static String decodeData(String encodeData){
try {
// 取公钥对象
PrivateKey privateKey = getPrivateKey(PRIVATE_KEY2);
//Base64解码
byte[] bytesEncrypt = Decoder().decode(encodeData);
//加密
Cipher cipher = Instance("RSA");
cipher.init(Cipher.DECRYPT_MODE,privateKey);
byte[] bytesDecrypt = cipher.doFinal(bytesEncrypt);
return new String(bytesDecrypt);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* BASE64解密
*
* @param key
* @return
* @throws Exception
*/
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* 将字符串转换成公钥
* @param key
* @return
* @throws Exception
*/
public static PublicKey getPublicKey(String key) throws Exception {
byte[] keyBytes;
keyBytes = (new BASE64Decoder()).decodeBuffer(key);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = Instance("RSA");
PublicKey publicKey = atePublic(keySpec);
return publicKey;
}
/**
* 将字符串转换成私钥
* @param key
* @return
* @throws Exception
*/
public static PrivateKey getPrivateKey(String key) throws Exception {
byte[] keyBytes;
keyBytes = (new BASE64Decoder()).decodeBuffer(key);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = Instance("RSA");
盐城卫生职业学院PrivateKey privateKey = atePrivate(keySpec);
return privateKey;
}
public static void main(String[] args) {
String jiami = encodeData("⾷之⽆味,弃之可惜");
System.out.println("加密后的数据:"+jiami);
String jiemi = decodeData(jiami);
System.out.println("解密后的数据:"+jiemi);
}
//    public static void main(String[] args) {
//        /**
//        * 私钥加签
//        * 公钥验签
//        */
/
/        try {
//            String signString = "YBBNqO5nTbuNLAwm4vMkLb/h7CDDTBDuOFgXaui/2UtLl8iwXYdj/LQKvpwpdYTzawfawiidWMzMeFri4753WvlVegk5CKx9CH qo4NbAmI62c+P9yv6rZ398V/Q2NJOeM7XV+0602lbozbh2UrYIpciH14hnQ1UfJthIdRB07Y8=";
//            String sign = "memberid=1232&changAmount=123&changeWay=1";
//            boolean flag = verify(signString,sign);
//            System.out.println("验证结果:"+flag);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
}
RSA加签验签
import java.io.UnsupportedEncodingException;
import java.security.*;
/**
* 2019年7⽉29⽇13:43:39
* ful
* 加签验签签名验证:验证数据的合法来源即验证数据来源的合法性
* 加签:私钥
* 验签:公钥
*/
public class Test {
private static String privateKeyPath="储存私钥信息的⽂件路径";
private static String publicKeyPath="储存公钥信息的⽂件路径";
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, SignatureException {
String data="验证该数据是否为合法的服务器发送";
/**
* 加签过程
*/
PrivateKey privateKey = PrivateKey(privateKeyPath);
Signature signature = Instance("Sha1WithRSA");
signature.initSign(privateKey);
signature.Bytes("UTF-8"));
byte[] signed = signature.sign();
佳木斯大学教务网络管理系统/**
* 验签过程
*/
PublicKey publicKey = PublicKey(publicKeyPath);
Signature signature2 = Instance("Sha1WithRSA");
signature2.initVerify(publicKey);
signature2.Bytes("UTF-8"));
boolean verify = signature2.verify(signed);
System.out.println("验签结果:"+verify);
}
}
RSA公私钥对⽣成⽅法
package com.len.util;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.util.HashMap;
import java.util.Map;
/**
* RSA⽣成公钥私钥⼯具
*/
public class RsaKeysUtil{
public static final String KEY_ALGORITHM = "RSA";
private static final String PUBLIC_KEY = "RSAPublicKey";
private static final String PRIVATE_KEY = "RSAPrivateKey";
public static void main(String[] args) {
Map<String, Object> keyMap;
try {
keyMap = initKey();
String publicKey = getPublicKey(keyMap);
String privateKey = getPrivateKey(keyMap);
System.out.println("⽣成的公钥=>" + publicKey);
System.out.println("⽣成的私钥=>" + privateKey);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String getPublicKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) (PUBLIC_KEY);
return Encoded());
}
public static String getPrivateKey(Map<String, Object> keyMap) throws Exception {
Key key = (Key) (PRIVATE_KEY);
return Encoded());
}
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
/**
* RSA是⽬前最有影响⼒的公钥加密算法,该算法基于⼀个⼗分简单的数论事实:将两个⼤素数相乘⼗分容易,但那时想要对其乘积进⾏因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,⽽两个⼤素数组合成私钥。公钥是可发布的供任何⼈使⽤,私钥则为⾃⼰所有,供解密之⽤。
* <p>
* 解密者拥有私钥,并且将由私钥计算⽣成的公钥发布给加密者。加密都使⽤公钥进⾏加密,并将密⽂发送到解密者,解密者⽤私钥解密将密⽂解码为明⽂。
* <p>
* 以甲要把信息发给⼄为例,⾸先确定⾓⾊:甲为加密者,⼄为解密者。⾸先由⼄随机确定⼀个KEY,称之为密匙,将这个KEY始终保存在机器B中⽽不发出来;然后,由这个 KEY计算出另⼀个KEY,称之为公匙。这个公钥的特性是⼏乎不可能通过它⾃⾝计算出⽣成它的私钥。接下来通过⽹络把这个公钥传给甲,甲收到公钥后,利⽤公钥对信息加密,并把密⽂通过⽹络发送到⼄,最后⼄利⽤已知的私钥,就对密⽂进⾏解码了。以上就是RSA算法的⼯作流程。
* <p>
* 算法实现过程为:
* <p>

本文发布于:2024-09-20 17:25:12,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/577949.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:公钥   加密   私钥
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议