Как получить фактический размер ключа блочного шифра для 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
Мне кажется, что объект, чтобы добраться до приемлемых размеров ключа, является излишним.
Абстракция / автоматизация - все это очень хорошо, но вы можете зайти слишком далеко. Ничего плохого в (полу) жестко закодированной таблице здесь.