Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline romanosipov  
#1 Оставлено : 20 октября 2010 г. 16:39:29(UTC)
romanosipov

Статус: Новичок

Группы: Участники
Зарегистрирован: 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();
}
Offline Iva  
#2 Оставлено : 20 октября 2010 г. 18:39:04(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Для хеширования на Java Вы читаете файл как бинарный, т.е. byte[]. При хешировании на С# вы содержимое считаете строкой и меняете кодировку на 1251. Из-за этого и разница. Либо Вы на Java перекодируете в 1251, либо на С# надо хешировать бинарные данные.
Offline romanosipov  
#3 Оставлено : 20 октября 2010 г. 20:42:55(UTC)
romanosipov

Статус: Новичок

Группы: Участники
Зарегистрирован: 18.10.2010(UTC)
Сообщений: 3

Так и есть перед созданием хэша на яве данные преобразуются:

data = new String(data, "cp1251").getBytes("UTF-16LE");

На файлах типа '1234' хэши совпадают, но для документов Word формируются различные хэши. Предположительно CPICom перед формированием хэша переводит хэшируемую строку в бвоичные данные, если это так, то подскажите какая кодировка при этом используется?
Offline romanosipov  
#4 Оставлено : 22 октября 2010 г. 15:21:46(UTC)
romanosipov

Статус: Новичок

Группы: Участники
Зарегистрирован: 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.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.