RSA Javascript加密和Golang解密
总结
要实现JavaScript使用RSA加密,Golang进行解密的过程,可以遵循以下步骤:
在JavaScript中加密数据:
- 使用Web Crypto API中的RSA算法进行加密。使用
crypto.subtle.encrypt
方法对数据进行加密,并将加密结果以Base64格式输出,以便于传输。
- 使用Web Crypto API中的RSA算法进行加密。使用
在Golang中解密数据:
- 先安装所需的加密库,例如
crypto/rsa
和crypto/x509
。然后,使用Golang的crypto/rsa
包中的DecryptOAEP
方法来解密数据。在解密之前,需要将Base64编码的数据解码回字节数组,导入RSA私钥,并执行解密操作。
- 先安装所需的加密库,例如
详细步骤
JavaScript加密:
javascript// JavaScript 使用 Web Crypto API 进行 RSA 加密
async function encryptData(publicKey, data) {
const encoder = new TextEncoder();
const encodedData = encoder.encode(data);
const encryptedData = await crypto.subtle.encrypt(
{
name: "RSA-OAEP"
},
publicKey,
encodedData
);
return btoa(String.fromCharCode(...new Uint8Array(encryptedData)));
}
// 生成或导入RSA公钥,并调用encryptData函数
Golang解密:
go// Golang 使用 crypto/rsa 解密 JavaScript 加密的数据
package main
import (
"crypto/rsa"
"crypto/x509"
"crypto/rand"
"crypto/rsa"
"encoding/base64"
"encoding/pem"
"fmt"
"log"
)
// 解析私钥
func parsePrivateKey(privKeyStr string) (*rsa.PrivateKey, error) {
block, _ := pem.Decode([]byte(privKeyStr))
if block == nil || block.Type != "RSA PRIVATE KEY" {
return nil, fmt.Errorf("failed to parse PEM block containing the key")
}
privKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, fmt.Errorf("failed to parse private key: %v", err)
}
return privKey, nil
}
// 解密函数
func decryptData(privKey *rsa.PrivateKey, encryptedData string) (string, error) {
encryptedBytes, err := base64.StdEncoding.DecodeString(encryptedData)
if err != nil {
return "", fmt.Errorf("failed to decode base64 data: %v", err)
}
decryptedBytes, err := rsa.DecryptOAEP(rand.Reader, rand.Reader, privKey, encryptedBytes, nil)
if err != nil {
return "", fmt.Errorf("failed to decrypt data: %v", err)
}
return string(decryptedBytes), nil
}
func main() {
privKeyStr := `-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCwJ8ZftZHYI/D7Ck7kU8aW8Gv15WKl5M0L5w2e2hP6c+Ke7vn2
...
-----END RSA PRIVATE KEY-----`
privKey, err := parsePrivateKey(privKeyStr)
if err != nil {
log.Fatalf("Error parsing private key: %v", err)
}
encryptedData := "Base64EncodedEncryptedDataHere"
decryptedData, err := decryptData(privKey, encryptedData)
if err != nil {
log.Fatalf("Error decrypting data: %v", err)
}
fmt.Println("Decrypted data:", decryptedData)
}
关键字
JavaScript, RSA加密, Golang, RSA解密, Web Crypto API, crypto.subtle.encrypt
, crypto/rsa
, crypto/x509
, Base64编码, PEM编码