美文网首页
java 与golang 非对称加解密

java 与golang 非对称加解密

作者: shoyu666 | 来源:发表于2025-02-09 11:02 被阅读0次

实现目标

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

相关文章

  • 2019-12-20

    RSA非对称加密技术(JAVA版实现加解密处理)介绍 非对称的加密技术就是指加密过程是不可逆,不能通过密文直...

  • 【https】HTTPS加密原理和证书、SSL/TLS握手过程

    非对称加解密效率比较低,因此不会全程用这种方式来加密数据。 服务器和客户端采用非对称加解密方式交换对称加密的密钥(...

  • golang里面private key证书的加解密

    golang里面private key证书的加解密 private key证书的加解密是x509的内容,所以在go...

  • 调研云上的密钥管理服务KMS

    1. 产品调研 Cryption对称加密对称解密非对称加密非对称解密批量加解密字符串or 字节数组?其他AWS E...

  • iOS签名机制

    安全方案 对称密码:DES,3DES,AES 加解密用同一个密钥 加解密速度快 无法解决密钥配送问题 非对称加密:...

  • 数字签名及证书

    1. 加密: 对称加密:用对称密钥及算法进行加密。对称密钥,加解密使用相同的密钥。 非对称加密:用非对称密钥及算法...

  • 加密相关

    加密分为:对称加密和非对称加密。非对称加密的用途:1:加解密,但是速度很慢。2:交换对称加密的密钥,对称加密很快3...

  • 非对称加密之 - RSA

    一、什么是非对称加密算法? 非对称主要是相对于对称加密算法而言的。对称加密算法加解密使用同一个秘钥;非对称算法则有...

  • 知识分享之Golang——用于在Golang中的加解密工具类,包

    知识分享之Golang——用于在Golang中的加解密工具类,包含MD5、RSA超长字符串、CBC、ECB等算法 ...

  • 区块链之加解密算法

    常用的加解密算法  常用的加解密算法有三类:对称加密算法、非对称加密算法以及hash加密算法。 在比特币中用到了非...

网友评论

      本文标题:java 与golang 非对称加解密

      本文链接:https://www.haomeiwen.com/subject/fgjtpjtx.html