java 与golang 非对称加解密

实现目标

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容