[英]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.