Go 将SSH私钥用作RSA私钥,用于解密使用公钥加密的数据
我试图使用系统的SSH Pub和私钥来加密和解密Go中的数据(字符串等) 我已经能够使用SSH公钥作为RSA公钥成功地加密数据。但是,在尝试使用SSH私钥(尝试将其用作RSA私钥)解密相同数据时,我无法使用相同/类似的方法 加密代码-这是有效的 解密代码-不工作! 我不知道我做错了什么 更新-答复如下 在我找到解决方案之前,我有两个错误Go 将SSH私钥用作RSA私钥,用于解密使用公钥加密的数据,go,encryption,ssh,cryptography,rsa,Go,Encryption,Ssh,Cryptography,Rsa,我试图使用系统的SSH Pub和私钥来加密和解密Go中的数据(字符串等) 我已经能够使用SSH公钥作为RSA公钥成功地加密数据。但是,在尝试使用SSH私钥(尝试将其用作RSA私钥)解密相同数据时,我无法使用相同/类似的方法 加密代码-这是有效的 解密代码-不工作! 我不知道我做错了什么 更新-答复如下 在我找到解决方案之前,我有两个错误 解密错误或 在标头错误中找到非DEK信息 它们已在解决方案中得到解决我找到了解决此问题的方法 事实证明,我做错了几件事 当我试图解密时,我没有考虑base6
- 解密错误或
- 在标头错误中找到非DEK信息
它们已在解决方案中得到解决我找到了解决此问题的方法 事实证明,我做错了几件事
func DecryptWithPrivateKey(privPath string, wrappedData []byte) ([]byte, error) {
//read private key
priv, err := ioutil.ReadFile(privPath)
if err != nil {
return nil, err
}
privKey, err := ssh.ParseRawPrivateKey(priv)
if err != nil {
return nil, err
}
//get raw encrypted payload
data, err := base64.StdEncoding.DecodeString(string(wrappedData))
if err != nil {
return nil, err
}
//parse the OpenSSH key as an RSA Private Key
parsedKey := privKey.(*rsa.PrivateKey)
decryptBytes, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, parsedKey, data, nil)
if err != nil {
return nil, err
}
return decryptBytes, nil
}
总的来说,说一些不起作用的话并不是特别有用。你怎么知道它不起作用了?您是否收到一些错误消息?你得到了错误的答案吗?你提供的细节越多,你就越有可能得到一个好的答案。您的SSH密钥(现在)很可能是RSA密钥,所以将其“用作”RSA密钥就是在使用它——更准确地说,您有一个RSA密钥,并且您正好将其用于SSH。但是对于波尔克来说,我们需要知道你遇到的问题不仅仅是“不工作”。是的,我知道SSH密钥是RSA密钥。但在本例中,我使用它来区分在Go中使用它作为RSA密钥。当我尝试解密加密的有效负载时,我得到的错误是一个解密错误,当我解析pem并将其用作PKCS1密钥时,我得到一个“块中没有DEK info头”
func DecryptWithPrivateKey(privPath string, wrappedData []byte) ([]byte, error) {
priv, err := ioutil.ReadFile(privPath)
if err != nil {
return nil, err
}
block, _ := pem.Decode(priv)
der, err := x509.DecryptPEMBlock(block, []byte(""))
if err != nil {
return nil, err
}
privKey, err := x509.ParsePKCS1PrivateKey(der)
// dec, err := ssh.ParseRawPrivateKey(priv)
// if err != nil {
// return nil, err
// }
// parsedKey := dec.(*rsa.PrivateKey)
decryptBytes, err := privKey.Decrypt(nil, wrappedData, &rsa.OAEPOptions{Hash: crypto.SHA256})
if err != nil {
return nil, err
}
return decryptBytes, nil
func DecryptWithPrivateKey(privPath string, wrappedData []byte) ([]byte, error) {
//read private key
priv, err := ioutil.ReadFile(privPath)
if err != nil {
return nil, err
}
privKey, err := ssh.ParseRawPrivateKey(priv)
if err != nil {
return nil, err
}
//get raw encrypted payload
data, err := base64.StdEncoding.DecodeString(string(wrappedData))
if err != nil {
return nil, err
}
//parse the OpenSSH key as an RSA Private Key
parsedKey := privKey.(*rsa.PrivateKey)
decryptBytes, err := rsa.DecryptOAEP(sha256.New(), rand.Reader, parsedKey, data, nil)
if err != nil {
return nil, err
}
return decryptBytes, nil
}