2016-11-23 16 views
0

У меня возникают проблемы с ключами AES в JavaAES пользовательский ключ вместо 16, 24 или 32 байт

Это мой код:

public Core(String key) { 
    try { 
     this.SecretKey = key; 
     this.ivspec = new IvParameterSpec(this.iv.getBytes()); 
     this.keyspec = new SecretKeySpec(SecretKey.getBytes("UTF-8"), "AES"); 
     try { 
      this.cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
} 

Всякий раз, когда я прохожу «ключ» Строка, которая содержит для пример Pizza, он просто порождает ошибки. Когда я передаю, например, строку, содержащую ровно 16 байтов, она работает. Я хотел бы использовать AES, но мне не хотелось бы ограничиваться только 16, 24 или 32 байтами. Как я могу это исправить.

+1

Меня попросил криптовалют SME: «Почему вы хотите использовать нестандартные размеры ключа? – zaph

ответ

4

Для AES с различными размерами ключей (и разных размеров блоков) посмотрите на Rijndael. Однако, учитывая ваше использование «Пиццы» в качестве ключа, использование Rijndael, вероятно, слишком продвинуто для вас. Вместо этого используйте Key Derivation Function (KDF), чтобы превратить ваш пароль («Пицца») в криптографический ключ. Посмотрите на PBKDF2, если вы не знаете, что использовать KDF.

Я бы также рекомендовал использовать парольную фразу вместо пароля в качестве входного сигнала для вашего KDF: «Мне нравится« Хэм »и« Ананасовая пицца ».

ETA: Предпочитайте дополнение PKCS7 к NoPadding. Таким образом, вы получите больше ошибок в своем коде, если заполнение не соответствует.

+0

[Здесь] (http://android-developers.blogspot.de/2013/02/using-cryptography- to-store-credentials.html) - это ссылка, которая содержит код, специфичный для Android. –

+0

Заполнение не должно использоваться для «улавливания ошибок», на самом деле сообщения об ошибках заполнения вызывающей стороне - это ошибка безопасности, которая допускает атаку оскорбления дополнений. – zaph

+0

AES имеет один размер блока: 128 бит и три ключевых размера: 128, 192 и 256 бит. Любые другие значения Rijndael не AES. – zaph