簡體   English   中英

錯誤RSA在C#加密,在Go解密

[英]Error RSA encrypting in C# and decrypting in Go

我在解密 go 中的一條消息時出錯,該消息在 C# 中加密(使用相應的公鑰/私鑰)

我的客戶端寫在 C# 中,我的服務器寫在 Go 中。我通過 go 的 crypto/rsa package(使用rsa.GenerateKey(random Reader, bits int) )生成了私鑰和公鑰。 然后,我將生成的公鑰文件存儲在客戶端可以訪問的位置,並將私鑰存儲在服務器可以訪問的位置。 我使用以下代碼在客戶端加密(使用充氣城堡):

   public static string Encrypt(string plainText)
   {
      byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

      PemReader pr = new PemReader(
        new StringReader(m_publicKey)
      );
      RsaKeyParameters keys = (RsaKeyParameters)pr.ReadObject();

      // PKCS1 OAEP paddings
      OaepEncoding eng = new OaepEncoding(new RsaEngine());
      eng.Init(true, keys);

      int length = plainTextBytes.Length;
      int blockSize = eng.GetInputBlockSize();
      List<byte> cipherTextBytes = new List<byte>();
      for (int chunkPosition = 0; chunkPosition < length; chunkPosition += blockSize)
      {
          int chunkSize = Math.Min(blockSize, length - chunkPosition);
          cipherTextBytes.AddRange(eng.ProcessBlock(
              plainTextBytes, chunkPosition, chunkSize
          ));
      }
      return Convert.ToBase64String(cipherTextBytes.ToArray());
}

go服務器從header解析出這個字符串,用私鑰解密:

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
}

解密 function 拋出crypto/rsa: decryption error 如果我嘗試將密文直接粘貼到 go(而不是從客戶端發送),則會發生同樣的錯誤。

注意:為了加載公鑰,我需要將 header 從:

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

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

頁腳也一樣。 我假設這是一個格式問題,但不確定如何解決 go。

編輯:似乎 golang OAEP 使用 sha256 而 bouncy castle 使用 SHA-1。 Go的文檔規定加密和解密的hash必須相同。 這似乎是問題所在? 如果是,我如何更改 go 或 C# 使用的哈希算法?

是的,您需要匹配 hash。如果我看一下您的代碼,在 GoLang 中您已經將其設置為 SHA-512。 至少應該首選使用 SHA-256,但使用 SHA-1 相對安全,因為 MGF1 function 不依賴底層 hash 的抗碰撞性。這也是大多數運行時的默認設置,我不知道為什么GoLang 決定反對。

可能最好的方法是為兩個運行時設置 SHA-512,因此是 .NET 的必要常量。


請注意,由於 OAEP 使用 hash 而不是 label 以及 MGF1 中的 hash(掩碼生成 function 1,唯一指定的),因此底層故事更加復雜。 兩者都需要提前指定,一般使用相同的hash function,但有時也不是

label 通常為空,大多數運行時甚至不允許設置它,因此 label 上的 hash 值基本上是哈希函數特定常量,與安全性無關。 常量只是設法使事情不兼容; “更靈活”並不總是一件好事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM