Курсовая работа: Анализ предметной области
Последним этапом является собственно генерация пары ключей (метод generateKeyPair()) и выделение двух отдельных ключей (методы getPrivate() и getPublic()).
KeyPair pair = keyGen.generateKeyPair();
PrivateKey privKey = pair.getPrivate();
PublicKey pubKey = pair.getPublic();
Созданиеподписи.
В первую очередь необходимо создать объект класса Signature, вызвав метод getInstance():
Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
В данном случае используется алгоритм DSA с SHA1 (хэш-функция). Затем идет процесс инициализации подписи ключом. На этом этапе используется закрытый ключ, полученный ранее:
dsa.initSign(privKey);
После этого необходимо свести подпись и сами данные. Для этого вызывается метод update(), получаемый в качестве параметра байтовый массив данных, которые должны быть подписаны.
На последнем этапе генерируется сама подпись, которая представляется в виде байтового массива.
byte[] realSig = dsa.sign();
Сохранение подписи.
После получения подписи и ключей необходимо сохранить их, например, в файл, и отправить адресату вместе с исходными данными. Следует подчеркнуть, что закрытый ключ не посылается, а остается у отправителя. Отсылается же открытый ключ.
Итак, отправитель посылает получателю, например, по электронной почте или через прямое сетевое соединение следующие файлы:
1.Открытый ключ (public key)
2.Цифровую подпись (digital signature)
3.Исходные данные (подписанный документ или код).
Рисунок 2.1 - Схема действий при верификации подписи
Работа с ключом: чтение из файла и преобразование в PrivateKey.
Получатель располагает последовательностью байт, представляющих открытый ключ. Необходимо получить байтовый массив (Byte[] encKey), например, прочитать эти данные из файла в массив, а затем преобразовать его в объект класса PublicKey.
Для этого можно воспользоваться классом KeyFactory, который по спецификации ключа может восстановить объект класса Key (PrivateKey и PublicKey являются потомками класса Key). Таким образом, необходимо получить так называемую спецификацию ключа. Ее можно получить, основываясь на том, какой стандарт использовался при генерации ключа. В данном случае ключ был сгенерирован с помощью провайдера "SUN", поэтому он удовлетворяет стандарту X.509.
Генерация спецификации ключа (необходим пакет java.security.spec.*):
X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
Создание объекта класса KeyFactory, соответствующего цифровой подписи и провайдеру "SUN".
KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
ПолучениеобъектаклассаPublicKey
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);