我已经查看了有关此主题的几篇帖子,例如this帖子以实际加密/解密,以及this发布关于使用字符串作为种子生成密钥以生成随机密钥。加密将我的文件大小从3mb减少到16字节,解密将其进一步减少到0字节。我还看了this YouTube video这个话题,我的代码也有同样的问题,在解密过程中文件大小减少到零,而他的工作正常。
这是我的函数,它根据传递为k
的SHA256哈希生成密钥:
public static Key keyGen(String k) throws Exception {
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");
KeySpec spec = new PBEKeySpec(k.toCharArray(), k.getBytes(), 12, 128);
SecretKey tmp = factory.generateSecret(spec);
return new SecretKeySpec(tmp.getEncoded(), "AES");
}
这些是我用来加密和解密的功能:
public static void encrypt(Key key, byte[] content) throws Exception {
Cipher cipher;
byte[] encrypted = null;
try {
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
encrypted = cipher.doFinal(content);
} catch (Exception e) {
e.printStackTrace();
}
saveFile(encrypted);
JOptionPane.showMessageDialog(null, "Encryption complete");
}
public static void decrypt(Key key, byte[] textCryp) throws Exception {
Cipher cipher;
byte[] decrypted = null;
try {
cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
decrypted = cipher.doFinal(textCryp);
} catch (Exception e) {
e.printStackTrace();
}
saveFile(decrypted);
JOptionPane.showMessageDialog(null, "Decryption complete");
}
我用来将内容写回文件的功能:
public static void saveFile(byte[] bytes) throws IOException {
FileOutputStream fos = new FileOutputStream("filepath/test.jpg");
fos.write(bytes);
fos.close();
}
最后,获取图像文件的字节表示的函数,传递到加密/解密函数作为"内容":
public static byte[] getFile() {
File f = new File("filepath/test.jpg");
InputStream is = null;
try {
is = new FileInputStream(f);
} catch (FileNotFoundException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
byte[] content = null;
try {
content = new byte[is.available()];
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
is.read(content);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}
调用这些函数的主函数:
public static void main(String[] args) throws Exception {
Key key = keyGen("1234567812345678");
byte[] fileContents = getFile();
//I change to decrypt after I call encrypt
encrypt(key,fileContents);
}
没有抛出任何错误或异常,我在编写此代码时引用的帖子和视频似乎工作正常。
我真的很感激这方面的建议,因为这是我长期以来一直在努力的项目的最后一部分。
答案 0 :(得分:0)
经过多次试验,我意识到我试图运行代码的测试文件是在云端驱动器中。我将文件复制到本地目录,重新编写代码并完美运行。