1

これが私の単純な画像暗号化クラスです。

  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();
    }
  }

暗号化されたバイトからイメージを作成しようとすると、ステップ 3 で問題が発生します。以下に示す例外をスローします。

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など)を暗号化するために同じことを行っていますが、正常に動作します(もちろん、その場合、バイト変換に異なるストリームクラスを使用しています)が、なぜここで混乱しているのか理解できません?

4

1 に答える 1

2

データを暗号化すると、有効な画像ファイルではなくなります。暗号化されたデータに対して使用しようとすることImageIOは、メモ帳でテキスト ファイルを暗号化した結果を開いて、テキストが表示されることを期待するようなものです。

を取得するImageには、データの読み取りを要求する前にデータを復号化する必要がありますImageIO

メソッドが実際に何をするつもりなのかはまったく明確ではありconvertByteArrayToImageません.バイトをファイルに書き込むことだけが目的である場合、なぜ経由Imageするのでしょうか? バイトを直接ディスクにダンプしないのはなぜですか? それらはすでに画像の暗号化された表現です - それらを再度画像として解釈しようとする必要はありません。ある種の画像変換を適用する場合 (たとえば、入力が PNG であっても常にJPEG を書き出すなど)、暗号化されていないデータに対して行う必要があります。

(同様にconvertImageToByteArray、ディスク上のファイルから開始することを考えると、イメージ固有の変換を実行したい場合を除き、それをイメージとしてロードしても意味がありません。)

補足:

  • 文字セットを取らないオーバーロードは使用しないでくださいString.getBytes()。プラットフォームのデフォルトのエンコーディングが使用されます。つまり、プラットフォーム間で移植できません。
  • 暗号化されたデータも base64 に変換していますが、結果は無視されています。なんで?
于 2013-01-17T07:39:36.863 に答える