Как получить фактический размер ключа блочного шифра для Java-соединения _in code_?

Когда Java-клиент установил сеанс SSL/TLS, он может получить используемый протокол и имя шифра:

    SSLSession session = s.getSession();
    String protocol = session.getProtocol(); // e.g. "TLSv1"
    String cipher = session.getCipherSuite(); // e.g. "TLS_RSA_WITH_AES_128_CBC_SHA"

Но некоторые шифры могут иметь ключи размером 128 или 256 (например, AES CBC).

Как я могу получить фактический размер ключа, согласованный для этого конкретного соединения?

Я нашел этот код в базе кода Apache:

static final CipherData cipherSizes[] = {
    new CipherData("_WITH_NULL_", 0),
    new CipherData("_WITH_IDEA_CBC_", 128),
    new CipherData("_WITH_RC2_CBC_40_", 40),
    new CipherData("_WITH_RC4_40_", 40),
    new CipherData("_WITH_RC4_128_", 128),
    new CipherData("_WITH_DES40_CBC_", 40),
    new CipherData("_WITH_DES_CBC_", 56),
    new CipherData("_WITH_3DES_EDE_CBC_", 168),
    new CipherData("_WITH_AES_128_CBC_", 128),
    new CipherData("_WITH_AES_256_CBC_", 256)
};  

Это выглядит как приемлемый обходной путь. Это единственный способ сделать это?

1 ответ

Решение

Вы можете просто разобрать размер ключа из строки подключения. Если это DES EDE, то это 168 (или 192, если считать биты четности). В противном случае он имеет значение по умолчанию или размер ключа находится непосредственно за именем симметричного алгоритма.

Я бы сказал, что путь Apache кажется очень приемлемым, да. В любом случае вам придется вручную вставлять размеры ключей по умолчанию - для таких шифров, как IDEA. Создание Cipher Мне кажется, что объект, чтобы добраться до приемлемых размеров ключа, является излишним.

Абстракция / автоматизация - все это очень хорошо, но вы можете зайти слишком далеко. Ничего плохого в (полу) жестко закодированной таблице здесь.

Другие вопросы по тегам