Шифрование с открытым ключом
Этот пост рассказывает о PGP или «Довольно хорошей конфиденциальности». PGP представляет собой гибридную реализацию обычной криптографии, а также шифрования с открытым ключом. Прежде чем углубляться в детали PGP, давайте немного поговорим о шифровании с открытым ключом.
Как и любая другая криптографическая технология, шифрование с открытым ключом решает проблему передачи защищенных данных через небезопасную среду; а именно интернет. В результате цель этой схемы состоит в том, чтобы отправлять данные таким образом, чтобы только предполагаемые получатели могли читать.
Это достигается путем использования асимметричного ключа шифрования. Для шифрования используется пара ключей: открытый ключ, который шифрует данные отправителя, и «соответствующий» закрытый ключ, который расшифровывает данные на принимающей стороне. Эти открытые / закрытые ключи математически связаны, но генерируются так, что ни один из них не является выводимым (вычислительно осуществимым) из знания другого; по крайней мере, до самого конца времени с самыми быстрыми компьютерами там. Ключи основаны на математических соотношениях (особенно это касается задач целочисленной факторизации и дискретного логарифма). Однако, поскольку вычисления становятся быстрее, алгоритмы шифрования всегда должны будут становиться более сложными.
Подводя итог, открытый ключ публикуется и становится доступным. Он позволяет любому зашифровать данные с помощью открытого ключа, но только сторона, обладающая закрытым ключом, может расшифровать данные. Большим преимуществом криптографии с открытым ключом является то, что она позволяет сторонам, у которых нет ранее существовавшего механизма безопасности, обмениваться сообщениями безопасным образом, поскольку все коммуникации включают только открытые ключи, и никакой закрытый ключ никогда не передается или не передается. Некоторыми распространенными примерами систем с открытым ключом являются RSA (Rivest, Shamir и Adleman) и DSA (алгоритм цифровой подписи).
PGP
PGP, созданная Филом Циммерманном в 1991 году, представляет собой гибридную схему шифрования с открытым ключом / традиционную схему, и она немного отличается. Тело сообщения в виде открытого текста или простого текста сначала сжимается, а затем шифруется. Это сжатие не только облегчает передачу файлов, но и повышает безопасность. В настоящее время существует орган по стандартизации, который поддерживает этот проект: OpenPGP Alliance .
После сжатия PGP создает ключ сеанса. Этот сеансовый ключ является одноразовым секретным ключом, генерируемым движениями мыши и нажатий клавиш. С помощью этого сеансового ключа данные шифруются для формирования зашифрованного текста. После шифрования сеансовый ключ затем шифруется в открытый ключ получателя, который привязан к имени пользователя и / или адресу электронной почты (подробнее об этом позже). Этот открытый ключ передается получателю вместе с зашифрованным текстом.
Расшифровка работает в обратном порядке. Копия PGP получателя использует закрытый ключ пользователя для восстановления ключа сеанса, сгенерированного выше, для расшифровки зашифрованного текста.
В дополнение к шифрованию PGP использует криптографически надежную хеш-функцию для подписи сообщений, если необходимо обеспечить некоторую форму проверки. Хеш-функция — это процесс, который принимает ввод переменной длины (сообщение) и производит вывод фиксированной длины; скажем, 160 бит. Это называется дайджестом сообщения, которое может отличаться при малейшем изменении на входе. Затем PGP использует дайджест и закрытый ключ для создания «подписи». Кроме того, эта подпись и простой текст передаются получателю, который должен будет повторно вычислить дайджест и проверить подпись. Опять же, малейшее изменение этого сообщения изменит подписанный документ и приведет к сбою процесса проверки.
В Java, пожалуй, самым популярным поставщиком библиотек шифрования является «Легион Надувного замка» .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
// insert code here public class PGPExample { public static void encrypt() { Security.addProvider( new BouncyCastleProvider()); //Load Public Key File FileInputStream key = new FileInputStream( "res/keys/public.bpg" ); PGPPublicKey pubKey = KeyBasedFileProcessorUtil.readPublicKey(key); //Output file FileOutputStream out = new FileOutputStream( "target/enc.bpg" ); //Input file String inputFilename = "src/main/resources/plaintext.txt" ; //Other settings boolean armor = false ; boolean integrityCheck = false ; KeyBasedFileProcessorUtil.encryptFile(out, inputFilename, pubKey, armor, integrityCheck); } } |
Ресурсы
- http://www.pgpi.org/doc/pgpintro/
- http://en.wikipedia.org/wiki/Pretty_Good_Privacy
- http://www.rossde.com/PGP/index.html#links
- http://www.openpgp.org/
- http://www.bouncycastle.org/java.html
Ссылка: Java и довольно хорошая конфиденциальность (PGP) от нашего партнера JCG на Reflective Thought.net .