Слишком короткий пароль с использованием AES/CFB/NoPadding, AES/OFB/NoPadding или AES/ CBC/NoPadding

#java #encryption

Вопрос:

Может ли кто-нибудь помочь мне усилить или улучшить следующий код, чтобы сделать полученные пароли «длиннее».

Я смиренно ищу лучший способ использовать AES/CFB/NoPadding, или с AES/CBC/NoPadding, или с AES/OFB/NoPadding. Мы протестировали с помощью AES/GCM/NOPADDING. Который работает с Java 8, но не с Java 7. И нам нужно что-то, что работает в Java 7

Например, используя «безопасный» как lt;key_to_encryptgt; и «lt;key_to_encryptgt;Bk206V4ytQ1zZAukPE6/2c5KUcxGYpBf «как lt;ключ шифрованияgt;, pwd выглядит так: lt;ключ шифрованияgt;FX5O5A== что довольно «мало»

 import java.security.MessageDigest;  import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec;  import org.apache.xml.security.utils.Base64;  public class StringEncrypt {   private final static String ALG = "AES";  private final static String CI = "AES/CFB/NoPadding";   public static String encrypt(String cleartext, String key) throws Exception {   MessageDigest md = MessageDigest.getInstance("MD5");  md.update(key.getBytes());  IvParameterSpec iv = new IvParameterSpec(md.digest());    Cipher cipher = Cipher.getInstance(CI);  SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), ALG);  cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);  byte[] encrypted = cipher.doFinal(cleartext.getBytes());    return new String(Base64.encode(encrypted));  }   public static String decrypt(String encrypted, String key) throws Exception {  MessageDigest md = MessageDigest.getInstance("MD5");  md.update(key.getBytes());  IvParameterSpec iv = new IvParameterSpec(md.digest());   Cipher cipher = Cipher.getInstance(CI);  SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), ALG);  byte[] enc = Base64.decode(encrypted);  cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);  byte[] decrypted = cipher.doFinal(enc);    return new String(decrypted);  }   public static void main(String[] args) throws Exception {  if (args.length == 2) {  String pwd = StringEncrypt.encrypt(args[0], args[1]);  System.out.println("Key encryption: "   pwd);  pwd = StringEncrypt.decrypt(pwd, args[1]);  if (args[0].equals(pwd)) {  System.out.println("[OK] Correct decryption!");  } else {  System.out.println("[KO] Wrong decryption!");  }  } else {  System.out.println("The parameters are required: lt;key_to_encryptgt; lt;encryption_keygt;");  }  }  }  

Иными словами, может ли кто-нибудь привести мне пример хорошего шифрования / дешифрования, который работает в Java 7?

Комментарии:

1. CFB-это режим потокового шифрования, т. е. размер зашифрованного текста равен размеру открытого текста (кодировка Base64 увеличивает размер примерно на 33%). Вся реализация, по-видимому, представляет собой своего рода вывод ключа на основе пароля. Для этого существуют специальные алгоритмы, например PBKDF2.

2. Это не так уж и мало: в любом случае это длиннее, чем «безопасно».

3. «безопасный» — это короткий и небезопасный пароль, как бы вы его искусственно ни выращивали. В чем именно заключается проблема, которую вы хотите решить?

4. Но в чем же проблема? Не существует такой вещи, как «хорошее шифрование». Просто потому, что вы используете шифрование, ваше программное обеспечение не становится более безопасным. Все зависит от контекста. Пожалуйста, предоставьте полное описание того, что вы пытаетесь решить.

5. Если вы пытаетесь скрыть размер сообщения с открытым текстом (т. Е. Размер вашего пароля), вам следует заполнить открытый текст перед выполнением шифрования . Например, вы можете добавить ноль байт до 64 байт, а затем зашифровать его. Этот вопрос требует шифрования копирования / вставки, но, к сожалению, безопасности копирования / вставки не существует.

Ответ №1:

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

 byte[] encrypted = cipher.doFinal(cleartext.getBytes(StandardCharsets.UTF_16));   return new String(decrypted, StandardCharsets.UTF_16);  

Комментарии:

1. Спасибо и извини … Я, наконец, меняю на «AES/CBC/PKCS5Padding»

2. Режим @JLLMNCHR GCM не поддерживается в Java7 (см. Поддерживаемые параметры в шифре javadoc). Использовать IV так же, как ключ, все равно что выстрелить себе в ногу, вы можете полностью взломать шифрование с помощью некоторых режимов. Для CBC требуется случайный IV (вы можете добавить IV, чтобы передать его по зашифрованному тексту)

3. Вопрос к вам, Нарцисс: в каком состоянии могут быть байты decrypted ?