.NET и Java создают разные подписи - PullRequest
0 голосов
/ 10 августа 2011

У меня есть пример кода в Java, который я пытаюсь преобразовать в платформу .NET c #. Этот код шифрует строку и добавляет к ней подпись. Далее следует код Java с использованием поставщика BouncyCastle и код для добавления подписи.

 InputStream in = new FileInputStream(derkeyfilename);
 byte[] privKeyBytes = new byte[in.available()]; 
 in.read(privKeyBytes);
 KeyFactory rsaKeyFac = KeyFactory.getInstance("RSA");
 PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(privKeyBytes);
 private RSAPrivateKey myPrivateKey = (RSAPrivateKey) rsaKeyFac.generatePrivate(encodedKeySpec);

 MessageDigest md = MessageDigest.getInstance("MD5", "BC");
 byte[] digest = md.digest(msg);
 Signature sig = Signature.getInstance("MD5withRSA", "BC");
 sig.initSign(myPrivateKey);
 sig.update(digest);
 byte[] signature = sig.sign();
 byte[] base64 = Base64.encodeBase64(signature);
 String signature = new String(base64);

Может кто-нибудь помочь мне преобразовать это в C #. Я пробовал несколько примеров (BouncyCastle для C #, openssl и т. Д.), И все они возвращают одну и ту же сигнатуру, которая отличается от того, что создает Java. Еще одна вещь, которую я нашел, это то, что java использует закрытый ключ .der, который не поддерживается в C # (насколько я знаю). Я использую ключ .pem для того же сертификата.

1 Ответ

2 голосов
/ 10 августа 2011

Поскольку вы не показываете свою точку C #, я могу только догадываться, в чем заключается ваша проблема:

В Java вы делаете двойной хэш MD5.Однажды явно в вашем коде, и однажды неявно в вашем Signature объекте (который, как вы можете видеть, определен как MD5WithRSA).Таким образом, у вас есть здесь

signatureJava = RSA(MD5(MD5(msg)))

Если вы не сделаете этот первый MD5 явно на стороне C #, вы получите:

signatureC# = RSA(MD5(msg))

Очевидно, что это не то же самое, еслидостигли точки фиксации MD5 с вашим сообщением (очень маловероятно).

Кроме этого, вы уверены, что подпись C # всегда одинакова?Как я понимаю, сигнатура RSA ( в обычно используемых режимах ) не является детерминированной, поскольку она включает в себя некоторые случайные данные заполнения.

...