使用Triple DES加密创建RSA私钥

3
以下Go命令的等价命令是什么?
openssl genrsa -des3 -passout pass:mypassword -out myfile.key 2048

到目前为止我所做的...

package main

import (
    "crypto/des"
    "crypto/rand"
    "crypto/rsa"
    "encoding/pem"
)

func main() {
  key, _ := rsa.GenerateKey(rand.Reader, 2048)

  // Do something with des.NewTripleDESCipher(...)?

  keyPem := pem.EncodeToMemory(&pem.Block{
    Type:  "RSA PRIVATE KEY",
    Bytes: ?,
  })

  // ...
}
1个回答

4
你缺少的主要内容是x509.EncryptPEMBlock函数。该函数可用于使用多种密码算法之一,包括3DES进行加密。
以下是生成密钥、使用3DES加密并将其写入文件的示例代码:
package main

import (
  "crypto/rand"
  "crypto/rsa"
  "crypto/x509"
  "encoding/pem"
  "io/ioutil"
)

func main() {
  // Generate a 2048 bit RSA key.
  key, err := rsa.GenerateKey(rand.Reader, 2048)
  if err != nil {
    panic(err)
  }

  // Marshal it into DER-encoded ASN.1 format.
  raw := x509.MarshalPKCS1PrivateKey(key)

  // Encrypt using 3DES and password "mypassword".
  block, err := x509.EncryptPEMBlock(rand.Reader, "RSA PRIVATE KEY", raw, []byte("mypassword"), x509.PEMCipher3DES)
  if err != nil {
    panic(err)
  }

  // Encode the block into PEM.
  encoded := pem.EncodeToMemory(block)

  // Write it out.
  err = ioutil.WriteFile("myfile.key", encoded, 0400)
  if err != nil {
    panic(err)
  }
}

生成的文件是:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,627721fef197aa1f

Y5BPGXBnrTXgSPfWGl04f9FNJAB8tlzOF3MBUJaZBBb+3sOWWfz43RikFuXowl3s
DWOjNv9TnHO1M5Tlxye84iywo8CqINCZzMfan3J8ZxKWHpXbs5DVXQ9INTPfLueq
...
QuUylrQNEWt0T1BlKRltAkoRawiBj7Ys/WMnto9dfEbJPeoHfGCp0xTSYSvIwE01
rYrebCfNdrb8gW4KlQnOCj0bHU6xDtLzMtt6i9JD4CtXGKBo8mYwng==
-----END RSA PRIVATE KEY-----

建议:3DES被认为是一种较弱的加密算法,您应该使用AES代替(可用于多种密钥大小)。


就好像这个API为此而制作一样:P - Maarten Bodewes
非常出色,运行得很顺畅!感谢您的建议!当涉及到密码学时,我是个新手。到目前为止,我的主要信息来源是这篇文章(https://dev59.com/PGsz5IYBdhLWcg3w6MNS#60516812)。我很惊讶这篇文章多年来获得了如此多的浏览量,却没有人评论密码(除非我忽略了它)。 - Sam Herrmann

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接