如何在c中复制java加密#

如何在c中复制java加密#,java,c#,encryption,rsa,bouncycastle,Java,C#,Encryption,Rsa,Bouncycastle,我有一个密钥的公共模和指数。我正在对一段文本进行编码,得到的结果与我试图复制的java代码不同 java代码如下: RSAPublicKeySpec rsaPublicSpec = new RSAPublicKeySpec(modulus, exponent); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(rsaPublicSpec);

我有一个密钥的公共模和指数。我正在对一段文本进行编码,得到的结果与我试图复制的java代码不同

java代码如下:

RSAPublicKeySpec rsaPublicSpec = new RSAPublicKeySpec(modulus, exponent);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(rsaPublicSpec);
X509EncodedKeySpec encodedPublicKeySpec = new X509EncodedKeySpec(publicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);
PublicKey publicKey = keyFactory.generatePublic(encodedPublicKeySpec);
Cipher cipher = Cipher.getInstance(“RSA / ECB / PKCS1Padding”);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);    
byte[] encryptedBytes = cipher.doFinal(clearTextString.getBytes());
BASE64Encoder b64 = new BASE64Encoder();
String base64EncodedStr = b64.encode(encryptedBytes);
我现在在C#中使用Bouncy Castle的功能是:

BigInteger publicModulus = new BigInteger(1, Convert.FromBase64String(publicKeyString));
BigInteger publicExponent = new BigInteger(1,Convert.FromBase64String("AQAB"));
RsaKeyParameters pubParameters = new RsaKeyParameters(false, publicModulus, publicExponent);
IAsymmetricBlockCipher eng = new Pkcs1Encoding(new RsaEngine());
eng.Init(true, pubParameters);
byte[] plaintext = Encoding.UTF8.GetBytes("test data");
byte[] encdata = eng.ProcessBlock(plaintext, 0, plaintext.Length);
Console.WriteLine(Convert.ToBase64String(encdata));
我不明白为什么java代码获取公钥,然后执行X509版本(以及我是否需要在C#实现中这样做)。 我也不确定是否需要补偿c#vs.java的持久性


感谢您的帮助。

令人困惑的代码没有起任何作用。而且,一旦我把模数作为base64字符串,实际上就不需要Bouncy Castle了。以下是有效的方法

        var publicKey =
                       "<RSAKeyValue><Modulus>base64modulusgoeshere</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
        var sbytes = Encoding.UTF8.GetBytes(s);
        var rsa = new RSACryptoServiceProvider(2048);
        rsa.FromXmlString(publicKey);
        var encdata = rsa.Encrypt(sbytes, false);
        enc = Convert.ToBase64String(encdata);
var公钥=
“Base64ModulesGoeshereAQab”;
var sbytes=Encoding.UTF8.GetBytes(s);
var rsa=新的rsacyptoserviceprovider(2048);
rsa.FromXmlString(公钥);
var encdata=rsa.Encrypt(sbytes,false);
enc=Convert.tobase64字符串(encdata);

混乱的代码没有任何作用。而且,一旦我把模数作为base64字符串,实际上就不需要Bouncy Castle了。以下是有效的方法

        var publicKey =
                       "<RSAKeyValue><Modulus>base64modulusgoeshere</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
        var sbytes = Encoding.UTF8.GetBytes(s);
        var rsa = new RSACryptoServiceProvider(2048);
        rsa.FromXmlString(publicKey);
        var encdata = rsa.Encrypt(sbytes, false);
        enc = Convert.ToBase64String(encdata);
var公钥=
“Base64ModulesGoeshereAQab”;
var sbytes=Encoding.UTF8.GetBytes(s);
var rsa=新的rsacyptoserviceprovider(2048);
rsa.FromXmlString(公钥);
var encdata=rsa.Encrypt(sbytes,false);
enc=Convert.tobase64字符串(encdata);

抱歉,添加了解决方案作为注释,应该已经回答了问题。请参阅下面。抱歉,添加了解决方案作为注释,应该已经回答了问题。另外,我假设我需要从java和.Net中获得相同的加密字符串。这是不正确的,因为随机填充。即使是相同的代码也会生成不同的值,这些值会解密为相同的结果。这是不正确的,因为随机填充。即使相同的代码也会生成不同的值,这些值将解密为相同的结果。