Java文件加密

我正在尝试使用AES算法编写一个简单的程序来加密和解密文件。 我没有加密问题,但解密..

public static void main(String[] args) throws NoSuchAlgorithmException, FileNotFoundException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException { // Инициализация секретных ключей KeyGenerator keyGenS = KeyGenerator.getInstance("AES"); keyGenS.init(128); SecretKey sKey1 = keyGenS.generateKey(); SecretKey sKey2 = keyGenS.generateKey(); // Перевод секретных ключей в строку и запись в файл String key1 = SecretKeyToString(sKey1); String key2 = SecretKeyToString(sKey2); spreader.write(fileName1, key1); spreader.write(fileName2, key2); spreader.write(fileNameS1, key1); spreader.write(fileNameS2, key2); // Чтение секретных ключей из файла и перевод обратно в тип SecretKey key1 = spreader.read(fileName1); System.out.println("Секретный ключ 1го пользователя: " +key1); SecretKey seansKey1=getKeyInstance(key1); key2 = spreader.read(fileName2); System.out.println("Секретный ключ 2го пользователя: " +key2); SecretKey seansKey2=getKeyInstance(key2); //инициализация и зашифрование сеансового ключа с помощью секретных Cipher aesCipher = Cipher.getInstance("AES"); aesCipher.init(Cipher.ENCRYPT_MODE,seansKey1); KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); SecretKey secretKey = keyGen.generateKey(); String stringsecretKey = SecretKeyToString(secretKey); byte[] byteKey = stringsecretKey.getBytes(); byte[] byteCipherKey1 = aesCipher.doFinal(byteKey); String encryptedKey = new BASE64Encoder().encode(byteCipherKey1); System.out.println("Зашифрованный сеансовый ключ с помощью секретного ключа 1: " +encryptedKey); aesCipher = Cipher.getInstance("AES"); aesCipher.init(Cipher.ENCRYPT_MODE,SeansKey2); byteKey = etringsecretKey.getBytes(); byte[] byteCipherKey2 = aesCipher.doFinal(byteKey); encryptedKey = new BASE64Encoder().encode(byteCipherKey2); System.out.println("Зашифрованный сеансовый ключ с помощью секретного ключа 2: " +encryptedKey); spreader.write(fileNameEK2, encryptedKey); //Чтение данных из файла String text =spreader.read(fileName); System.out.println(text); // Зашифрование данных aesCipher.init(Cipher.ENCRYPT_MODE,secretKey); // константная переменная byte[] byteText = text.getBytes(); byte[] byteCipherText = aesCipher.doFinal(byteText); encryptedText = new BASE64Encoder().encode(byteCipherText); System.out.println("Зашифрованный текст: " +encryptedText); spreader.write(fileNameOK, encryptedText); } 

这是解密部分:

 public static void main(String[] args) throws NoSuchAlgorithmException, FileNotFoundException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException, UnsupportedEncodingException { String encryptedText = user.read(fileNameOK); String key1 = user.read(fileName1); String key2 = user.read(fileName2); String encryptedSeanceKey1 = user.read(fileNameEK1); String encryptedSeanceKey2 = user.read(fileNameEK2); SecretKey secretKey1=getKeyInstance(key1); SecretKey secretKey2=getKeyInstance(key2); Cipher aesCipher = Cipher.getInstance("AES"); aesCipher.init(Cipher.DECRYPT_MODE,secretKey1,aesCipher.getParameters()); //byte[] byteKey = encryptedSeanceKey1.getBytes(); byte[] byteDecryptedKey = aesCipher.doFinal(encryptedSeanceKey1.getBytes()); String decryptedKey1 = new String(byteDecryptedKey); System.out.println("Расшифрованный сеансовый ключ с помощью секретного ключа 1: " +decryptedKey1); aesCipher.init(Cipher.DECRYPT_MODE,secretKey2,aesCipher.getParameters()); byte[] byteKey2 = encryptedSeanceKey2.getBytes(); byteDecryptedKey = aesCipher.doFinal(byteKey2); String decryptedKey2 = new String(byteDecryptedKey); System.out.println("Расшифрованный сеансовый ключ с помощью секретного ключа 2: " +decryptedKey2); // Расшифрование данных aesCipher.init(Cipher.DECRYPT_MODE,getKeyInstance(decryptedKey1),aesCipher.getParameters()); byte[] byteText = encryptedText.getBytes(); byte[] byteDecryptedText = aesCipher.doFinal(byteText); decryptedText = new String(byteDecryptedText); System.out.println(" Расшифрованный текст " +decryptedText); } 

}

现在的问题是解密部分是:当用填充密码解密时,输入长度必须是16的倍数

我知道我错误地保留会话密钥和字节的错误会丢失。 但我怎么能正确地做到这一点?

您的代码中存在一些混淆,可能是因为您调用的某些方法丢失了,或者可能是因为您使用密钥加密…您的密钥(!!!)
让我们尝试加密和解密简单的方法,删除代码中不需要的所有内容(比如编码密钥并将其保存到文件中,然后在不解码的情况下恢复密钥等等)。

让我们看一下基于您的以下简化代码:

  KeyGenerator keyGenS = KeyGenerator.getInstance("AES"); keyGenS.init(128); SecretKey sKey1 = keyGenS.generateKey(); Cipher aesCipher = Cipher.getInstance("AES"); aesCipher.init(Cipher.ENCRYPT_MODE,sKey1); byte[] byteText = "Insert here whatever you want to crypt".getBytes(); byte[] byteCipherText = aesCipher.doFinal(byteText); 

我们使用KeyGenerator生成了密钥,然后使用该密钥初始化了Cipher实例。 此时我们只需调用doFinal()传递我们想要加密的plainText。
这就是加密部分的全部内容。 当然,如果需要,您可以将密钥和byteCipherText保存到文件中,但所有其他人员(至少)都是无用的。

解密部分很容易作为加密。 逻辑是一样的。 如果您将密钥保存在文件中,只需将其读入byte[] ,然后使用它来初始化密码实例。 像这样的东西:

  aesCipher.init(Cipher.DECRYPT_MODE, sKey1); byte[] plainText = aesCipher.doFinal(byteCipherText); 

如果将上述所有代码放入main()并运行它,则应该在plainText使用与plainText相同的文本。
你可以用一个validation它

  System.out.println(new String(plainText)); 

尝试从这里开始,然后添加您可能需要的所有其他东西。
希望这可以帮助。
问候