2009-11-19 3 views
1

, когда вы хотите зашифровать что-то, что вы не хотите, чтобы ключ расшифровывался, чтобы вас определил, а не генератор каким-то генератором случайных чисел?Почему ключ aes должен генерироваться случайным образом?

Я вижу этот код в столбце stackoverflow. но я не хочу, чтобы ключ генерировался случайным образом. Я хочу, чтобы пользователь попросил ввести ключ, и на этом основании должно произойти шифрование.

любые предложения, как мне изменить код?

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
KeySpec spec = new PBEKeySpec(password, salt, 1024, 256); 
SecretKey tmp = factory.generateSecret(spec); 
SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); 

ответ

1

Вся идея шифрования является то, что никто, кроме необходимых сторон может когда-либо вывести ключ, так как ключ является единственным секретом.

Если вы сами выбираете ключи, вы, вероятно, будете следовать привычному шаблону, поэтому, если вы составляете один ключ, вы обнаружите этот шаблон, и злоумышленник может использовать эту информацию, чтобы упростить поиск других используемых вами ключей. Использование хорошего генератора случайных чисел устраняет эту возможность и делает шифрование намного более эффективным.

+0

Также посредством случайного генерации ключ обычно выбирается в полном «ключевом пространстве», в котором с помощью определенных пользователем ключей они обычно ограничены буквами и цифрами. – mjv

+0

Ну, вы могли бы компенсировать это, попросив у пользователя больше букв и цифр и хеширования ввода необходимой ширины. – sharptooth

+0

Да, это именно то, что делает код OP, используя PBKDF2. – erickson

0

Код, который вы показываете, не генерирует случайный ключ. Сгенерированный ключ является функцией пароля и будет одинаковым при каждом использовании данного пароля.

В этом случае пользователю следует попросить ввести password. Этот пароль используется как семя для алгоритма, который детерминированно создает строку байтов, которая может использоваться в качестве криптографического ключа.

Для каждой операции должно быть выбрано случайным образом: вектор инициализации, используемый для шифров в режиме CBC. Это создает различные зашифрованные тексты, даже если один и тот же ключ используется для шифрования одного и того же открытого текста.