Получение хешированного значения sha1 из значения подписи XML

Мне нужен кто-нибудь, чтобы помочь мне понять метод цифровой подписи XML rsa-sha1. Я предполагаю, что значение подписи = RSA-encrypt (sha1 (signedInfo), privatekey).

Примечание. Base64.encode (sha1 (signedInfo)) содержит 28 символов. Поэтому я думаю, что Base64.encode (RSA-decrypt (signaturevalue), publickey) также должен возвращать 28 символов. Однако на самом деле у меня получилась 48-символьная строка.

Base64 base64 = new Base64();
byte[] encrypted = base64.decode(signatureValue);
try {
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, getX509Cert().getPublicKey());
        byte[] cipherText = cipher.doFinal(encrypted);

        System.out.println(base64.encodeToString(cipherText));
        //print out MCEwCQYFKw4DAhoFAAQU0G+7jFPydS/sWGO1QPjB0v3XTz4=
        //which contains 48 characters. 
 }
 catch (Exception ex){
    ex.printStackTrace();
 }

Метод подписи, как указано в файле XML

<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>

person Dustin Sun    schedule 28.12.2017    source источник
comment
Почему бы не использовать класс Signature?   -  person President James K. Polk    schedule 29.12.2017


Ответы (1)


Подписание RSA на самом деле не то же самое, что шифрование с помощью закрытого ключа, но JCE способствует этой ошибке, разрешая «обратные» операции в Cipher для RSA (только), которые фактически выполняют подпись и восстановление PKCS1-v1_5 вместо шифрования и дешифрования, как они были разработаны. к.

Для исходной стандартизованной схемы подписи RSA в PKCS1 - v1.5, теперь переименованной в RSASSA-PKCS1-v1_5, значение, которое дополняется (с 'type' 01, несколько FF и один 00) и modexp'ed с закрытым ключом, является не просто хеш, а структура ASN.1, содержащая хеш. См. Операцию кодирования EMSA-PKCS1-v1_5 в разделе 9.2 документа rfc8017 или rfc3447. или 9.2.1 в rfc2437, особенно шаг 2 и (для двух более новых версий) пункт 1 «Примечания».

Dupe Использование SHA1 и RSA с java. security.Signature против MessageDigest и Cipher
и Отдельный дайджест & подписание с использованием поставщика безопасности Java

person dave_thompson_085    schedule 28.12.2017
comment
Спасибо, @ dave_thompson_085! Используя предоставленную вами информацию, я смог найти ответ. - person Dustin Sun; 29.12.2017