java - .NET 相当于 Java KeyFactory.getInstance "RSA"/"RSA/ECB/PKCS1Padding"

标签 java c# .net

我有以下代码,

public static String encrypt(String plainText, String key){
    try{
        PublicKey publicKey = KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.decode(key, Base64.DEFAULT)));
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return Base64.encodeToString(cipher.doFinal(plainText.getBytes("UTF-8")),Base64.DEFAULT);
    }catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

我想将其转换为 C#。我试过 CryptUtils,但它不起作用 https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.Common/CryptUtils.cs

示例键,

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ9AMIIBCgKCAQEAoqB1N9kugk4UKYnbh0fcg3qYyYKP0m4B
MjWd05ReeAdj+7JRYDEKO6xthDdVSdRO1/2V+YtY8DnXWnxRaICwu8235s3imZCyqgYnomPWdY+F
K540oTz/zug+9wbrlzt/WQFUU4lPlQbzm/Gjw8XfaCozT0e3bnWQcD7rORCOyuJgwSGgREjTv1ss
pgEaKTMknii9vpGZLeAXwoeIYROhuT4IoIkPDhtY0/UZiCi6v7Ja2dmy53VlWIkcm3rcnSJdvpXr
OgiHvaNABHmeymNycNqd6WUaysBRheluQ86nq/2nZPW0gcvmYt5zbMMYX3yY/n2WtAKeNQBAEW1q
b0s6MwIDAQAB

可能的加密值,

Y3VTjghDnTrCeG8C/RklKsJ3Y0Mt89sSGGin28E4iQPQvKqeZBws7rBQEZaRamDWftxCkEYZs4Qh
V2l4IVlrawdtRmQlcQh8McrpqP/97Gz8pEDEYnqA7kqBTqZw0Z5o0WsshGSwiAQ9wNSym4xHejkq
zrKxWP8XCMkcT0NlKlRMoqKKICFKZbqWeSQkQM5y9OEcmB6inNNkJCoM1Ip48+cK3cOE6dqXNVrl
sSTZ8WQKwoB3dJmcYqexR3kAvBYdX6ZxEF+2+6b9h8+tc5G7Y5R2eqycyUossdkCcI3fNVhyc72P
axCjZFWZUgfDGCxg1WNhStrH9L8c59P35JKKug==

最佳答案

因为我没有私钥,所以我无法解密,但至少这会产生正确的长度值。

那么试试这个(你需要 bouncycaSTLe 来读取 pem):

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;

 var keyBytes =
    Convert.FromBase64String(
      "MIIBI...."); // your key here

  AsymmetricKeyParameter asymmetricKeyParameter = PublicKeyFactory.CreateKey(keyBytes);
  RsaKeyParameters rsaKeyParameters = (RsaKeyParameters)asymmetricKeyParameter;
  RSAParameters rsaParameters = new RSAParameters();
  rsaParameters.Modulus = rsaKeyParameters.Modulus.ToByteArrayUnsigned();
  rsaParameters.Exponent = rsaKeyParameters.Exponent.ToByteArrayUnsigned();
  RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
  rsa.ImportParameters(rsaParameters);

  byte[] plaintext = Encoding.UTF8.GetBytes("amount=1&currency=AED");
  byte[] ciphertext = rsa.Encrypt(plaintext, false);
  string cipherresult = Convert.ToBase64String(ciphertext);

关于java - .NET 相当于 Java KeyFactory.getInstance "RSA"/"RSA/ECB/PKCS1Padding",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29455404/

相关文章:

c# - 如何更改项目中的启动窗体?

c# - NUnit - 是否可以在 TearDown 中检查测试是否成功?

c# - Wpf 图像控件(绑定(bind)到属性)第一次后不刷新

c# - 在SQL Server中存储空值

java - <service> MyFirebaseInstanceIdService 未在 list 中注册

java - 如何在android中的数据库上更改数据时得到通知?

java - 事件总线 : Registering without any @Subscribe annotated method

java - 没有 EntityManager 绑定(bind)到这个线程 JPA

c# - 具有泛型重载的 GetMethod

.net - 类范围的 Linq 内存中查询