【问题标题】:Creating a RSA private key with Triple DES encryption使用三重 DES 加密创建 RSA 私钥
【发布时间】:2020-12-31 02:58:52
【问题描述】:

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: ?,
  })

  // ...
}

【问题讨论】:

    标签: go encryption openssl cryptography


    【解决方案1】:

    您缺少的主要内容是 x509.EncryptPEMBlock 函数,该函数可用于使用 multiple ciphers 之一进行加密,包括 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
    • 非常好,就像一个魅力!感谢您的建议!我是密码学的新手。到目前为止,我的主要信息来源是这篇文章 (stackoverflow.com/a/60516812/3634032)。令我惊讶的是,考虑到该帖子多年来获得的浏览量,没有人对密码发表评论(除非我忽略了它)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2013-05-07
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    相关资源
    最近更新 更多