go - 使用三重 DES 加密创建 RSA 私钥
问题描述
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: ?,
})
// ...
}
解决方案
您缺少的主要内容是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(提供多种密钥大小)。
推荐阅读
- android - VPNService - 不允许的应用程序?
- sql - Oracle REGEX_REPLACE 函数和捕获组
- c - 在 C 中支持带有空字符的字符串
- .net - 确保所有字符串属性在 EF 6.2 中都有长度和 unicode 设置
- android - 来自 Android 的 AWS Kinesis Video 流失真
- java-8 - javaSimon中的秒表与?在 java 中的旋律
- scala - 如何在 Scala 中将反应式发布者转换为简单的流?
- python - 如何选择数组中的所有其他数据组?
- little-man-computer - 使用 LMC 求解代数方程
- sequelize.js - 无法在 Feathers-Sequelize 中使用一对一关联填充 PostgreSQL 表