2012-04-09 6 views
4

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

В Java я не могу понять, как использовать открытый ключ для выполнения второго этапа подписания.

Signature sig = Signature.getInstance("MD5WithRSA"); 
sig.initSign(privateKey); 
sig.update(data); 
byte[] signatureBytes = sig.sign(); 

Я проверил API, единственные методы, которые используют открытый ключ для проверки ...

ответ

6

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

2

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

Итак, да (не зная специфики Java), я не удивлен, что API предлагает только функции для создания того, кому нужен ваш частный RSA-ключ, тогда как получателю нужен ваш открытый RSA-ключ, чтобы проверить вашу подпись, которая это вторая часть упомянутого API.

0

Что вы подразумеваете под «второй стадией», зашифровывая с помощью секретного ключа хэш или проверяя подпись?

Вложенный код уже дает вам подпись после звонка update(). Объект подписи уже делает хэш (MD5) и шифрует с помощью закрытого ключа (RSA).

Чтобы проверить подпись вы просто следовать симметричные шаги описаны here

3

В криптографии с открытым ключом:

  • Закрытый ключ используется для подписания и расшифровку/дешифрования.

  • Открытый ключ используются для проверки подписей и шифрования/шифрование.

См the glossary of the TLS specification:

криптография с открытым ключом: Класс криптографических методов, использующих два-шифры ключей. Сообщения, зашифрованные открытым ключом, могут быть дешифрованы с помощью закрытого ключа только . И наоборот, сообщения, подписанные с закрытым ключом, могут быть проверены с помощью общедоступного ключа .

Хотя с РСА математические операции, используемые для подписи очень близки к тем, которые используются для шифрования (в том, что подписания более или менее одинаковы, как «шифрования» дайджеста), это не так для всех алгоритмов (например DSA). Кроме того, смешивание терминологии вызовет проблемы в ваших общих соображениях безопасности.

Что вы здесь сделали, это единственный этап подписания.Вы можете также зашифровать сообщение в дополнение к этому (используя открытый ключ получателя), но это независимая операция. Вы можете посмотреть на Cipher, чтобы сделать это. Конечно, это не только подпись, которую вы получили до того, как вы захотите зашифровать, но и конкатенацию исходного сообщения и его подписи. (Я не уверен, что в шифровании только подписи будет смысл.)