我試圖使用DESede算法在Java中加密和解密圖像。 我的做法是通過從BufferedImage中獲取像素字節並對它們進行加密,然後從加密字節中設置WriteableRaster的數據元素,最後將其保存到文件中。使用解密字節時的相同方法,我得到錯誤,因爲當我設置柵格的數據元素時,加密的圖像仍然與第一個普通圖像具有相同的大小/高度。 這是我的代碼:在Java中使用TripleDES加密/解密圖像
public byte[] encrypt(byte[] plainByte) {
byte[] encryptedByte = null;
try {
cipher.init(Cipher.ENCRYPT_MODE, key);
encryptedByte = cipher.doFinal(plainByte);
} catch (InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
System.err.println(e);
JOptionPane.showMessageDialog(null, e.getMessage());
}
return encryptedByte;
}
代碼解密字節:
public byte[] decrypt(byte[] encryptedByte) {
byte[] decryptedByte = null;
try {
cipher.init(Cipher.DECRYPT_MODE, key);
decryptedByte = cipher.doFinal(encryptedByte);
} catch (InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
System.err.println(e);
JOptionPane.showMessageDialog(null, e.getMessage());
}
return decryptedByte;
}
,這是我在處理影像實現:
String password = "12345";//will be hashed with MD5
triDes.setPassword(password);
//proses enkripsi
BufferedImage image = ImageIO.read(new File("tes.jpg"));
byte[] pixels = (byte[]) image.getRaster().getDataElements(0, 0, image.getWidth(), image.getHeight(), null);
byte[] encrypt = triDes.encrypt(pixels);
System.out.println(encrypt.length + " - " + pixels.length);
WritableRaster raster = Raster.createBandedRaster(DataBuffer.TYPE_BYTE, image.getWidth(), image.getHeight(), 3, new Point(0, 0));
raster.setDataElements(0, 0, image.getWidth(), image.getHeight(), encrypt);
image.setData(raster);
File outputfile = new File("enkripsi.jpg");
ImageIO.write(image, "jpg", outputfile);
//proses dekripsi
image = ImageIO.read(new File("enkripsi.jpg"));
pixels = (byte[]) image.getRaster().getDataElements(0, 0, image.getWidth(), image.getHeight(), null);
System.out.println(pixels.length);
byte[] decrypt = triDes.decrypt(pixels);
raster = Raster.createBandedRaster(DataBuffer.TYPE_BYTE, image.getWidth(), image.getHeight(), 3, new Point(0, 0));
raster.setDataElements(0, 0, image.getWidth(), image.getHeight(), decrypt);
image.setData(raster);
outputfile = new File("dekripsi.jpg");
ImageIO.write(image, "jpg", outputfile);
我爲我的英語不好對不起。在我的代碼中,普通像素字節長度和加密字節長度不是相同的大小。當我讀取加密圖像的字節與普通字節的長度相同時。 我懷疑在保存過程中的錯誤,也許加密的字節在緩存圖像保存時被修剪。如果我的假設是正確的,如何setDataElements的WritableRaster沒有指定witdth和圖像的高度?
你的問題不清楚。你擔心,因爲圖像尺寸沒有與柵格一起加密?你已經非常麻煩地加密*只*像素;如果要加密所有內容,只需加密整個文件(不使用圖像API)。 – erickson
我很抱歉我的英文不好。在我的代碼中,普通像素字節長度和加密字節長度不是相同的大小。當我讀取加密圖像的字節與普通字節的長度相同時。 我懷疑在保存過程中的錯誤,也許加密的字節在保存BufferedImage時被修剪。 –
@PutraArdiansyah哪個錯誤? – Kayaman