Как выщить один ключ (как из полученной строки получить массив байт ключа)
Я экспортирую ключ из хранилища ключей и получаю файл следующего вида:
Потом пытаюсь прочитать эту строку в массив байт:
И получаю исключение:
Invalid character in a Base-64 string.
Т.е. это не сам ключ?
Для примера в библиотеке которую я использую есть вот такой ключ
Он работает как надо.
Есть какие-нибудь соображения? как вытащить ключ?
Спасибо.
Ссылки
[link1] https://www.pgpru.com/biblioteka/specifikacii
[link2] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/formatfajjlovpgp
[link3] https://www.pgpru.com/biblioteka/statji/analiznadezhnostipgp/formatfajjlovpgp/paketykljuchejj#oftnd2
[link4] https://www.pgpru.com/biblioteka/specifikacii/files?get=rfc4880.txt
Странное дело:
Мне посоветовали удалить последнюю строку "=41Ep", т.е. теперь вот стало выглядеть:
И все стало работать – ключем можно пользоваться. А что же это за лишний хвостик такой? Зачем он нужен, зечем при экспортировании ключа он приписывается?
Это контрольная сумма (в сущности, Вы получали ошибку, потому что пытались скормить парсеру Base64 две отдельные закодированные строки). Почитайте RFC4880[link1] или хотя бы "краткое содержание" спецификаций, приведённое в этой статье[link2].
SATtva, спасибо.
"Контрольная сумма рассчитывается сложением значений всех байтов секретного ключевого материала по модулю 65536; она применяется, чтобы определить правильность парольной фразы.
Точнее, контрольная сумма нужна, чтобы определить правильность расшифрования ключевого материала."
Завтра поэкспериментирую, получится на таком ключе без контрольной суммы что-либо подписать. Если да, то используемая мной библиотека вообще не проверяет правильность дешифрования.
Я отрезал последние 5 символов от строки, которая представляет эекспортированный PGP ключ.
И этот ключ продолжает работать, если я указываю для его использования неверный пароль – выскакивает исключение "Checksum mismatch at 0 of 20".
Если есть возможность расскажите подробнее, почему так происходит и что это за пять символов в конце.
Вы говорите о 5 символах, когда контрольная сумма уже удалена? (В Вашем первом комментарии наверху это символы '/dzQ='.) Что именно попадает в этот хвост я не знаю, это нужно декодировать Radix64 и смотреть, что за OpenPGP-пакет помещается в самый конец. Стандарт не предписывает какого-то определённого порядка для компоновки пакетов, порядок их следования может быть вообще произвольным (это не значит, что так и есть: и PGP, и GnuPG формируют сертификат вполне конкретным образом).
Попробую подробнее описать
Вот полный PGP ключ:
Если отрезать от него последние пять символов – "=41Ep", то
1. полученную строку можно перевести в массив байт, используя декодирование Radix64
(если не отрезать, то декодирование не получится)
2. ключ продолжает работать. И проверка параля осуществляется корректно.
(если захочется поэксперементировать – пароль "1").
Потом, пять символов ("=41Ep") совершенно точно не являются закодированным массивом байт, т.к. невозможно произвести их декодирование Radix64.
Вот с этим хвостом из пяти символов я и пытают разобраться.
Я же писал выше, это контрольная сумма всего предыдущего блока.
SATtva, спасибо за терпение.
Не могу все равно понять.
Если "контрольная сумма нужна, чтобы определить правильность расшифрования ключевого материала" ©[link3], то без этой суммы невозможно будет определить правильность дешифрования.
Однако я удаляю эту сумму и дешифрование проходит корректно:
если для использования PGP-ключа я указываю неверный пароль, то получаю сообщение “Checksum mismatch”.
И потом, если эти пять символов — кодированный массив байт, то как можно получить этот массив?
(Насколько я понял, кодирование байтов с помощью Radix64 ни при каких вводных не приведет к строке из 5 символов)
Не так. Правильность расшифрования определяется по контрольной сумме (вернее, коду MDC) самого шифртекста.
Контрольная сумма в ASCII-блоке контролирует только точность передачи самого этого блока. Это не особенно полезно для сетевой передачи, поскольку сетевые протоколы сами контролируют ошибки в передаче, но если Вы распечатаете свой ключ на листе бумаги, а потом оцифруете обратно через OCR, такая контрольная сумма может помочь. Попробуйте изменить контрольную сумму Вашего ключа (просто исправив один из символов, скажем, заменив '=41Ep' на '=41Er'), а потом импортируйте этот ключ на связку: Вы получите ошибку о несоответствии контрольной суммы, и операция будет прервана.
Уберите знак '=' в начале, это просто разделитель. Оставшиеся 4 символа и есть кодированная контрольная сумма.
SATtva, спасибо!
Пожалуйста. Обращайтесь, если что.
Каким образом считается контрольная сумма в ASCII-блоке?
Она считается только от подписи?
Например у меня есть строка, представляющая собой PGP подпись,
Я могу, зная только эту строку подсчитать контрольную сумму ASCII-блока?
Правильный документ выглядит вот так:
Нужно подсчитать /R4o .
Спасибо.
В спецификации[link4] этим деталям посвящён целый раздел под номером 6. В разделе 6.1 даже приводится сишная реализация CRC-24, используемая для подсчёта контрольной суммы.
Спасибо, вот так будет выглядить на C#
(половина из http://www.bouncycastle.org/ ):
Пример использования: