在我的项目中,选择了一个文本文件并加密。加密文本与密钥一起保存。现在我尝试创建一个程序,在正确的密钥文件可用时解密文件。我认为解密程序看起来很像DECRYPT_MODE
中的加密程序。当我读入密钥时,我不知道如何进行下一步来解密文本文件。也许任何人都可以帮助我如何使用.txt文件中的密钥并使用它来解密编码文件。
加密程序:
public class encrypt {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
//Key is created and saved in File
KeyGenerator keygenerator = KeyGenerator.getInstance("AES");
SecretKey myDesKey = keygenerator.generateKey();
String encodedKey = Base64.getEncoder().encodeToString(myDesKey.getEncoded());
Path keypath = Paths.get("C:/xxx/key.txt");
Path keyfile = Files.createFile(keypath);
Files.write(keyfile, encodedKey.getBytes(), StandardOpenOption.WRITE);
Cipher desalgCipher;
desalgCipher = Cipher.getInstance("AES");
desalgCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
Path target = Paths.get("C:/xxx/encrypted.txt");
Path file = Files.createFile(target);
Path path = Paths.get("test.txt");
try(InputStream is = Files.newInputStream(path);
CipherInputStream cipherIS = new CipherInputStream(is, desalgCipher);
BufferedReader reader = new BufferedReader(new InputStreamReader(cipherIS));){
String line;
while((line = reader.readLine()) != null){
System.out.println(line);
Files.write(file, line.getBytes(), StandardOpenOption.WRITE);
}
}
}
}
解密:读入密钥并解密
public class decrypt {
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IOException {
try {
File fileDir = new File("C:/Users/JT/Desktop/key.txt");
BufferedReader in = new BufferedReader(
new InputStreamReader(new FileInputStream(fileDir), "UTF-8"));
String str;
while ((str = in.readLine()) != null) {
System.out.println(str);
}
in.close();
}
catch (UnsupportedEncodingException e)
{
System.out.println(e.getMessage());
}
catch (IOException e)
{
System.out.println(e.getMessage());
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
byte[] decodedKey = Base64.getDecoder().decode(sb.toString());
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
SecretKeySpec key = new SecretKeySpec(sb.toString().getBytes(), "Base64");
Cipher desalgCipher;
desalgCipher = Cipher.getInstance("AES");
desalgCipher.init(Cipher.DECRYPT_MODE, key);
Path path = Paths.get("encrypted.txt"); // path to your file
try(InputStream is = Files.newInputStream(path); // get an IS on your file
CipherInputStream cipherIS = new CipherInputStream(is, desalgCipher); // wraps stream using cipher
BufferedReader reader = new BufferedReader(new InputStreamReader(cipherIS));){ // init reader.
String line;
while((line = reader.readLine()) != null){
System.out.println(line);
}
}
}
}
答案 0 :(得分:1)
您的应用程序没有以正确的方式编程。目前,您尝试通过使用CipherInputStream
实例包装输入流来加密。然后,此实例再次包含BufferedReader
实例。
所以你要做的是首先将输入文件的字节(可能是文本)转换为密文。该密文可以包含任何字节值。然后尝试使用默认字符集和行结尾逐行读取那些字节。很明显,在加密之后,即使行的概念也不再存在,因此您将在最后一步中丢失数据。
然后你转换回字节,然后你以某种方式尝试解密。当您在readLine
语句中丢失数据时,这显然会失败。
您应该做的是使用字节读取文件。然后,您可以写入CipherOutputStream
。如果带有密文的文件需要是实际文本,您可以使用新Base64
很好地提供的java.util.Base64
流。
只有在正确编程加密后,您才可以尝试反转该过程。只要数据丢失,解密就会失败(错误或垃圾输出,具体取决于模式和运气)。
如果你不走运,你最终会得到99%的时间都能运行的代码。祝你好运并注意评论:不要在不理解你正在做什么的情况下尝试加密。 将以泪水结束 - 或者是一个破碎的键盘。