Go 将SSH私钥用作RSA私钥,用于解密使用公钥加密的数据

Go 将SSH私钥用作RSA私钥,用于解密使用公钥加密的数据,go,encryption,ssh,cryptography,rsa,Go,Encryption,Ssh,Cryptography,Rsa,我试图使用系统的SSH Pub和私钥来加密和解密Go中的数据(字符串等) 我已经能够使用SSH公钥作为RSA公钥成功地加密数据。但是,在尝试使用SSH私钥(尝试将其用作RSA私钥)解密相同数据时,我无法使用相同/类似的方法 加密代码-这是有效的 解密代码-不工作! 我不知道我做错了什么 更新-答复如下 在我找到解决方案之前,我有两个错误 解密错误或 在标头错误中找到非DEK信息 它们已在解决方案中得到解决我找到了解决此问题的方法 事实证明,我做错了几件事 当我试图解密时,我没有考虑base6

我试图使用系统的SSH Pub和私钥来加密和解密Go中的数据(字符串等)

我已经能够使用SSH公钥作为RSA公钥成功地加密数据。但是,在尝试使用SSH私钥(尝试将其用作RSA私钥)解密相同数据时,我无法使用相同/类似的方法

加密代码-这是有效的 解密代码-不工作! 我不知道我做错了什么

更新-答复如下 在我找到解决方案之前,我有两个错误

  • 解密错误或
  • 在标头错误中找到非DEK信息

它们已在解决方案中得到解决

我找到了解决此问题的方法

事实证明,我做错了几件事

  • 当我试图解密时,我没有考虑base64编码(d'uh)
  • 但更重要的是,我没有正确解析我试图用来解密加密负载的私钥
  • 代码如下:

    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
    }