2013-01-17 44 views
1

這裏是我的簡單的圖像加密類,其中我:無法解密和讀取加密圖像文件

  1. 讀一個圖像從一個地方到字節
  2. 加密這些字節
  3. 再次創建圖像從這些加密的字節

代碼:

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等)加密,它工作正常(當然在這種情況下,我使用不同的流類進行字節轉換),但我無法理解爲什麼它在這裏搞亂?

回答

2

加密數據後,它不再是有效的圖像文件。試圖在加密數據上使用ImageIO就像打開加密記事本中文本文件的結果,並希望看到文本。

要獲取Image,您需要先解密數據,然後再請ImageIO來讀取它。

你很難完全清楚你的convertByteArrayToImage方法的真正目的 - 如果目標只是將字節寫入文件,爲什麼要通過Image呢?爲什麼不直接將字節轉儲到磁盤?他們已經圖像的加密表示 - 沒有必要再嘗試將它們解釋爲圖像。如果您想要應用某種圖像轉換(例如,即使輸入是PNG,總是寫出一個JPEG,),那麼應該在未加密的數據上完成該操作。

(同樣地,對convertImageToByteArray,因爲你開始與磁盤上的文件,有一個在裝載,作爲一個圖像,除非你想要執行的特定影像變換沒有意義的。)

副作用注意事項:

  • 不要使用String.getBytes()超載不接受一個字符集 - 它將使用平臺默認的編碼,這意味着它不是跨平臺移植
  • 你將加密的數據T base64也是如此,但是忽略了結果。爲什麼?
+0

base64行只是錯誤地打印 – Despicable

+0

'爲什麼不把字節直接轉儲到磁盤?'我傾倒他們的形式image.Please清楚你想說什麼?我沒有得到它 – Despicable

+1

@despicable:當它到達磁盤時,*它只是字節*。它不像文件「知道」它是一個圖像,只是因爲它是由'ImageIO'編寫的。換句話說:加密不關心數據的性質。您可以在不知道數據通常如何解釋的情況下加密文件:加載字節,加密它們,保存結果。這裏根本不需要'ImageIO'。 –