实现目标
1:java生成公钥和私钥
2:java 公钥加密,私钥解密
3:java 私钥加密,公钥解密
4:golang 公钥加密,私钥解密
5:java 公钥加密,golang私钥解密
java 代码
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String msg = "hello world";
String[] a = testGenKey();
public_private(a[0],a[1],msg);
private_public(a[0],a[1],msg);
}
public static String[] testGenKey() throws Exception {
//初始化密钥
//生成密钥对
Map<String, Object> keyMap = RSACoder.initKey();
//公钥
byte[] publicKey = RSACoder.getPublicKey(keyMap);
//私钥
byte[] privateKey = RSACoder.getPrivateKey(keyMap);
String[] a = new String[2];
a[0] = Base64.encodeBase64String(publicKey);
a[1] = Base64.encodeBase64String(privateKey);
System.out.println("公钥:" + a[0]);
System.out.println("私钥:" + a[1]);
return a;
}
public static void public_private(String publicKey,String privateKey,String msg) throws Exception{
byte[] data = RSACoder.encryptByPublicKey(msg.getBytes(StandardCharsets.UTF_8), Base64.decodeBase64(publicKey));
System.out.println("公钥加密后:"+Base64.encodeBase64String(data));
byte[] decode2 = RSACoder.decryptByPrivateKey(data, Base64.decodeBase64(privateKey));
System.out.println("私钥解密后:" + new String(decode2));
}
public static void private_public(String publicKey,String privateKey, String msg) throws Exception{
byte[] data = RSACoder.encryptByPrivateKey(msg.getBytes(StandardCharsets.UTF_8), Base64.decodeBase64(privateKey));
System.out.println("私钥加密后:"+Base64.encodeBase64String(data));
byte[] decode2 = RSACoder.decryptByPublicKey(data, Base64.decodeBase64(publicKey));
System.out.println("公钥解密后:" + new String(decode2));
}
输出结果
// 公钥:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMedVLEFCRFya2iIED86smxdnPvUi/U/8Otz4Ikfjlh/RQzYgkXV0MAsVWYUdUUreANLnO06YztaIOY0eACPCY0CAwEAAQ==
// 私钥:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAx51UsQUJEXJraIgQPzqybF2c+9SL9T/w63PgiR+OWH9FDNiCRdXQwCxVZhR1RSt4A0uc7TpjO1og5jR4AI8JjQIDAQABAkAUS79qNkhbQUaBfOAmBapRkV0eT9ihKYyt6/zHBHHdNnmOwMyWDfP9uX758ipFDbjCUz0hger7kP5AfCNEjsQBAiEA5AUndXZH6sArNAiQYqFN2L7khpPlsjL7HcfQAWGoagECIQDgG93fAKum0HtF/9Pb9mhbjaDBOU6t8M1u5ubJnaanjQIhAJ/ToQnrg5NfaakKS7JmoDtJ6sMODdXveCcytHETc8oBAiB1XeK6cU10FWcZ57r6TXelyuxPhUWxTpUn6YEgQZIP2QIgaP0pMIYa2hCqLlNaUm53e54phoVn5EPszrbl1pT6MYI=
// 公钥加密后:wwzEfSVCjqCigEcVmfTOCLNGqwl0fCrNtCEkQseee6vUmW+TseWdySNUOhOS0MaBDibXLVvibUoVVRTn3NsEKQ==
// 私钥解密后:hello world
// 私钥加密后:wWcT8VOcIaO3xDjBeobIBRzy6l+wIZ0DtrEIerdOAkaGp+0JlrkKA6m0no2USxl1PuBHupMDbSBr/7d5abaGMQ==
// 公钥解密后:hello world
golang 代码
// 公钥:MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMedVLEFCRFya2iIED86smxdnPvUi/U/8Otz4Ikfjlh/RQzYgkXV0MAsVWYUdUUreANLnO06YztaIOY0eACPCY0CAwEAAQ==
// 私钥:MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAx51UsQUJEXJraIgQPzqybF2c+9SL9T/w63PgiR+OWH9FDNiCRdXQwCxVZhR1RSt4A0uc7TpjO1og5jR4AI8JjQIDAQABAkAUS79qNkhbQUaBfOAmBapRkV0eT9ihKYyt6/zHBHHdNnmOwMyWDfP9uX758ipFDbjCUz0hger7kP5AfCNEjsQBAiEA5AUndXZH6sArNAiQYqFN2L7khpPlsjL7HcfQAWGoagECIQDgG93fAKum0HtF/9Pb9mhbjaDBOU6t8M1u5ubJnaanjQIhAJ/ToQnrg5NfaakKS7JmoDtJ6sMODdXveCcytHETc8oBAiB1XeK6cU10FWcZ57r6TXelyuxPhUWxTpUn6YEgQZIP2QIgaP0pMIYa2hCqLlNaUm53e54phoVn5EPszrbl1pT6MYI=
// 公钥加密后:wwzEfSVCjqCigEcVmfTOCLNGqwl0fCrNtCEkQseee6vUmW+TseWdySNUOhOS0MaBDibXLVvibUoVVRTn3NsEKQ==
// 私钥解密后:hello world
// 私钥加密后:wWcT8VOcIaO3xDjBeobIBRzy6l+wIZ0DtrEIerdOAkaGp+0JlrkKA6m0no2USxl1PuBHupMDbSBr/7d5abaGMQ==
// 公钥解密后:hello world
func main() {
a, _ := testRas.PublicKeyEncrypt("hello word")
fmt.Println("公钥加密后:" + a)
b, _ := testRas.PrivateKeyDecrypt(a)
fmt.Println("私钥加密后:" + b)
b2, _ := testRas.PrivateKeyDecrypt("wwzEfSVCjqCigEcVmfTOCLNGqwl0fCrNtCEkQseee6vUmW+TseWdySNUOhOS0MaBDibXLVvibUoVVRTn3NsEKQ==")
fmt.Println("java 公钥加密,golang私钥解密后:" + b2)
}
package testRas
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
"errors"
"fmt"
"os"
)
var JavaPublic = "这里是上面 java 生成的公钥"
var JavaPrivate = "这里是上面 java 生成的私钥"
type RsaCrypto struct {
publicKey []byte
privateKey []byte
}
func NewRsaCrypto(pubKey, privKey string) *RsaCrypto {
return &RsaCrypto{
publicKey: []byte(fmt.Sprintf("-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----", pubKey)),
privateKey: []byte(fmt.Sprintf("-----BEGIN PRIVATE KEY-----\n%s\n-----END PRIVATE KEY-----", privKey)),
}
}
// 公钥加密
func (rc *RsaCrypto) PublicKeyEncrypt(data []byte) ([]byte, error) {
block, _ := pem.Decode(rc.publicKey)
if block == nil {
return nil, errors.New("public key error")
}
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return nil, err
}
pub := pubInterface.(*rsa.PublicKey)
return rsa.EncryptPKCS1v15(rand.Reader, pub, data)
}
// 私钥解密
func (rc *RsaCrypto) PrivateKeyDecrypt(encrypted []byte) ([]byte, error) {
block, _ := pem.Decode(rc.privateKey)
if block == nil {
return nil, errors.New("private key error!")
}
privInterface, err := x509.ParsePKCS8PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
priv := privInterface.(*rsa.PrivateKey)
return rsa.DecryptPKCS1v15(rand.Reader, priv, encrypted)
}
func PublicKeyEncrypt(data string) (string, error) {
rsaCrypto := NewRsaCrypto(JavaPublic, JavaPrivate)
encrypted, err := rsaCrypto.PublicKeyEncrypt([]byte(data))
if err != nil {
panic(err)
}
return base64.StdEncoding.EncodeToString(encrypted), nil
}
// AES解密
func PrivateKeyDecrypt(encryptedBase64 string) (string, error) {
rsaCrypto := NewRsaCrypto(JavaPublic, JavaPrivate)
encrypted, err := base64.StdEncoding.DecodeString(encryptedBase64)
if err != nil {
os.Exit(-1)
}
decrypted, err2 := rsaCrypto.PrivateKeyDecrypt(encrypted)
if err2 != nil {
os.Exit(-1)
}
return string(decrypted), nil
}
输出
公钥加密后:IYZtbT6K4Bd5bPAFbCbRQkZpwaXReIkVjWCcw9qrGFFxHYzEAiZP9i0C1V71qre6VKs4fi7emT5KEgI4uxoZnQ==
私钥加密后:hello word
java 公钥加密,golang私钥加密后:hello world