Работа с PGP цифрови подписи с помощта на криптографската библиотека Bouncy Castle в Java
В този урок ще разгледаме работата с OpenPGP в Java с помощта на криптографската библиотека Bouncy Castle с фокус върху уеб разработката.
PGP/OpenPGP
OpenPGP е описан в RFC 4880 и е най-широко използваната криптографска система с публичен ключ за цифрови подписи и криптиране на съобщения. Поддържа се от много програми и библиотеки, включително безплатни с отворен код. По-специално, трябва да се отбележи GnuPG, Kleopatra, набор от помощни програми за Windows Gpg4win (включва GnuPG, Kleopatra и т.н.), разширение за Thunderbird Enigmail. За Windows и също така трябва да потърсите комерсиалния Symantec Endpoint Encryption Suite, известен още като PGP Desktop (налична е пробна версия, която може да продължи да се използва за некомерсиални цели след изтичане на срока на валидност), и други продукти от семейството на Symantec Encryption.
Криптографска библиотека Bouncy Castle
Криптографската библиотека Bouncy Castle в момента е най-използваната криптографска библиотека за Java, включително Android. Това е проект с отворен код (GitHub: github.com/bcgit/bc-java). Също така интересна за нашата тема е програмата с отворен код Portable PGP v. 1.x, написан на Java с помощта на Bouncy Castle: sourceforge.net/p/ppgp/code
За работа с OpenPGP, Bouncy Castle има отделен пакет org.bouncycastle.openpgp, с който ще работим.
Четене на публичния ключ
Задача за решаване: прочетете ASCII-бронирания публичен PGP ключов блок (публичен ключ) като низ и създайте обект org.bouncycastle.openpgp.PGPPublicKey, представляващ публичния ключ в BC.
В тази форма публичният ключ може да бъде предаден на уеб формуляра. Ние ще напишем кодакойто може да извлича данни от ключа на сървъра и след това, да речем, да ги върне на потребителя (услуга за разпознаване на публичен ключ) и/или да ги съхранява в базата данни. В BC има клас PGPPublicKey, нашата задача ще бъде да създадем нов обект от този клас, използвайки String като вход и след това да използваме методите, предоставени от този клас, за да получим данни за ключа.
Пакетът org.bouncycastle.openpgp.examples съдържа класа PGPExampleUtil, не можем да го импортираме, тъй като не е публичен, но можем да използваме неговия код, за да създадем наш собствен подобен клас. Метод от PGPExampleUtil, който можем да използваме като основа:
В portablepgp.core.KeyRing подобна задача се решава по следния начин:
Въз основа на предположението, че трябва да извлечем само един (първи) PGPPublicKey от PGPPublicKeyRing, ние просто използваме .getPublicKey() и не използваме итератор (на входа String методът връща org.bouncycastle.openpgp.PGPPublicKey):
Или можем напълно да копираме метода readPublicKey от org.bouncycastle.openpgp.examples.PGPExampleUtil в нашия клас и да добавим следния метод към класа:
Показване на ключови данни
За най-простата версия на представяне на данни от публичен ключ в четима форма можете да използвате класа portablepgp.core.PrintablePGPPublicKey с метода toString():
За да съхраним по-пълна информация за ключа, нека създадем класа PGPPublicKeyData с конструктор, който извлича данни от org.bouncycastle.openpgp.PGPPublicKey:
Hardcore conf в C++. Каним само професионалисти.