Проблема проверки в C # того, что было подписано в Java (RSA) - PullRequest
2 голосов
/ 08 сентября 2010

Я надеялся, что мне здесь помогут, и я наконец смогу решить эту неприятную проблему.

На стороне 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?

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

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

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

Ответы [ 2 ]

1 голос
/ 28 октября 2010

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

0 голосов
/ 08 сентября 2010

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

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

...