RSA Javascript加密和Golang解密

总结

要实现JavaScript使用RSA加密,Golang进行解密的过程,可以遵循以下步骤:

  1. 在JavaScript中加密数据

    • 使用Web Crypto API中的RSA算法进行加密。使用crypto.subtle.encrypt方法对数据进行加密,并将加密结果以Base64格式输出,以便于传输。
  2. 在Golang中解密数据

    • 先安装所需的加密库,例如crypto/rsacrypto/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编码