Как мне узнать, является ли шифрование OpenPGP симметричным или асимметричным?
Есть ли способ определить, являются ли объекты, зашифрованные с помощью GNU Privacy Guard, симметричными или асимметричными (без их расшифровки или без знания, с чего начать)? Как?
В любом случае (для тех, кто хочет знать, что я делаю), я использовал Python 3.x для программирования своего рода IDE на основе графического интерфейса, который может открывать симметрично зашифрованные файлы (и сохранять их тоже). Он может открывать асимметрично зашифрованные файлы (введите парольную фразу, чтобы использовать секретный ключ вместо парольной фразы, чтобы расшифровать симметрично зашифрованный файл). Тем не менее, он не знает, что они асимметричные, и перезапишет их симметрично зашифрованными файлами, если они будут сохранены. Было бы неплохо иметь возможность сохранять их асимметрично, тоже. Мой редактор использует gpg
программа командной строки в Linux (нет gpg
библиотеки или что-нибудь подобное).
У меня мог бы быть флажок на запросе пароля для асимметричного шифрования, но я бы предпочел не делать это, так что это должно быть ручным делом для пользователя.
Для своих личных файлов я мог бы добавить какой-то маркер к сохраненным файлам, чтобы различать их, но я хочу, чтобы он мог их правильно открывать, даже если они не были созданы в моей IDE.
Я знаю, что есть вопрос с похожим названием, но вопрос, заданный в теле, принципиально отличается.
2 ответа
OpenPGP - это гибридная криптосистема, которая означает, что сообщения (или файлы) всегда шифруются симметрично с использованием так называемого сеансового ключа. Сеансовый ключ снова шифруется с использованием асимметричного шифрования (с использованием открытого ключа) или снова симметричного шифрования (с использованием функции строка-ключ).
Это имеет технические причины (асимметричная криптография очень медленная для больших объемов данных), но также и практические: за счет многократного шифрования небольшого ключа сеанса (по одному разу для каждого получателя) вы также можете иметь несколько получателей с разными ключами и даже смешивать асимметричные (открытый ключ) и симметричное (на основе пароля) шифрование в одном сообщении OpenPGP.
Каждая из этих зашифрованных копий ключа сеанса образует пакет OpenPGP, либо пакет с тегом 1 (пакет сзашифрованным ключом открытого ключа), либо пакет с тегом 3 (пакетсессионного ключа с симметричным ключом). Эти пакеты в сообщении OpenPGP могут быть легко разложены с помощьюpgpdump
, Пример использования GnuPG для создания шифрования сообщений OpenPGP как для моего собственного ключа, так и симметрично для ключевой фразыfoo
:
$ echo foo | gpg --recipient a4ff2279 --symmetric --passphrase foo --encrypt | pgpdump
Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
New version(3)
Key ID - 0xCC73B287A4388025
Pub alg - RSA Encrypt or Sign(pub 1)
RSA m^e mod n(4096 bits) - ...
-> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
Old: Symmetric-Key Encrypted Session Key Packet(tag 3)(46 bytes)
New version(4)
Sym alg - AES with 128-bit key(sym 7)
Iterated and salted string-to-key(s2k 3):
Hash alg - SHA512(hash 10)
Salt - 0c a6 e6 1d d2 f4 9a 50
Count - 102400(coded count 105)
Encrypted session key
-> sym alg(1 bytes) + session key
New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes)
Ver 1
Encrypted data [sym alg is specified in sym-key encrypted session key]
(plain text + MDC SHA1(20 bytes))
Каждый из первых двух пакетов образует ключ для открытия зашифрованной строки в пакетах ссимметричным шифрованием и MDC.
Это также уже объясняет, как анализировать, как сообщение было зашифровано: просматривайте пакеты, ищите пакеты тега 1 или 3, указывая асимметричное или симметричное шифрование (и помните, что оба могут существовать). Кажется, вам очень повезло, и модуль Python GnuPG уже приноситListPackets
класс, так что вы не должны взаимодействовать pgpdump
и не пишите свой собственный анализатор OpenPGP.
Поскольку вы используете команды linux, я думаю, вы можете попробовать с помощью утилиты "file" проверить заголовок и сказать, является ли шифрование симметричным или асимметричным.
Вывод будет примерно таким (протестировано в Ubuntu 14.04):
Command: file symm_encrypted.txt.gpg
Output: GPG symmetrically encrypted data (CAST5 cipher)
Command: file asymm_encrypted.txt.gpg
Output: GPG encrypted data