我编写了一个加密给定jar文件的程序。很直接。现在我正在编写第二个程序,通过强制它来解密文件。 (它们都是独立的)
在加密给定文件后,我最终得到一个包含加密文件数据的byte []。我将这个byte []转换为String并将其输出到控制台,这样我就可以轻松地复制和粘贴数据。
然后我在'decrypter'中初始化一个新的String并粘贴加密文件的这些数据。对于小文件,这是有效的,但对于较大的文件,由于字符串文字大小限制,它不起作用。如何将这些数据硬编码到解密器中?
快速伪代码
加密器:
public byte[] encrypt(){
}
String encryptedData = Arrays.toString(encrypt(data));
Decrypter的:
String encryptedData = "[-3, -66, -89, -14, 5, -72, 12, 5, ........
// note that I actually copy paste - hardcode the string
decrypt(stringToByteArray(encryptedData));
我无法使用临时文件在两个程序之间进行读/写。
答案 0 :(得分:2)
分解编码文本并将这些部分放在一起:
String encryptedData =" blahblahblah" +" moreblahblah" +" etcetera";
将加密数据写入文本文件并使用f.e从那里读取。 BufferedWriter / FileWriter和BufferedReader / FileReader。
答案 1 :(得分:2)
不要使用数组的toString
形式来序列化数据。
最佳解决方案是将其写入文件,然后从文件中读取。使用Files
实用程序类可以非常轻松地完成此操作。
写:
final byte[] encrypted = ...
final Path output = Paths.get(".", "encrypted.bin");
Files.write(output, encrypted);
再读一遍:
final Path input = Paths.get(".", "encrypted.bin");
final byte[] encrypted = Files.readAllBytes(input);
要解决您的直接问题,您可以Base64对二进制数据进行编码。这将大大减少String
表示的大小。您可以使用JDK中提供的Base64
类。
编码:
final byte[] encrypted = ...
final Base64.Encoder encoder = Base64.getEncoder();
System.out.println(encoder.encodeToString(encrypted));
解码:
final String encoded = ...
final Base64.Decoder decoder = Base64.getDecoder();
final byte[] encrypted = decoder.decode(encoded);
答案 2 :(得分:1)
也许您应该使用InputStream而不是将字符串文字硬编码到您的类中?
答案 3 :(得分:0)
我建议使用文件进行临时存储,但如果您确实需要将数据转换为不会被字符编码损坏的字符串,那么最好的选择是 Base64 。
您可以使用javax.xml.bind.DatatypeConverter将字节数组转换为字符串,反之亦然(请参阅parseBase64Binary和printBase64Binary)。