2010-09-08 2 views
2

Я надеялся, что смогу получить здесь какую-то помощь, чтобы наконец решить эту неприятную проблему.Проверка проблемы на C#, что было подписано на Java (RSA)

На Java стороне вещей они подписать со следующим кодом:

public static void main(String[] args) throws Exception { 
    if (args.length < 2) 
     printInfoAndExit(); 
    String cmd = args[0]; 
    Security.addProvider(new BouncyCastleProvider()); 
    Signature signature = Signature.getInstance("SHA1withRSA", "BC"); 
    if ("sign".equalsIgnoreCase(cmd)) { 
     String pemFileName = args[1]; 
     String dataFileName = args[2]; 

     byte[] data = readFile(dataFileName); 

     FileReader fr = new FileReader(new File(pemFileName)); 
     PEMReader pemReader = new PEMReader(fr); 
     KeyPair keyPair = (KeyPair) pemReader.readObject(); 
     fr.close(); 

     signature.initSign(keyPair.getPrivate()); 
     signature.update(data); 
     byte[] signatureBytes = signature.sign(); 

     writeFile(signatureBytes, dataFileName + ".signed"); 
     String encoded = Base64.encode(signatureBytes); 
     writeFile(encoded.getBytes(), dataFileName + ".signed.base64"); 
    } else { 
     printInfoAndExit(); 
    } 
} 

Когда я получаю данные у меня есть свой открытый ключ и попытаться проверить следующую C# код:

public static bool Verify(String msg, String signature, String publicKey) 
{ 
    RsaKeyParameters remotepubkey = GetRsaPublicKey(publicKey); 

    ISigner signer = SignerUtilities.GetSigner("SHA1withRSA"); 

    signer.Init(false, remotepubkey); 
    byte[] sigBytes = Convert.FromBase64String(signature); 
    byte[] msgBytes = Encoding.Default.GetBytes(msg); 
    signer.BlockUpdate(msgBytes, 0, msgBytes.Length); 
    return signer.VerifySignature(sigBytes); 
} 

Это не работает! Однако я могу проверить данные с помощью openssl: openssl dgst -sha1 -verify public_key.pem -signature data.txt.signed data.txt

Вопрос в том, чего мне не хватает, чтобы сделать эту работу?

ПРИМЕЧАНИЕ: У меня нет проблем с ключами, которые работают правильно, но почему-то есть разница между тем, как java и .net работают с RSA?

** Edit 1: ** В данном конкретном случае все, что я должен был сделать изменения GetSigner к

ISigner signer = SignerUtilities.GetSigner("RSA"); 

Может кто-нибудь сказать мне разницу между SHA1withRSA и RSA?

ответ

1

Проблема была фактически решена на стороне Java. У них были некоторые проблемы с их стороны.

+0

Что они сделали для решения проблемы? Это поможет будущим читателям, которые сталкиваются с проблемами совместимости Java/C#. – Greg

0

У вас может возникнуть проблема с кодировкой данных вашего сообщения. Вы преобразовали исходные данные файла в строку юникода и пытаетесь преобразовать его обратно в необработанные байты. В зависимости от кодировки файла, и даже если это даже текст, ваши msgBytes могут отличаться от фактического содержимого файла.

Прочитайте необработанные байты из файла вместо строки. Вы не показываете код для фактического чтения данных файла, но я предполагаю, что вы читаете его как текст.

+0

Спасибо, я заметил, что существует некорректная связь между java и .net в кодировке по умолчанию. Однако я не читаю никаких файлов. Это обмен строк, где у меня есть открытый ключ, и у нас есть наш. Я также убеждаюсь, что обе стороны используют UTF-8. – mhenrixon

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