我会感激指针,因为我不知道如何解密一个加密的密钥,以便与Golang ssh一起使用.我正在try 将另外两个代码源(包括this个一个)混合在一起,但无法使其正常工作.

我认为我正在使用DER,但需要将其封送回PEM,以便将其与crypto/ssh一起使用

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,D7C72273BE168626E5B2D1BC72E56326
...
-----END RSA PRIVATE KEY-----

我读到了:

key, err := ioutil.ReadFile(privateKey)
if err != nil {
    log.Fatalf("Unable to read private key: %v", err)
}

使用未加密的(!) keys ,我就可以:

signer, err := ssh.ParsePrivateKey(key)
if err != nil {
    log.Fatalf("Unable to parse private key: %v", err)
}

config := &ssh.ClientConfig{
    User: username,
    Auth: []ssh.AuthMethod{
        ssh.PublicKeys(signer),
    },
}

这就行了.

我重复使用了一些代码,我认为这些代码可以让我获得解密后的PEM,作为一个密码:

func decrypt(key []byte, password []byte) []byte {
    block, rest := pem.Decode(key)
    if len(rest) > 0 {
        log.Fatalf("Extra data included in key")
    }
    der, err := x509.DecryptPEMBlock(block, password)
    if err != nil {
        log.Fatalf("Decrypt failed: %v", err)
    }
    return der
}

但是,我怎样才能从出货人变成签字人呢?

或者,解决这个问题的最佳方法是什么?

推荐答案

如果您有一个带有RSA私钥的DER块,则使用x509.ParsePKCS1PrivateKey来解析密钥,使用ssh.NewSignerFromKey来获取ssh.Signer

key, err := x509.ParsePKCS1PrivateKey(der)
if err != nil {
    log.Fatal(err)
}
signer := ssh.NewSignerFromKey(key)

Go相关问答推荐

区分Terminal和Hook Zerolog Go中的错误级别日志(log)输出

GoLang:无法发送带有附件的邮箱

错误.如果它包含切片,则返回FALSE

Makefilego version和read命令

如何修复proxyconnect tcp:tls:第一条记录看起来不像tls握手

如何确定泛型类型在运行时是否可比较?

我应该先解锁然后再广播吗?

Exchange Web 服务 - 使用 soap xml 请求查找所有未读邮件

此 Golang 程序中的同步问题

整理时转换值

golang 中的可变参数函数

为什么 Go 被认为是部分抢占式的?

此代码如何生成内存对齐切片?

在 Raspberry Pi4 上下载 Go Mod

如何在测试中使用自定义标志(使用`testify/suite`)

使用反射在 struct 内迭代切片 struct

如何获取多个 url 参数值

vs 代码调试 go 测试不通过标志

每 N 秒运行一次函数,上下文超时

不理解切片和指针