id: Гость   вход   регистрация
текущее время 19:37 28/03/2024
Автор темы: Alex_B, тема открыта 18/02/2008 18:43 Печать
Категории: софт
https://www.pgpru.com/Форум/ТехническиеВопросы/КакВытащитьОдинКлючкакИзПолученнойСтрокиПолучитьМассивБайтКлюча
создать
просмотр
ссылки

Как выщить один ключ (как из полученной строки получить массив байт ключа)


Я экспортирую ключ из хранилища ключей и получаю файл следующего вида:


Потом пытаюсь прочитать эту строку в массив байт:



И получаю исключение:
Invalid character in a Base-64 string.


Т.е. это не сам ключ?


Для примера в библиотеке которую я использую есть вот такой ключ



Он работает как надо.


Есть какие-нибудь соображения? Как вытащить ключ?


Спасибо.


 
Комментарии
— Alex_B (18/02/2008 18:57)   профиль/связь   <#>
комментариев: 143   документов: 31   редакций: 143
Странное дело:

Мне посоветовали удалить последнюю строку "=41Ep", т.е. теперь вот стало выглядеть:




И все стало работать – ключем можно пользоваться. А что же это за лишний хвостик такой? Зачем он нужен, зечем при экспортировании ключа он приписывается?
— SATtva (18/02/2008 19:25)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Это контрольная сумма (в сущности, Вы получали ошибку, потому что пытались скормить парсеру Base64 две отдельные закодированные строки). Почитайте RFC4880 или хотя бы "краткое содержание" спецификаций, приведённое в этой статье.
— Alex_B (18/02/2008 23:03)   профиль/связь   <#>
комментариев: 143   документов: 31   редакций: 143
SATtva, спасибо.

"Контрольная сумма рассчитывается сложением значений всех байтов секретного ключевого материала по модулю 65536; она применяется, чтобы определить правильность парольной фразы.

Точнее, контрольная сумма нужна, чтобы определить правильность расшифрования ключевого материала."


Завтра поэкспериментирую, получится на таком ключе без контрольной суммы что-либо подписать. Если да, то используемая мной библиотека вообще не проверяет правильность дешифрования.
— Alex_B (19/02/2008 10:49)   профиль/связь   <#>
комментариев: 143   документов: 31   редакций: 143
Я отрезал последние 5 символов от строки, которая представляет эекспортированный PGP ключ.

И этот ключ продолжает работать, если я указываю для его использования неверный пароль – выскакивает исключение "Checksum mismatch at 0 of 20".

Если есть возможность расскажите подробнее, почему так происходит и что это за пять символов в конце.
— SATtva (19/02/2008 20:01, исправлен 19/02/2008 20:05)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Вы говорите о 5 символах, когда контрольная сумма уже удалена? (В Вашем первом комментарии наверху это символы '/dzQ='.) Что именно попадает в этот хвост я не знаю, это нужно декодировать Radix64 и смотреть, что за OpenPGP-пакет помещается в самый конец. Стандарт не предписывает какого-то определённого порядка для компоновки пакетов, порядок их следования может быть вообще произвольным (это не значит, что так и есть: и PGP, и GnuPG формируют сертификат вполне конкретным образом).
— Alex_B (19/02/2008 22:41)   профиль/связь   <#>
комментариев: 143   документов: 31   редакций: 143
Вы говорите о 5 символах, когда контрольная сумма уже удалена?


Попробую подробнее описать

Вот полный PGP ключ:



Если отрезать от него последние пять символов – "=41Ep", то

1. полученную строку можно перевести в массив байт, используя декодирование Radix64
(если не отрезать, то декодирование не получится)

2. ключ продолжает работать. И проверка параля осуществляется корректно.
(если захочется поэксперементировать – пароль "1").


Потом, пять символов ("=41Ep") совершенно точно не являются закодированным массивом байт, т.к. невозможно произвести их декодирование Radix64.


Вот с этим хвостом из пяти символов я и пытают разобраться.
— SATtva (19/02/2008 23:40)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Я же писал выше, это контрольная сумма всего предыдущего блока.
— Alex_B (20/02/2008 10:00)   профиль/связь   <#>
комментариев: 143   документов: 31   редакций: 143
SATtva, спасибо за терпение.

Не могу все равно понять.

Если "контрольная сумма нужна, чтобы определить правильность расшифрования ключевого материала" ©, то без этой суммы невозможно будет определить правильность дешифрования.

Однако я удаляю эту сумму и дешифрование проходит корректно:
если для использования PGP-ключа я указываю неверный пароль, то получаю сообщение “Checksum mismatch”.

И потом, если эти пять символов — кодированный массив байт, то как можно получить этот массив?
(Насколько я понял, кодирование байтов с помощью Radix64 ни при каких вводных не приведет к строке из 5 символов)
— SATtva (20/02/2008 12:50)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Если "контрольная сумма нужна, чтобы определить правильность расшифрования ключевого материала" ©, то без этой суммы невозможно будет определить правильность дешифрования.

Не так. Правильность расшифрования определяется по контрольной сумме (вернее, коду MDC) самого шифртекста.

Контрольная сумма в ASCII-блоке контролирует только точность передачи самого этого блока. Это не особенно полезно для сетевой передачи, поскольку сетевые протоколы сами контролируют ошибки в передаче, но если Вы распечатаете свой ключ на листе бумаги, а потом оцифруете обратно через OCR, такая контрольная сумма может помочь. Попробуйте изменить контрольную сумму Вашего ключа (просто исправив один из символов, скажем, заменив '=41Ep' на '=41Er'), а потом импортируйте этот ключ на связку: Вы получите ошибку о несоответствии контрольной суммы, и операция будет прервана.

Насколько я понял, кодирование байтов с помощью Radix64 ни при каких вводных не приведет к строке из 5 символов

Уберите знак '=' в начале, это просто разделитель. Оставшиеся 4 символа и есть кодированная контрольная сумма.
— Alex_B (20/02/2008 13:11)   профиль/связь   <#>
комментариев: 143   документов: 31   редакций: 143
SATtva, спасибо!
— SATtva (20/02/2008 13:18)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Пожалуйста. Обращайтесь, если что.
— Alex_B (03/03/2008 17:06)   профиль/связь   <#>
комментариев: 143   документов: 31   редакций: 143
Каким образом считается контрольная сумма в ASCII-блоке?

Она считается только от подписи?
Например у меня есть строка, представляющая собой PGP подпись,



Я могу, зная только эту строку подсчитать контрольную сумму ASCII-блока?

Правильный документ выглядит вот так:


Нужно подсчитать /R4o .

Спасибо.
— SATtva (03/03/2008 17:21)   профиль/связь   <#>
комментариев: 11558   документов: 1036   редакций: 4118
Каким образом считается контрольная сумма в ASCII-блоке?

В fileспецификации этим деталям посвящён целый раздел под номером 6. В разделе 6.1 даже приводится сишная реализация CRC-24, используемая для подсчёта контрольной суммы.
— Alex_B (03/03/2008 18:55, исправлен 03/03/2008 19:22)   профиль/связь   <#>
комментариев: 143   документов: 31   редакций: 143
Спасибо, вот так будет выглядить на C#
(половина из http://www.bouncycastle.org/ ):




Пример использования:
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3