Так что недавно я начал работать с шифрованием. У меня есть функционирующий асимметричный класс шифрования, но мне также нужен симметричный класс ключей. Хотя большинство аспектов класса симметричных ключей работают, загрузка ключа из его закодированных байтов не выполняется. Ниже приведен симметричный класс ключей. Я отметил два конструктора, которые не работают.Java Encryption: Загрузка симметричного ключа из файла
public class PlasmaSymmetricEncrypter {
public static String DESEDE_ALGORITHM = "DESede";
public static String AES_ALGORITHM = "AES";
private Key key;
private String algorithm;
public PlasmaSymmetricEncrypter(Key key) {
this.key = key;
this.algorithm = key.getAlgorithm();
}
public PlasmaSymmetricEncrypter(File keyFile, String algorithm) throws IOException, NoSuchAlgorithmException { //This constructor is not working
this.algorithm = algorithm;
if(!keyFile.exists()) {
this.genKey(keyFile);
}
Key key = new SecretKeySpec(Files.readAllBytes(keyFile.toPath()), algorithm);
this.key = key;
}
public PlasmaSymmetricEncrypter(byte[] key, String algorithm) { //This constructor is not working
this(new SecretKeySpec(key, algorithm));
}
private void genKey(File file) throws NoSuchAlgorithmException, IOException {
KeyGenerator generator = KeyGenerator.getInstance(this.algorithm);
this.key = generator.generateKey();
file.delete();
if(file.getParentFile() != null) {
file.getParentFile().mkdirs();
}
file.createNewFile();
FileOutputStream stream = new FileOutputStream(file);
stream.write(this.getEncodedKey());
stream.close();
}
public byte[] getEncodedKey() {
return this.key.getEncoded();
}
public byte[] encrypt(byte[] bytes) throws BadPaddingException, IllegalBlockSizeException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
Cipher cipher = Cipher.getInstance(this.algorithm);
cipher.init(Cipher.ENCRYPT_MODE, this.key);
return cipher.doFinal(bytes);
}
public byte[] encrypt(String text) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
return this.encrypt(text.getBytes(StandardCharsets.UTF_8));
}
public String decrypt(byte[] bytes) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
Cipher cipher = Cipher.getInstance(this.algorithm);
cipher.init(Cipher.DECRYPT_MODE, this.key);
return new String(cipher.doFinal(bytes), StandardCharsets.UTF_8);
}
public String decrypt(String bytes) throws IllegalBlockSizeException, InvalidKeyException, BadPaddingException, NoSuchAlgorithmException, NoSuchPaddingException {
return this.decrypt(bytes.getBytes(StandardCharsets.ISO_8859_1));
}
public String encryptToString(String text) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
return new String(this.encrypt(text), StandardCharsets.ISO_8859_1);
}
}
Запуск с помощью следующего кода тест производит java.security.InvalidKeyException
:
PlasmaAsymmetricEncrypter asymmetricEncrypter = new PlasmaAsymmetricEncrypter(new File("private.key"), new File("public.key"), PlasmaAsymmetricEncrypter.RSA_ALGORITHM);
PlasmaSymmetricEncrypter symmetricEncrypter = new PlasmaSymmetricEncrypter(new File("secret.key"), PlasmaSymmetricEncrypter.AES_ALGORITHM);
String encrypt = "hello world";
byte[] encryptedKey = asymmetricEncrypter.encryptPrivate(symmetricEncrypter.getEncodedKey());
PlasmaSymmetricEncrypter encrypter = new PlasmaSymmetricEncrypter(asymmetricEncrypter.decryptPublic(encryptedKey), PlasmaAsymmetricEncrypter.RSA_ALGORITHM);
System.out.println(encrypter.decrypt(symmetricEncrypter.encrypt(encrypt)));
Исключение:
Exception in thread "main" java.security.InvalidKeyException: No installed provider supports this key: javax.crypto.spec.SecretKeySpec
at javax.crypto.Cipher.chooseProvider(Cipher.java:893)
at javax.crypto.Cipher.init(Cipher.java:1249)
at javax.crypto.Cipher.init(Cipher.java:1186)
at com.gmail.socraticphoenix.plasma.file.encryption.PlasmaSymmetricEncrypter.decrypt(PlasmaSymmetricEncrypter.java:96)
at com.gmail.socraticphoenix.plasma.Test.main(Test.java:38)
Испытание 38 является System.out.println
вызова и PlasmaSymmetricEncrypter 96 here
Весь мой код находится на github
Редакции для ясности: 1. Прошу игнорировать методы шифрования в строках, они будут заменены кодировкой base64 после устранения этой проблемы. 2. Ошибка не возникает в самом конструкторе, она возникает только при попытке получить шифр для восстановленного ключа.
Строка не является контейнером для двоичных данных. Избавьтесь от методов, возвращающих зашифрованный текст как String или возвращающего открытый текст из параметра String. – EJP
Да, я знаю, они были предназначены только для тестирования. –
Невозможно воспроизвести. Конструктор, который вы называете, работает для меня с обоими алгоритмами. Попробуйте удалить файл симметричных ключей, это может быть нежелательным, оставшимся из некоторого ранее нерабочего состояния. – EJP