Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
VitalyMM написал:Еще раз добавил файл (кнопкой attach), но он опять недоступен... что я делаю не так?? попробуй "простое" имя файла... типа 1.enc хотя нет... не в имени дело... "R1_1655046738_032_24092012_ED73599D-F9F0-4E73-835F" Отредактировано пользователем 25 сентября 2012 г. 0:50:49(UTC)
| Причина: Не указана Вложение(я):  R1_1655046738_032_24092012_ED73599D-F9F0-4E73-835F (2kb) загружен 5 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться. |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.09.2012(UTC) Сообщений: 25
|
Я добился, чтобы у меня RAD Studio XE2 начал шифровать файлы без ошибок во время шифрования, но тут же обнаружил странный эффект. В результирующий файл в конец пишется какая-то лабуда размером примерно 713 байт.. Если ее удалить, то файл начинает нормально дешифроваться без всяких проблем. Видимо функция CryptEncryptMessage( @EncParams, CertCount, Pointer(MessageCert), FileStream.Memory, FileStream.Size, nil, cbEncrypted ) ошибается с размером выходного потока?? Так что-ли?? Проверил многократно - удаляю хвост в конце файла и он становится читабельным....  На вход этой функции подается 2 сертификата и входной файл, размер которого правильный, я проверял.. В чем засада-то??????
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
VitalyMM написал:Я добился, чтобы у меня RAD Studio XE2 начал шифровать файлы без ошибок во время шифрования, но тут же обнаружил странный эффект. В результирующий файл в конец пишется какая-то лабуда размером примерно 713 байт.. Если ее удалить, то файл начинает нормально дешифроваться без всяких проблем. Видимо функция CryptEncryptMessage( @EncParams, CertCount, Pointer(MessageCert), FileStream.Memory, FileStream.Size, nil, cbEncrypted ) ошибается с размером выходного потока?? Так что-ли?? Проверил многократно - удаляю хвост в конце файла и он становится читабельным....  На вход этой функции подается 2 сертификата и входной файл, размер которого правильный, я проверял.. В чем засада-то?????? т.е. если выполнить шифрование на 2х сертификатах в КриптоАРМ-е размер будет меньше на указанный размер (приблизительно)? зашифруй файл на мой сертификат (пост от 24 сентября 2012 г. 16:07:46) и свой, прикрепи здесь (или ссылку на внешний ресурс, тип http://rghost.ru) тогда и будем делать выводы ... или если так интересно - бери в руки ASN1-редактор и вперед - посмотришь заодно, что ты удалял из pkcs7 данных Отредактировано пользователем 25 сентября 2012 г. 4:03:52(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.09.2012(UTC) Сообщений: 25
|
Я разобрался!:d/ Все оказалось проще. При первом вызове CryptEncryptMessage для вычисления длины выходного сообщения функция возвращает приблизительное значение, но заведомо большее, чем реально может понадобиться для принятия закодированного сообщения. Поэтому в файл надо писать столько байт, сколько вернет второй вызов этой функции... А практически во всех примерах, которые я нашел на этом форуме, пишется столько, сколько дает первый вызов... Чуть зубы не позеленели от напряга, пока я соображал, что за хвост лепится в конец нормального файла..  Андрей, огромное спасибо за внимание и желание помочь!
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
VitalyMM написал:Я разобрался!:d/ Все оказалось проще. При первом вызове CryptEncryptMessage для вычисления длины выходного сообщения функция возвращает приблизительное значение, но заведомо большее, чем реально может понадобиться для принятия закодированного сообщения. Поэтому в файл надо писать столько байт, сколько вернет второй вызов этой функции... А практически во всех примерах, которые я нашел на этом форуме, пишется столько, сколько дает первый вызов... Чуть зубы не позеленели от напряга, пока я соображал, что за хвост лепится в конец нормального файла..  Андрей, огромное спасибо за внимание и желание помочь! Доверяй, но проверяй... use SDK Отредактировано пользователем 25 сентября 2012 г. 5:03:48(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
смотри SDK (особенно в следующий раз) - там правильно CryptEncryptMessage ( ... cbEncryptedBlob.. ) Резервируем память( ... cbEncryptedBlob.. ) (!) CryptEncryptMessage( ... cbEncryptedBlob.. ) (реальный размер) write_file (out_filename, cbEncryptedBlob, pbEncryptedBlob); еще бы решить проблему по первому вопросу в этой веткеОтредактировано пользователем 25 сентября 2012 г. 5:07:12(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.09.2012(UTC) Сообщений: 25
|
Да, спасибо еще раз. С первым вопросом наверное посложнее будет. КриптоАРМ наверно тоже работает через CryptoAPI? Может среди этих 400 сертификатов есть какой-то кривой и КриптоАРМ это понимает и пропускает его, не пытаясь использовать?
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 14,190   Сказал «Спасибо»: 621 раз Поблагодарили: 2397 раз в 1886 постах
|
VitalyMM написал:Да, спасибо еще раз. С первым вопросом наверное посложнее будет. КриптоАРМ наверно тоже работает через CryptoAPI? Может среди этих 400 сертификатов есть какой-то кривой и КриптоАРМ это понимает и пропускает его, не пытаясь использовать? КриптоАРМ - использует низкоуровневые функции... Сомневаюсь, что "понимает и пропускает..."... а насчет "кривого" - было первое предположение, что там RSA-шный присутствует (в интервале 200-400)... но была бы другая ошибка... Отредактировано пользователем 25 сентября 2012 г. 13:16:55(UTC)
| Причина: Не указана |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 11.05.2012(UTC) Сообщений: 6 Откуда: Москва
|
Докладываю :о) Вчера прочитал про "неправильные" сертификаты и осенило :о) С утра переписал кусок добавления сертификатов в массив с проверкой на срок действия и дело пошло. 358 сертификатов из 400 оказались валидными и добавились в массив. Соответственно первый вызов вернул значение буфера больше нуля. Дальше радостно выделился массив под данные, второй вызов и бац!, у вас имеются дополнительные данные :о) Первый вызов вернул на 656 байт меньше, чем требовалось. Соответственно, не все зашифрованные данные поместились в выделенный буфер и получили ошибку ERROR_MORE_DATA.
Решил попробовать второй вызов изменить и поправить массив для данных в случае, если он оказался меньше, чем надо...
if cbEncrypted > 0 then begin Stream := TMemoryStream.Create; try Stream.SetSize( cbEncrypted ); if not CryptEncryptMessage( @EncParams, CertCount, RecipientCertArray.Memory, FileStream.Memory, FileStream.Size, Stream.Memory, @cbEncrypted ) then begin if GetLastError = ERROR_MORE_DATA then begin Stream.SetSize( cbEncrypted ); CryptEncryptMessage( @EncParams, CertCount, RecipientCertArray.Memory, FileStream.Memory, FileStream.Size, Stream.Memory, @cbEncrypted ) end; end; Stream.SetSize( cbEncrypted ); Stream.Position := 0; Stream.SaveToFile( CryptFileName ); finally Stream.Free; end;
Итог - расшифровывается без вопросов.
Буду исследовать проблему дальше :о) Спасибо за мысль про плохие сертификаты и разницу в длинах массивов под данные :о)
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close