Java实现文件的加密与解密(2)

File srcFile = new File("桌面.jpg"); //初始文件
        File encFile = new File("encFile.tif"); //加密文件
        File decFile = new File("decFile.bmp"); //解密文件
       
        try {
            EncFile(srcFile, encFile); //加密操作
        } catch (Exception e) {
            e.printStackTrace();
        } 
    }

private static void EncFile(File srcFile, File encFile) throws Exception {
        if(!srcFile.exists()){
            System.out.println("source file not exixt");
            return;
        }
       
        if(!encFile.exists()){
            System.out.println("encrypt file created");
            encFile.createNewFile();
        }
        InputStream fis  = new FileInputStream(srcFile);
        OutputStream fos = new FileOutputStream(encFile);
       
        while ((dataOfFile = fis.read()) > -1) {
            fos.write(dataOfFile^numOfEncAndDec);
        }
       
        fis.close();
        fos.flush();
        fos.close();
    }
}

  从代码可以看出,给定的加密秘钥(异或数据,可以在合法范围内随便定义)为十六进制数0x99。图片资源为以中文命名的“桌面.jpg”,加密文件为“encFile.png”,还有值为“decFile.bmp”的String类对象作为解密文件名称。

  相对应地,解密的实现几乎和加密相同,只是输入与输出文件不同,看下面代码。

private static void DecFile(File encFile, File decFile) throws Exception {
  if(!encFile.exists()){
    System.out.println("encrypt file not exixt");
    return;
  }

  if(!decFile.exists()){
    System.out.println("decrypt file created");
    decFile.createNewFile();
  }

  InputStream fis  = new FileInputStream(encFile);
  OutputStream fos = new FileOutputStream(decFile);

  while ((dataOfFile = fis.read()) > -1) {
    fos.write(dataOfFile^numOfEncAndDec);
  }

  fis.close();
  fos.flush();
  fos.close();
}

  由于加密后的图片文件(保存为PNG类型)是不能直接在图片查看器中打开的,因为其内容已经改变,所以其缩略图标会显示为两朵不同颜色的花。对于其他类型的加密或损坏文件的缩略图标:JPG为山水画,BMP和TIF为画刷涂鸦,GIF为三个不同颜色的几何图形。当然,这些默认的图标应该会因系统而异。

  下面给出初始、加密及解密后的图标截图:

  和预想的一致,经测试发现以上方法对GIF动画(不是GIF图片,而是可以播放的动画资源)的加密与解密同样适用,代码和截图也就没有区别了,不过还是贴上来:

File srcFile = new File("srcFile.gif"); //初始文件

File encFile = new File("encFile.gif"); //加密文件

File decFile = new File("decFile.gif"); //解密文件

  有两点需要注意:

  1、在调用加密与解密方法时,必须加上异常处理块(try{...}catch{...},否则编译不通过)。

  2、对用来加密或解密的源文件进行打开(读取)操作之前,最好判断其是否存在,免得造成意想不到的错误和时间的浪费。因为若文件不存在,后续的操作都是没有意义的。

  今天就先写到这,总结一下吧。文件加密简单地说就是对数据进行变换,虽然一千种方法可能会有一千种一种结果,但是思想是通用的。关键是加密所采用的算法的难易,有时间会对文中提到的算法用Java进行实现。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bc34f499d0e893c8d6018b96b6bfddf9.html