C# 如何使用.net中的bouncy castle使用RSA/ECB/OAEPha256和mgf1进行加密?

C# 如何使用.net中的bouncy castle使用RSA/ECB/OAEPha256和mgf1进行加密?,c#,.net-core,cryptography,C#,.net Core,Cryptography,web上有一些示例介绍如何使用Java中的bouncy castle库使用RSA/ECB/OAEPwithsha256和mgf1padding进行加密(示例显示在)。然而,C#中的bouncy castle库似乎与Java库有所不同,因为它更显式(因此需要更多步骤),我不知道如何使其适用于上述算法 如果有人能将一个代码示例放在一起,使用RSA/ECB/OAEPha256和mgf1填充对示例文本进行加密,我们将不胜感激。不幸的是,即使是Java构造也不明确,因为它可以接受不同且不兼容的解释,如图所

web上有一些示例介绍如何使用Java中的bouncy castle库使用RSA/ECB/OAEPwithsha256和mgf1padding进行加密(示例显示在)。然而,C#中的bouncy castle库似乎与Java库有所不同,因为它更显式(因此需要更多步骤),我不知道如何使其适用于上述算法


如果有人能将一个代码示例放在一起,使用RSA/ECB/OAEPha256和mgf1填充对示例文本进行加密,我们将不胜感激。

不幸的是,即使是Java构造也不明确,因为它可以接受不同且不兼容的解释,如图所示。Java Bouncycastle提供程序将对“RSA/ECB/OAEPWithSHA-256和MGF1padding”执行一件事,而Oracle提供程序将执行另一件事

您可以并且应该在Java和C#代码中准确地指定您想要的行为

C#:

爪哇:

import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
导入org.bouncycastle.openssl.PEMParser;
导入javax.crypto.Cipher;
导入javax.crypto.spec.OAEPParameterSpec;
导入javax.crypto.spec.PSource;
导入java.io.FileReader;
导入java.nio.charset.StandardCharset;
导入java.security.KeyFactory;
导入java.security.interfaces.RSAPrivateKey;
导入java.security.spec.mgf1参数spec;
导入java.security.spec.PKCS8EncodedKeySpec;
导入java.util.Base64;
公共类OaepExample{
public static void oeapDecrypt()引发异常{
final-PEMParser-PEMParser=new-PEMParser(new-FileReader(“/Users/horton/tmp/key-examples/myserver.p8”);
final PrivateKeyInfo privKey=(PrivateKeyInfo)pemParser.readObject();
KeyFactory kf=KeyFactory.getInstance(“RSA”);
RSAPrivateKey rsaPriv=(RSAPrivateKey)kf.generatePrivate(新的PKCS8EncodedKeySpec(privKey.getEncoded());
字符串cipher64=“k8AYnTV6RgzQXmD7qn8QwucDXGjbYct+qMVvDmMELTnUcCOeTp82oJ0BryZyEEGXVSZ2BFg95e72Jt9ZAKWNcot2rZ0+POcda8pzY/mfdwipnsjkitovk8shl3b/jzdjdjyqrlmmnpjvv/ubfy2vgklhjzzajgpndw+gF+XI=”;
Cipher decrypter=Cipher.getInstance(“RSA/ECB/OAEPWithSHA-256和mgf1padding”);
OAEPParameterSpec parameterSpec=新的OAEPParameterSpec(“SHA-256”,“MGF1”,MGF1 parameterSpec.SHA256,
PSource.psspecified.DEFAULT);
decrypter.init(Cipher.DECRYPT_模式,rsaPriv,parameterSpec);
final byte[]plain=decrypter.doFinal(Base64.getDecoder().decode(cipher64));
System.out.println(新字符串(plain,StandardCharsets.UTF_8));
}
}

James:不幸的是,PemReader类上已经没有ReadObject方法了。詹姆斯:为什么要在OaepEncoding构造函数中为IDigest mgf1Hash参数传递“new Sha256Digest()”?如果有人使用相同的参数进行OaepEncoding(如您所示),并生成加密的字节,那么我是否能够使用相同的参数对这些字节进行解密(假设我将公钥替换为私钥)?或者我真的需要做其他事情?这是一个例子,你可以通过任何你认为合适的。SHA-256是不错的选择。
using System;
using System.IO;
using System.Text;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Encodings;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.OpenSsl;

namespace ScratchPad
{
    class MainClass
    {
        public static void OaepEncryptExample()
        {
            var plain = Encoding.UTF8.GetBytes("The sun also rises.");
            // Read in public key from file
            var pemReader = new PemReader(File.OpenText(@"/Users/horton/tmp/key-examples/myserver_pub.pem"));
            var rsaPub = (Org.BouncyCastle.Crypto.Parameters.RsaKeyParameters)pemReader.ReadObject();
            // create encrypter
            var encrypter = new OaepEncoding(new RsaEngine(), new Sha256Digest(), new Sha256Digest(), null);
            encrypter.Init(true, rsaPub);
            var cipher = encrypter.ProcessBlock(plain, 0, plain.Length);
            Console.WriteLine(Convert.ToBase64String(cipher));
        }
    }
}