2015-04-05 2 views
1

У меня есть следующий код,.NET эквивалент Java KeyFactory.getInstance "RSA"/"RSA/ЕЦБ/PKCS1Padding"

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

ключа Sample,

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

Возможного encryped значения,

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

Вы можете добавить образец PLAINTEXT, ключ и возвращает значения? – zaitsman

+0

@zaitsman Я добавил свой ключ – user960567

+0

, пожалуйста, также добавьте образец открытого текста и вывода (например, что вы получаете, когда говорите, шифруете «helloworld» с помощью этого ключа?) – zaitsman

ответ

4

Поскольку я не закрытый ключ, я не могу расшифровать, но, по крайней мере, это дает правильные удлиненные значения.

Так что попробуйте это (вам нужно 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); 
+0

где АсимметричныйKeyParameter и другие классы? – user960567

+0

Как я уже сказал, вам нужен bouncycastle. – zaitsman

+0

Гениальная проблема заключалась в поиске показателя и модуля. – user960567

Смежные вопросы