gpt4 book ai didi

c# - RSACryptoServiceProvider(.NET 的 RSA)可以使用 SHA256 代替 SHA1 进行加密(不签名)吗?

转载 作者:可可西里 更新时间:2023-11-01 08:42:14 29 4
gpt4 key购买 nike

加密时,RSACryptoServiceProvider(或 .NET 提供的任何其他 RSA 加密器)能否使用 SHA256 而不是 SHA1?

SHA1 似乎是硬编码的,无法更改。例如,RSACryptoServiceProvider.SignatureAlgorithm 被硬编码为返回“http://www.w3.org/2000/09/xmldsig#rsa-sha1”。

如果没有办法让 RSACryptoServiceProvider 使用 SHA256,有什么替代方案?


更新

以下代码运行良好,但我想将 OAEPWithSHA1AndMGF1Padding 更改为 OAEPWithSHA256AndMGF1Padding。 C# 端需要什么才能使用 SHA256 而不是 SHA1 进行加密?

加密在 C# 中使用:

var parameters = new RSAParameters();
parameters.Exponent = new byte[] {0x01, 0x00, 0x01};
parameters.Modulus = new byte[] {0x9d, 0xc1, 0xcc, ...};
rsa.ImportParameters(parameters);

var cipherText = rsa.Encrypt(new byte[] { 0, 1, 2, 3 }, true);

解密在 Java 中使用:

Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPWithSHA1AndMGF1Padding", "BC");
cipher.init(Cipher.DECRYPT_MODE, keyPair.getPrivate());
byte[] cipherText = ...;
byte[] plainText = cipher.doFinal(cipherText);

最佳答案

RSACryptoServiceProvider 确实可以使用基于 SHA2 的签名,但您必须为此付出一些努力。

当您使用证书获取 RSACryptoServiceProvider 时,底层 CryptoAPI 提供程序是什么真的很重要。默认情况下,当您使用“makecert”创建证书时,它是“RSA-FULL”,仅支持 SHA1 哈希进行签名。您需要支持 SHA2 的新“RSA-AES”。

因此,您可以使用附加选项创建证书:-sp "Microsoft Enhanced RSA and AES Cryptographic Provider"(或等效的 -sy 24),然后您的代码将如下所示(在 .NET 4.0 中):

var rsa = signerCertificate.PrivateKey as RSACryptoServiceProvider;
//
byte[] signature = rsa.SignData(data, CryptoConfig.CreateFromName("SHA256"));

如果您无法更改证书的颁发方式,则有一个半合法的解决方法,它基于默认情况下创建的支持 SHA2 的 RSACryptoServiceProvider。所以,下面的代码也可以工作,但有点难看:(这段代码的作用是创建一个新的 RSACryptoServiceProvider 并从我们从证书中获得的 key 中导入 key )

var rsa = signerCertificate.PrivateKey as RSACryptoServiceProvider;
// Create a new RSACryptoServiceProvider
RSACryptoServiceProvider rsaClear = new RSACryptoServiceProvider();
// Export RSA parameters from 'rsa' and import them into 'rsaClear'
rsaClear.ImportParameters(rsa.ExportParameters(true));
byte[] signature = rsaClear.SignData(data, CryptoConfig.CreateFromName("SHA256"));

关于c# - RSACryptoServiceProvider(.NET 的 RSA)可以使用 SHA256 代替 SHA1 进行加密(不签名)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113498/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com