Добро пожаловать в шифрование! Как уже упоминалось, DES является симметричным и требует того же ключа для шифрования, что и для дешифрования. Этот ключ должен быть правильным количеством битов для шифра, который вы используете. Для DES это 56 бит. Прежде чем вы зайдете слишком далеко с этим, вот несколько вещей, которые вы могли бы рассмотреть:
- Вы должны использовать более строгий стандарт шифрования, такой как AES . Теперь можно нарушить шифрование DES .
- Если вы хотите использовать строку в качестве ключа, тогда вам следует использовать сильную хеш-функцию, такую как SHA-256 против этой строки ключа. Затем возьмите столько битов из этого вывода хеша, сколько вам нужно для ключа шифрования, 128-бит достаточно для AES. Строка ключа должна быть такой же длинной, как у вас.
- Лучше всего использовать режим блочного шифра, который не генерирует один и тот же выход каждый раз для одного и того же ввода. См. режимы работы блочного шифра для получения информации и визуализации причин, по которым режим ECB плох.
Вот рабочий пример использования 128-битного шифрования AES в режиме CBC с заполнением PKCS # 5:
import java.security.MessageDigest;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class EncryptDecrypt {
public static void main(String[] args) throws Exception {
// here are your inputs
String keyString = "averylongtext!@$@#$#@$#*&(*&}{23432432432dsfsdf";
String input = "john doe";
// setup AES cipher in CBC mode with PKCS #5 padding
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// setup an IV (initialization vector) that should be
// randomly generated for each input that's encrypted
byte[] iv = new byte[cipher.getBlockSize()];
new SecureRandom().nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
// hash keyString with SHA-256 and crop the output to 128-bit for key
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(keyString.getBytes());
byte[] key = new byte[16];
System.arraycopy(digest.digest(), 0, key, 0, key.length);
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
// encrypt
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
byte[] encrypted = cipher.doFinal(input.getBytes("UTF-8"));
System.out.println("encrypted: " + new String(encrypted));
// include the IV with the encrypted bytes for transport, you'll
// need the same IV when decrypting (it's safe to send unencrypted)
// decrypt
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("decrypted: " + new String(decrypted, "UTF-8"));
}
}