首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在c#中使用RSA/ECB/OAEPWithSHA-256AndMGF1填充加密,使用OAEPSHA256填充解密

在c#中使用RSA/ECB/OAEPWithSHA-256AndMGF1填充加密,使用OAEPSHA256填充解密
EN

Stack Overflow用户
提问于 2021-07-05 16:37:21
回答 1查看 1K关注 0票数 2

我遇到的情况是,Java程序使用RSA/ECB/OAEPWithSHA-256AndMGF1Padd加密文本。

我需要用c#解密它。

加密和解密在Java中工作得很好。

在Java中加密,在c#中使用RSA/ECB/OAEPWithSHA-1AndMGF1Padd工作非常好。

但是,对于RSA/ECB/OAEPWithSHA-256 AndMGF1,在Java中加密,用OaepSHA256在C#中解密,会给出一个错误:参数不正确。

Java加密代码:

代码语言:javascript
运行
复制
public static String encrypt(KeyPair keypair, String data) throws NoSuchAlgorithmException, NoSuchPaddingException,
            InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {
        Cipher c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
        //Cipher c = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
        c.init(Cipher.ENCRYPT_MODE, keypair.getPublic());
        return Base64.getEncoder().encodeToString(c.doFinal(data.getBytes()));
    }

C#解密代码:

代码语言:javascript
运行
复制
public string DecryptRsa(byte[] encryptedBytes, X509Certificate2 x509Certificate2, RSAEncryptionPadding rSAEncryptionPadding)
        {
            var text = string.Empty;

            using (RSACng csp = (RSACng)x509Certificate2.GetRSAPrivateKey())
            {

                byte[] bytesDecrypted = csp.Decrypt(encryptedBytes, rSAEncryptionPadding);
                text = Encoding.UTF8.GetString(bytesDecrypted);
            }
            return text;
        }

我做错什么了?请帮帮忙。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-05 18:00:26

OAEP使用两个摘要,OAEP摘要和MGF1摘要,参见RFC8017

SunJCE提供程序使用RSA/ECB/OAEPWithSHA-256AndMGF1Padding指定OAEP摘要为SHA256,而MGF1摘要默认为SHA1,请参见这里。另一方面,C#代码用OaepSHA256将这两个摘要指定为SHA256。因此,这两种代码是不兼容的。

修复方法是使用OAEPParameterSpec显式地指定Java中的摘要(因为这个原因,无论如何都应该这样做)。在C#方面,由于不支持这两个摘要的单独规范,因此无法使用附带的方法进行修复。但是可以使用BouncyCastle来支持这一点。

修复,Java代码端(两个摘要都是SHA256):

代码语言:javascript
运行
复制
RSAPublicKey publicKey = ...
OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT);
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParameterSpec);
byte[] ciphertext = cipher.doFinal(plaintext);

Fix,C#代码端,使用BouncyCastle (SHA256用于OAEP摘要,SHA1用于MGF1摘要):

代码语言:javascript
运行
复制
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Encodings;
using Org.BouncyCastle.Crypto.Parameters;
...
RsaKeyParameters privateKey = ...
OaepEncoding oaepEncoding = new OaepEncoding(new RsaEngine(), new Sha256Digest(), new Sha1Digest(), null);
oaepEncoding.Init(false, privateKey);
byte[] decrypted = oaepEncoding.ProcessBlock(ciphertext, 0, ciphertext.Length);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68259462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档