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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Hedin  
#1 Оставлено : 21 января 2008 г. 14:04:10(UTC)
Hedin

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

Группы: Участники
Зарегистрирован: 21.01.2008(UTC)
Сообщений: 1
Мужчина
Откуда: Санкт-Петербург

Попробовал встроить вашу реализацию Cipher, напоролся на кучу ошибок.

1) Некорректно работает вызов update() с массивом из 1-2х байтов в режимах гаммирования (если его вызывать более 1 раза) - полученные данные потом не расшифровать.

2) Не работает метод doFinal() без аргументов, вылетает NullPointerException. Этим методом пользуются стандартные классы CipherInputStream/CipherOutputStream, соответственно их использование становится невозможным.

3) Полученый объект Cipher нельзя инициализировать повторно. Стандартная реализация от Sun это позволяет, в документации так же запретов нет.

Вот кратенький тест всего этого безобразия (в формате JUnit):

Код:
public void testCipher() throws Exception
  {
    KeyGenerator keyGen = KeyGenerator.getInstance("GOST28147");
    SecretKey key = keyGen.generateKey();

    Cipher cipher = Cipher.getInstance("GOST28147/CFB/NoPadding");

    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] cipherIV = cipher.getIV();

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    byte[] sendedText = new byte[10];

    // 1) Ошибка при побайтном шифровании

    baos.write( cipher.update(sendedText,0,1) );
    baos.write( cipher.update(sendedText,1,1) );
    baos.write( cipher.update(sendedText,2, sendedText.length-2) );

/*
    baos.write( cipher.update(sendedText,0,2) );
    baos.write( cipher.update(sendedText,2,2) );
    baos.write( cipher.update(sendedText,4, sendedText.length-4) );
*/
//    baos.write( cipher.update(sendedText,0, sendedText.length) );

    // 2) Вылетает NPE
    baos.write( cipher.doFinal() );
//    baos.write( cipher.doFinal(new byte[0]) );

    // 3) Требуется новый экземпляр
//    cipher = Cipher.getInstance("GOST28147/CFB/NoPadding");

    cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(cipherIV));

    byte[] encryptedText = baos.toByteArray();

    byte[] receivedText = cipher.doFinal(encryptedText);

    assertTrue( "Secret text differs", Arrays.equals(sendedText, receivedText) );
  }


ЗЫ. Версия JCP: 1.0.33
Offline Ольга  
#2 Оставлено : 3 апреля 2008 г. 15:56:24(UTC)
Ольга

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

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

Поблагодарили: 3 раз в 3 постах
Выложена новая версия JCP.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.