Статус: Новичок
Группы: Участники
Зарегистрирован: 18.10.2010(UTC) Сообщений: 3
|
Есть код на C# (предоставлен партнером):
byte[] fileBytes = [содержимое файла];
var hashedDataClass = new CPICom.HashedData20Class { Algorithm = (CAPICOM_HASH_ALGORITHM) CPICom.CPICOM_HASH_ALGORITHM.CAPICOM_HASH_ALGORITHM_GOST3411 };
hashedDataClass.Hash(Encoding.GetEncoding(1251).GetString(fileBytes));
var fileHash = hashedDataClass.Value;
Аналогичный код на Java с использованием JCP дает другое значение хэша, подскажите, пожалуйста, что неправильно в коде на Java? код частично заимствован из примера к JCP CMSTools.java
protected byte[] getDigest(byte[] data) throws Exception { ByteArrayInputStream stream = new ByteArrayInputStream(data); MessageDigest digest = MessageDigest.getInstance(JCP.GOST_DIGEST_NAME); DigestInputStream digestStream = new DigestInputStream(stream, digest); while (digestStream.available() != 0) digestStream.read(); return Hex.encodeHexString(digest.digest()).toUpperCase().getBytes(); }
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.10.2008(UTC) Сообщений: 181
|
Для хеширования на Java Вы читаете файл как бинарный, т.е. byte[]. При хешировании на С# вы содержимое считаете строкой и меняете кодировку на 1251. Из-за этого и разница. Либо Вы на Java перекодируете в 1251, либо на С# надо хешировать бинарные данные.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 18.10.2010(UTC) Сообщений: 3
|
Так и есть перед созданием хэша на яве данные преобразуются:
data = new String(data, "cp1251").getBytes("UTF-16LE");
На файлах типа '1234' хэши совпадают, но для документов Word формируются различные хэши. Предположительно CPICom перед формированием хэша переводит хэшируемую строку в бвоичные данные, если это так, то подскажите какая кодировка при этом используется?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 18.10.2010(UTC) Сообщений: 3
|
Хэши совпали, оказалось, что конструкция C# Encoding.GetEncoding(1251).GetString(fileBytes) и Java data = new String(data, "cp1251").getBytes("UTF-16LE"); дают различный результат для символов с кодами 128..192. Осталась следующая проблема: в подписи, сформированной CAPICOM, совпавший хэш каким то образом меняется, при формировании подписи на Java хэш не модифицируется, подскажите пожалуйста каков алгоритм изменения хэша применяется в CAPICOM? И еще одно наблюдение: если взять хэш из сформированной с помощью CAPICOM подписи и на основе этого хэша сформировать подпись в Java, такая подпись проходит проверку в CAPICOM.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close