RSA在C#中加密和在Go中解密时出错

RSA在C#中加密和在Go中解密时出错,c#,go,encryption,rsa,bouncycastle,C#,Go,Encryption,Rsa,Bouncycastle,我在解密用C#加密的go中的消息时出错(使用相应的公钥/私钥) 我的客户机是用C#编写的,我的服务器是用Go编写的。我通过go的crypto/rsa包(使用rsa.GenerateKey(随机读取器,bit int))生成了一个私钥和公钥。然后,我将生成的公钥文件存储在客户机可以访问的位置,将私钥存储在服务器可以访问的位置。我使用以下代码(使用bouncy castle)在客户端上加密: 解密函数抛出加密/rsa:decryption error。如果我尝试将密文直接粘贴到go中(而不是从客户端

我在解密用C#加密的go中的消息时出错(使用相应的公钥/私钥)

我的客户机是用C#编写的,我的服务器是用Go编写的。我通过go的crypto/rsa包(使用
rsa.GenerateKey(随机读取器,bit int)
)生成了一个私钥和公钥。然后,我将生成的公钥文件存储在客户机可以访问的位置,将私钥存储在服务器可以访问的位置。我使用以下代码(使用bouncy castle)在客户端上加密:

解密函数抛出
加密/rsa:decryption error
。如果我尝试将密文直接粘贴到go中(而不是从客户端发送),则会发生相同的错误

注意:为了加载公钥,我需要将标题从以下位置更改:

-----BEGIN RSA PUBLIC KEY----- 
...

页脚也一样。我假设这是一个格式问题,但不确定如何着手解决


编辑:看起来golang OAEP使用sha256,bouncy castle使用SHA-1。Go的文档指定加密和解密的哈希必须相同。这似乎就是问题所在?如果是,我如何更改go或C#使用的哈希算法?

是的,您需要匹配哈希。在GoLang,如果我看一下您的代码,您已经将其设置为SHA-512。至少应该首选使用SHA-256,但使用SHA-1相对安全,因为MGF1函数不依赖于底层哈希的抗冲突性。它也是大多数运行时的默认值,我不知道GoLang为什么决定不这样做

可能最好是为两个运行时都设置SHA-512,因此.NET的必要常量也是如此


请注意,由于OAEP在标签上使用散列,以及在MGF1(掩码生成函数1,唯一指定的函数)中使用散列,因此底层的情况更加复杂。两者都需要预先指定,通常使用相同的哈希函数,但是


标签通常是空的,大多数运行时甚至不允许设置它,因此标签上的哈希值基本上是一个哈希函数特定的常量,这与安全性无关。常数只是设法使事物不相容;“更灵活”并不总是一件好事。

我尝试在go中使用修改过的公钥头,但它起了作用(能够加密和解密),所以不是这样。我还尝试将原始字节值粘贴到go中,但仍然不起作用。那也不是。而且,你忘了解码base64
func DecryptWithPrivateKey(ciphertext []byte, priv *rsa.PrivateKey) []byte {
   hash := sha512.New()

   plaintext, err := rsa.DecryptOAEP(hash, rand.Reader, priv, ciphertext, nil)
   if err != nil {
       fmt.Fprintf(os.Stderr, err.Error())
   }
   return plaintext
}
-----BEGIN RSA PUBLIC KEY----- 
...
-----BEGIN PUBLIC KEY----- 
...