2 回答
TA贡献1804条经验 获得超8个赞
可以在 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()方法来从字节切片解析 pem 编码的密钥。
因此,将密钥加载到 Go 中可能看起来像这样:
keyBytes, err := ioutil.ReadFile("path/to/key.pem")
if err != nil { ... }
privateKey, err := x509.ParsePKCS1PrivateKey(keyBytes)
if err != nil { ... }
TA贡献1790条经验 获得超9个赞
1:您可以从javascript参考中加密明文。
https://github.com/travist/jsencrypt
var encrypt = new JSEncrypt();
encrypt.setPublicKey($('#pubkey').val());
var encrypted = encrypt.encrypt($('#input').val());
2:注意jsencrypt已经做了加密和base64encode。
请注意 jsencrypt 使用 PKCS1 而不是 OAEP
3:在 golang 中进行 Base64decode 并解密来自步骤 1 的消息。
var encrypted := 'change this to the encrypted text your js sent'
privateKey,_ = ioutil.ReadFile("private.pem")
cipherText,_ := base64.StdEncoding.DecodeString(encrypted)
originText,_ :=RsaDecrypt([]byte(cipherText))
解密函数
func RsaDecrypt(cipherText []byte) ([]byte, error) {
block, _ := pem.Decode(privateKey)
if block == nil {
return nil, errors.New("private key error!")
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
return rsa.DecryptPKCS1v15(rand.Reader, priv, cipherText)
}
现在您originText 从
https://segmentfault.com/q/1010000002505932
4:更进一步,你可以在go中生成密钥对
func GenRsaKey(bits int) error {
privateKey, err := rsa.GenerateKey(rand.Reader, bits)
if err != nil {
return err
}
derStream := x509.MarshalPKCS1PrivateKey(privateKey)
block := &pem.Block{
Type: "privete key",
Bytes: derStream,
}
file, err := os.Create("private.pem")
if err != nil {
return err
}
err = pem.Encode(file, block)
if err != nil {
return err
}
publicKey := &privateKey.PublicKey
derPkix, err := x509.MarshalPKIXPublicKey(publicKey)
if err != nil {
return err
}
block = &pem.Block{
Type: "public key",
Bytes: derPkix,
}
file, err = os.Create("public.pem")
if err != nil {
return err
}
err = pem.Encode(file, block)
if err != nil {
return err
}
return nil
}
- 2 回答
- 0 关注
- 424 浏览
添加回答
举报