javascript - RSA Javascript加密和Golang解密

标签 javascript go cryptography rsa public-key-encryption

我有一个场景,我需要将RSA 公钥加密标准JavaScriptGolang 一起使用。 我需要使用公钥在 JavaScript 中加密数据,并使用私钥在 Golang 中解密数据。 我尝试使用 PKCS#1(JavaScript 的 travst 库和 Golang 的 crypto/rsa),但解密失败。谁能为此提出解决方案?

我尝试了所有可能的解决方案并研究了很多文档,但仍然找不到合适的方法。如果我在 golang 中进行加密和解密,它工作正常。但是 javascript 和 golang 之间存在一些集成问题。我不确定 javasript 中使用的填充方法。

这是我要解密的golang代码:

func Decrypt(encryptedData, label []byte) (decryptedData []byte) {
var err error
var block *pem.Block
var private_key *rsa.PrivateKey

if block, _ = pem.Decode([]byte(privatKeyData)); block == nil || block.Type != "RSA PRIVATE KEY" { //privatKeyData is in string format
    log.Fatal("No valid PEM data found")
}

//Read Private Key
if private_key, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil {
    log.Fatalf("Private key can't be decoded: %s", err)
}

//Decrypt
if decrypted, err = rsa.DecryptPKCS1v15(rand.Reader, private_key, encryptedData); err != nil {
        log.Println(err)
}
return
}

最佳答案

可以在 javascript 中加密并在 Go 中解密。使用您引用的库,jsencrypt :

创建公钥和私钥对:

openssl genrsa -out key.pem
openssl rsa -in key.pem -pubout > pub.pem

javascript 中的加密:

var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val());

var encrypted = encrypt.encrypt($('#message').val());

$.post("/decrypt", encrypted, function(response) {
    $("#decrypted").val(response);
});

Go 解密:

func handleDecrypt(w http.ResponseWriter, r *http.Request) {
    decoder := base64.NewDecoder(base64.StdEncoding, r.Body)
    defer r.Body.Close()
    encrypted, err := ioutil.ReadAll(decoder)
    if err != nil {
        http.Error(w, err.Error(), http.StatusBadRequest)
        return
    }
    data, err := rsa.DecryptPKCS1v15(rand.Reader, privateKey, encrypted)
    if err != nil {
        http.Error(w, "decrypt error", http.StatusBadRequest)
        log.Println(err)
        return
    }
    fmt.Fprint(w, string(data))
}

更新:privateKey 变量是从 openssl 创建的私钥文件导出的 *rsa.PrivateKey,在本例中为“key.pem”文件。 pem文件是一个Base64编码的DER证书,例如-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----显示PEM格式的私钥。 Go 标准库提供了 x509.ParsePKCS1PrivateKey()从字节 slice 解析 pem 编码 key 的方法。

所以将 key 加载到 Go 中可能看起来像这样:

keyBytes, err := ioutil.ReadFile("path/to/key.pem")
if err != nil { ... }

privateKey, err := x509.ParsePKCS1PrivateKey(keyBytes)
if err != nil { ... }

关于javascript - RSA Javascript加密和Golang解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36054681/

相关文章:

javascript - qgis2thirdjs导出3D map 代码修改后出现空白页

javascript - jwplayer 6 : get filename

syntax - Go "import"语法是不是特别独特?

c# - 使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串

go - 试图找到这个 perl 数组的 golang 等价物

JavaScript - 基于原型(prototype)的编程 - this.myFunction 不是函数错误

javascript - angularjs 中的 $http POST 调用返回 HTTP 状态代码 405

c - 针对小输入优化 SHA-1

security - 什么是Android点密码系统的熵?

C# WPF 加密