這裏是我的簡單的圖像加密類,其中我:無法解密和讀取加密圖像文件
- 讀一個圖像從一個地方到字節
- 加密這些字節
- 再次創建圖像從這些加密的字節
代碼:
public class ImageEncrypt {
Cipher cipher;
public static byte[] convertImageToByteArray(String sourcePath) {
byte[] imageInByte = null;
try{
BufferedImage originalImage = ImageIO.read(new File(
sourcePath));
// convert BufferedImage to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(originalImage, "jpg", baos);
baos.flush();
imageInByte = baos.toByteArray();
baos.close();
}catch(Exception e){
e.printStackTrace();
}
return imageInByte;
}
public static void convertByteArrayToImage(byte[] b , String path) {
try{
InputStream in = new ByteArrayInputStream(b);
BufferedImage bImageFromConvert = ImageIO.read(in);
ImageIO.write(bImageFromConvert, "jpg", new File(
path));
}catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String args []){
final String strPassword = "password12345678";
SecretKeySpec initVector = new SecretKeySpec(strPassword.getBytes(), "AES");
AlgorithmParameterSpec paramSpec = new IvParameterSpec(strPassword.getBytes());
try{
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, initVector, paramSpec);
byte[] ecrypted = cipher.doFinal(convertImageToByteArray("C:/Users/user/Desktop/a.jpg"));
convertByteArrayToImage(ecrypted,"C:/Users/user/user/enc.jpg");
System.out.println("converted to encrypted file .... ");
}catch(Exception e){
e.printStackTrace();
}
}
現在,當我嘗試從加密字節創建映像時,我在第三步中遇到了問題。它會拋出一個例外如下:
java.lang.IllegalArgumentException: image == null!
at javax.imageio.ImageTypeSpecifier.createFromRenderedImage(ImageTypeSpecifier.java:925)
at javax.imageio.ImageIO.getWriter(ImageIO.java:1591)
at javax.imageio.ImageIO.write(ImageIO.java:1520)
at ImageEncrypt.convertByteArrayToImage(ImageEncrypt.java:55)
at ImageEncrypt.main(ImageEncrypt.java:83)
我不知道我要去哪裏錯了?我正在做相同的轉換文件(文檔,PDF等)加密,它工作正常(當然在這種情況下,我使用不同的流類進行字節轉換),但我無法理解爲什麼它在這裏搞亂?
base64行只是錯誤地打印 – Despicable
'爲什麼不把字節直接轉儲到磁盤?'我傾倒他們的形式image.Please清楚你想說什麼?我沒有得到它 – Despicable
@despicable:當它到達磁盤時,*它只是字節*。它不像文件「知道」它是一個圖像,只是因爲它是由'ImageIO'編寫的。換句話說:加密不關心數據的性質。您可以在不知道數據通常如何解釋的情況下加密文件:加載字節,加密它們,保存結果。這裏根本不需要'ImageIO'。 –