КОД

аюсь понять, что такое Javajava.security.Signature класс делает. Если я вычислю дайджест сообщения SHA1, а затем зашифрую этот дайджест с использованием RSA, я получу другой результат, чем запросПодпись класс, чтобы подписать то же самое:

// Generate new key
KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
String plaintext = "This is the message being signed";

// Compute signature
Signature instance = Signature.getInstance("SHA1withRSA");
instance.initSign(privateKey);
instance.update((plaintext).getBytes());
byte[] signature = instance.sign();

// Compute digest
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
byte[] digest = sha1.digest((plaintext).getBytes());

// Encrypt digest
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] cipherText = cipher.doFinal(digest);

// Display results
System.out.println("Input data: " + plaintext);
System.out.println("Digest: " + bytes2String(digest));
System.out.println("Cipher text: " + bytes2String(cipherText));
System.out.println("Signature: " + bytes2String(signature));

Результаты в (например):

Входные данные: это сообщение подписывается
Дайджест: 62b0a9ef15461c82766fb5bdaae9edbe4ac2e067
Текст шифра: 057dc0d2f7f54acc95d3cf5cba9f944619394711003bdd12 ...
Подпись: 7177c74bbbb871cc0af92e30d2808ebae146f25d3fd8ba1622 ...

Я должен иметь фундаментальное недопонимание того, чтоПодпись делает - я проследил через это, и он, кажется, вызывает обновление наДайджест сообщения объект, с алгоритмом, установленным в SHA1, как я и ожидал, затем получить дайджест, затем выполнить шифрование. Чем отличаются результаты?

РЕДАКТИРОВАТЬ:

Леонидас заставил меня проверить, должна ли схема подписи делать то, что я думаю. Существует два типа подписи, определенных вRFC:

RSASSA-PKCS1-v1_5RSASSA-PSS

первый из них (PKCS1) - это тот, который я описал выше. Он использует хеш-функцию для создания дайджеста, а затем шифрует результат с помощью закрытого ключа.

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

РЕДАКТИРОВАТЬ:

Вотbytes2string метод, который я использовал:

private static String bytes2String(byte[] bytes) {
    StringBuilder string = new StringBuilder();
    for (byte b : bytes) {
        String hexString = Integer.toHexString(0x00FF & b);
        string.append(hexString.length() == 1 ? "0" + hexString : hexString);
    }
    return string.toString();
}

Ответы на вопрос(6)

Ваш ответ на вопрос