golang的OAEP加密、解密

守望者_0173 · · 2285 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

今天在做微信支付商户平台的提交申请单API时,发现这个接口的contact_info参数数据需要加密,按照平台的接口文档完善了EncryptOAEP和DecryptOAEP这个两个函数的程序代码。
一共有四个函数分别是EncryptOAEP、DecryptOAEP、ParsePKIXPublicKey、ParsePKCS1PrivateKey。

EncryptOAEP

// 加密
func EncryptOAEP(text string)string {
rsaPublicKey := ParsePKIXPublicKey()
secretMessage := []byte(text)
rng := rand.Reader
cipherdata, err := rsa.EncryptOAEP(sha1.New(), rng, rsaPublicKey, secretMessage, nil)
if err != nil {
fmt.Fprintf(os.Stderr, "Error from encryption: %s\n", err)
return ""
}
ciphertext := base64.StdEncoding.EncodeToString(cipherdata)
fmt.Printf("Ciphertext: %x\n", ciphertext)
return ciphertext
}

DecryptOAEP

// 解密
func DecryptOAEP(ciphertext string) string {
rsaPrivateKey := ParsePKCS1PrivateKey()
cipherdata, _ := base64.StdEncoding.DecodeString(ciphertext)
rng := rand.Reader
plaintext, err := rsa.DecryptOAEP(sha1.New(), rng, rsaPrivateKey, cipherdata, nil)
if err != nil {
fmt.Fprintf(os.Stderr, "Error from decryption: %s\n", err)
return ""
}
fmt.Printf("Plaintext: %s\n", string(plaintext))
return string(plaintext)
}

ParsePKIXPublicKey

func ParsePKIXPublicKey() rsa.PublicKey {
publicKey, err := ioutil.ReadFile("static/cert/apiclient_cert.pem")
if err != nil {
fmt.Println(err)
return nil
}
block, _ := pem.Decode(publicKey)
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
fmt.Println(err)
return nil
}return pubInterface.(
rsa.PublicKey)
}

ParsePKCS1PrivateKey

// 解析私钥
func ParsePKCS1PrivateKey() *rsa.PrivateKey {
privateKey, err := ioutil.ReadFile("static/cert/apiclient_key.pem")
if err != nil {
fmt.Println(err)
return nil
}
block, _ := pem.Decode(privateKey)
privateInterface, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
fmt.Println(err)
return nil
}
return privateInterface
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:守望者_0173

查看原文:golang的OAEP加密、解密

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2285 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传