package com.twodfire.alipay.utils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Map;
import java.util.SortedMap;
/**
* Created by Administrator on 2015/12/25.
*/
public class RsaCipherHelper {
private static final String GOUQI_PRIVATE_KEY = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIodOSS4fXlvWYrgJdOCeLhBCsei" +
"CBaYqolfdViVCIETXJWQovUf1qRUtFyUaO4uh/2I0zx125MWA/Nr8Lz3iRSm2MfA62aON019Qsl8" +
"iAztT3a3Qe9duavhrNqyILX+QMyOIuHHHObD0ChbgsuBINrJ2OttDH+LP7Wss3kO4eMdAgMBAAEC" +
"gYAUmIkF9dEYQ8eZkxVw9hrkdyaRYJNOM1PzCl4oaIkNHoMG9rumTCoo9Uy0JZmEM0IqR7YgZP7q" +
"bzUFnsoWk99IESL98WnEZg+ze7xQdv0fwPA1c43MhzD+i1a0LWPS10HlO+M7PfQyWWguHa3os+aQ" +
"DSyYrHg6M+e6tkh4X7yf7QJBAODPtGe0F7XtXKVwvO+lnEzYw7mKhEsB6Rtz/bV/AVRsmT4ahnnb" +
"dCFvyyInEZ56faJyxjVhdB85TZ29ESHl9VcCQQCdRmvZePTlpT2vxjQswtRtOlzekIRgm19vgu2X" +
"foUyVgISiqvl0+uPHAju9wYkkyNm001l9OVU5uo+0LiMHc6rAkAL28j3Y2+QwCmP7Id62LCK+TAx" +
"3FWoIzypnw+2ADIQwv2+YeXQDbxtexkq/waV5n40EHvWGwLmFr66YFvD/v5XAkA2CneOf2Bu9Etw" +
"9YMCCmQhsBcvJqtF4r11PKDVGFU+SY1mv513WE0tnG15ZwoGUUSt1VdX/EE822fT87Yl9ywHAkBG" +
"7hb76FMfc9dXXxMSxeP+HVk0M6BW0GCNZWp2xE6yYxLvesy1IeLUOrsHjhd6JhvUc0+Ym91F7kNn" +
"aXqPCDRd";
private static final String GOUQI_PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKHTkkuH15b1mK4CXTgni4QQrHoggWmKqJX3VY" +
"lQiBE1yVkKL1H9akVLRclGjuLof9iNM8dduTFgPza/C894kUptjHwOtmjjdNfULJfIgM7U92t0Hv" +
"Xbmr4azasiC1/kDMjiLhxxzmw9AoW4LLgSDaydjrbQx/iz+1rLN5DuHjHQIDAQAB";
/**
* 生成签名
*
* @param content
* @param privateKey
* @return
*/
public static String sign(String content, String privateKey) {
return sign(content, str2PrivateKey(privateKey));
}
/**
* 验证签名
*
* @param content
* @param publicKey
* @return
*/
public static boolean verify(String content, String sign, String publicKey) {
return verify(content, sign, str2PublicKey(publicKey));
}
/**
* @param content
* @param privateKey
* @return
*/
public static String sign(String content, RSAPrivateKey privateKey) {
try {
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initSign(privateKey);
signature.update(content.getBytes("utf-8"));
return new BASE64Encoder().encode(signature.sign());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* @param content
* @param publicKey
* @return
*/
public static boolean verify(String content, String sign, RSAPublicKey publicKey) {
try {
Signature signature = Signature.getInstance("SHA1withRSA");
signature.initVerify(publicKey);
signature.update(content.getBytes("utf-8"));
return signature.verify((new BASE64Decoder()).decodeBuffer(sign));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static RSAPublicKey str2PublicKey(String publicKeyPerm) {
try {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec((new BASE64Decoder()).decodeBuffer(publicKeyPerm));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return (RSAPublicKey) keyFactory.generatePublic(keySpec);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static RSAPrivateKey str2PrivateKey(String privateKeyPerm) {
try {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec((new BASE64Decoder()).decodeBuffer(privateKeyPerm));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 将所有POST 参数(sign除外)进行字典排序,组成字符串, 然后使用私钥产生签名
* @param params
* @return sign
*/
public static String encodeParams(SortedMap<?, ?> params, String privateKey) {
StringBuilder sb = new StringBuilder();
for (Map.Entry<?, ?> entry : params.entrySet()) {
sb.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
sb.deleteCharAt(sb.length() - 1);
return sign(sb.toString(), privateKey);
}
public static void main2(String[] args) throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.genKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
BASE64Encoder base64Encoder = new BASE64Encoder();
System.out.println("-------------------public key----------------------");
System.out.println(base64Encoder.encode(publicKey.getEncoded()));
System.out.println("-------------------private key---------------------");
System.out.println(base64Encoder.encode(privateKey.getEncoded()));
}
public static void main3(String[] args) {
String publicKey = GOUQI_PUBLIC_KEY;
String privateKey = GOUQI_PRIVATE_KEY;
String appPrivateKey = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAN0yqP" +
"kLXlnhM+2H/57aHsYHaHXazr9pFQun907TMvmbR04wHChVsKVgGUF1hC0FN" +
"9hfeYT5v2SXg1WJSg2tSgk7F29SpsF0I36oSLCIszxdu7ClO7c22mxEVuCj" +
"mYpJdqb6XweAZzv4Is661jXP4PdrCTHRdVTU5zR9xUByiLSVAgMBAAECgYEAh" +
"znORRonHylm9oKaygEsqQGkYdBXbnsOS6busLi6xA+iovEUdbAVIrTCG9t854" +
"z2HAgaISoRUKyztJoOtJfI1wJaQU+XL+U3JIh4jmNx/k5UzJijfvfpT7Cv3ueM" +
"tqyAGBJrkLvXjiS7O5ylaCGuB0Qz711bWGkRrVoosPM3N6ECQQD8hVQUgnHEVH" +
"ZYtvFqfcoq2g/onPbSqyjdrRu35a7PvgDAZx69Mr/XggGNTgT3jJn7+2XmiGkH" +
"M1fd1Ob/3uAdAkEA4D7aE3ZgXG/PQqlm3VbE/+4MvNl8xhjqOkByBOY2ZFfWKh" +
"lRziLEPSSAh16xEJ79WgY9iti+guLRAMravGrs2QJBAOmKWYeaWKNNxiIoF7/4" +
"VDgrcpkcSf3uRB44UjFSn8kLnWBUPo6WV+x1FQBdjqRviZ4NFGIP+KqrJnFHzN" +
"gJhVUCQFzCAukMDV4PLfeQJSmna8PFz2UKva8fvTutTryyEYu+PauaX5laDjyQ" +
"bc4RIEMU0Q29CRX3BA8WDYg7YPGRdTkCQQCG+pjU2FB17ZLuKRlKEdtXNV6zQ" +
"FTmFc1TKhlsDTtCkWs/xwkoCfZKstuV3Uc5J4BNJDkQOGm38pDRPcUDUh2/";
String sign = sign("jackiezhi", appPrivateKey);
System.out.println(sign);
//System.out.println(verify("jackiezhi", sign, publicKey));
}
}
分享到:
相关推荐
Java实现,公钥私钥通过计算生产,没有调用API,可以更直观的理解RSA公钥私钥的生成 资源中包含源码、jar包。不管是不想造轮子还是想要学习的同学都适用 也可以根据需要改造代码
* RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加签验签:私钥加签,公钥验签。 * RSA加密解密:私钥解密,公钥加密。 * RSA数字签名-俗称加...
支付宝签名、验签、RSA、RSA2公钥、私钥一键生成等工具
数据库密码的为了安全最后加密存放,这是一个RSA加密工具类。包含钥匙的生成和检测公钥私钥,具体看类说明,做Java或者Android可以直接拿来使用 非常方便!
可以直接运行成功的RSA加密解密示例 JAVA端采用公钥加密,服务端C#采用私钥解密。
生成RSA公钥和私钥的工具:Windows版OpenSSL 亲测可用。提供32位系统和64位系统版本
亲测可用,可参考:https://blog.csdn.net/qq_37835111/article/details/87358779
用java代码生成公钥私钥密钥对,公钥加密私钥解密,私钥加密公钥解密。直接导入idea,可直接运行。小编正在看区块链的多重加密,看到这儿了就写了一个demo,用于理解加解密。
C# RSA加密、解密、加签、验签、支持JAVA格式公钥私钥、PEM格式公钥私钥、.NET格式公钥私钥 对应文章: http://blog.csdn.net/gzy11/article/details/54573973
应用场景用于当你使用的是.net技术需要调用对方的接口时,但对方使用的是java语言时需要把对方提供的RSA私钥或者RSA公钥进行转换成.net格式进行使用。否则可能会出现解密失败的情况出现,相反就是你是java技术需要...
C#通过 n、e和d(模数、公钥指数和私钥指数)三个参数来RSA加解密及签名和验签。如果只是公钥解密和验证签名,那么可以不需要知道私钥指数(D),这在某些时候对方传过来N和E来解密和验签的时候非常管用(验证签名的...
C# RSA加密、支持JAVA格式公钥私钥
C#RSA加密解密签名和验证签名的小例子,代码都加了注释...使用签名和验证签名这个操作就可以实现了.RSA是非对称加密,一般情况下是用公钥加密,私钥解密,这是一对.特殊情况下(例如验证软件正版),使用签名和验证签名这一对.
签名RSA验签工具 生成工具 私钥公钥
C++书写,采用RSA加密算法,可生成公钥和私钥加密解密。
一个简单的java使用RSA生成公私钥对 非对称加密解密 签名验签的过程,附带一个基本的加密工具类,有兴趣的朋友可以下载下来看看
本文介绍如何使用mbedtls编译生成RSA 4096长度的公私钥,再使用私钥进行PSS签名,公钥验签
RSA加密解密算法,可以实现现场的加密解密,可以更改公钥私钥。
获取RSA公钥+私钥
非常好用的rsa工具,可以生成公钥私钥字符串,也可以生成文件,也可以直接在工具中做加签和验签的动作,可以验证公钥私钥是否是一对儿,也可以从私钥中直接获取公钥,功能很强大