2017-01-11 9 views
-1

Извините за мой вопрос о нобе, я новичок в этом поле (но мне любопытно). Я нашел файл xml с двумя полями: DATA и SIGNATURE. DATA - это текст Ascii, SIGNATURE - это строка SHA1-RSA1024, состоящая из 256 шестнадцатеричных символов (128 байт). Я не понимаю, как можно получить эту подпись из поля данных: данные обрабатываются с помощью RSA, а затем с SHA или наоборот? Я учусь RSA и я думаю, что я должен найти что-то вроде этого:Как работает SHA-RSA?

00 01 FF FF .. FF FF 00 DigestInfo MessageDigest 

Но это не так: мои данные подписи не содержит эту строку. Можете ли вы объяснить мне процедуру, используемую для получения подписи? У вас есть ссылка на пример (возможно, на Python, из-за его простоты)?

+0

Посмотрите здесь: http://security.stackexchange.com/questions/9260/sha-rsa-and-the-relation-between-them – JaggenSWE

ответ

1

security.stackexchange.com answer имеет довольно хорошие детали, но вот короткая форма (так как они, кажется, не вполне ответить на ваш вопрос.

Первый шаг EMSA-PKCS1-v1_5, где M является unhashed) сообщение (и emLen это размер (в байтах) ключа RSA (который, как правило, выражается в битах).

H = Hash(M). Мы знаем, что Hash является SHA-1 (по вопросу), поэтому выход 20 байт. Давайте предположим, что это произведено 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.

Построить T:

// DigestInfo = SEQUENCE(AlgorithmIdentifier, OCTET STRING) 
30 21 
    // AlgorithmIdentifier = SEQUENCE(OBJECT IDENTIFIER, ANY) 
    30 09 
     // OBJECT IDENTIFIER(SHA1) => OBJECT IDENTIFIER(1.3.14.3.2.26) 
     06 05 2B 0E 03 02 1A 
     // NULL (SHA-1 has no parameters) 
     05 00 
    // OCTET STRING(H) 
    04 14 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 

Так как все в этой структуре имеет фиксированные значения (SHA-1 OID), и/или длина (H = 20 байт) Т просто (30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 CONCAT H) (для SHA- 1).

Предположим, что у нас есть 2048-битный ключ (256 байтов). Поскольку tLen = 35, emLen> tLen + 11, так что мы готовы продолжить.

Теперь, постройте PS. Это emLen - tLen - 3FF. Для SHA-1 с RSA-2048 это означает последовательность 218 FF с.

EM = 00 01 PS 00 T 

Клеить все вместе сейчас, мы получаем (для SHA-1 и 2048-битный ключ)

00 01 FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 
FF FF FF FF FF FF FF FF FF FF FF FF 00 30 21 30 
09 06 05 2B 0E 03 02 1A 05 00 04 14 20 20 20 20 
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 

Как вы можете видеть, выходной хэш-прежнему виден, в самом конце. Сложная структура EMSA-PKCS1-v1_5 кажется тем, что вы ожидали.

Затем EM будет применяться с помощью частного ключа RSA формулы для получения подписи:

`signature` = MODPOW(`EM`, `d`, `n`) 

Поскольку величина signature теперь зависит от d (закрытого ключа) не неподвижный пример не может быть дана. Но этот последний шаг - это то, почему а) он криптографически звучит, и б) вы больше не можете найти значение MessageDigest в значении подписи.

Для RSA подписи подпись получает проверить, как

`candidate` = MODPOW(`signature`, `e`, `n`) 
return ConstantTimeSequenceEquals(`candidate`, `EM`); 

Новый алгоритм RSA подписи (PSS (вероятностный Подпись схема)) работает совсем по-другому. И, стоит отметить, DSA и ECDSA работают еще более по-разному.

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

  • Нет связанных вопросов^_^