zoukankan      html  css  js  c++  java
  • java图像加密

    0 前言

        为了保护服务器的图像数据,需要用一个图像加密算法来加密服务器的图像:一开始找了一种基于混沌的图像加密算法,效果还是很理想的,是把矩阵图像上的像素点进行上下左右的混乱;后来发现加密后图像会变大,使用了简单的异或原理来加密图像;最后把加密算法应用到项目上,需要递归创建于源文件相同的目录结构和加密解密放置。

    1 关于图像

        我们平时看到的图像可能都是压缩过的,所以在程序里打开图像矩阵后可能会变大,,然后在加密过程中由于算法的原因图像又会变大,最后在存储的时候又没有对图像进行压缩,没有进行压缩,所以会导致最后图像变大。我把服务器的11G图像用基于混沌算法加密后超出了100G(搞事搞事),所以后来换了直接对二进制异或的算法(简单粗暴ORZ)。

        一般有JPGPNG两种格式,而JPG24位)一般是有损压缩的,图片会失真;而PNG是无损压缩(一般是24位,RGB三种颜色各8,也有32位,RGB再加上一个透明度,即ARGB四个通道*8),所以保存为PNG格式的话图片会相对大一些。另外在windows你修改拓展名是没有用的,一张PNG修改了后缀名为JPG实际上还是PNG,由文件二进制信息决定的,不要被拓展名欺骗了,所以你在程序里存储文件名后面加个JPG也是没卵用的,它决定于程序接口API存储图像的实现方式,一般会让在API方法里让你选择哪种格式保存。

        然后考虑到如果自己压缩,怕损失了图像的信息(虽然已经保存下来的图像也是压缩过的),也不知道会不会对图像识别造成影响,所以最后还是放弃了,决定找别的算法,不会改变大小(改变原来的数据)的算法。

    2  异或加密

    简单粗暴的原理,比如输入a异或一个常量等于b,然后我们用b异或这个常量又可以得到a。所以我们可以把图像用二进制字节的方式读出来,然后异或一个随机常量,之后解密的时候再异或这个随机常量(随机常量用一个keyFile存起来),考虑到每个字节都要生成一个随机常量就太多了,可以对每张图像都只生成常数个来循环使用。下面展示一下加密的简单伪码实现。

    private static final int KEY_NUM = 999; 
    BufferedOutputStream keyFile = new BufferedOutputStream(keyFileName);
    ArrayList<Integer> keys = new ArrayList<Integer>(KEY_NUM);
    
    
    for(int i=0;i<KEY_NUM;i++) {
    int key = rand.nextInt(Byte.MAX_VALUE);
    keys.add(key);
    keyFile.write(key);
    }
    
    BufferedInputStream bis = new BufferedInputStream(src);
    BufferedOutputStream bos = new BufferedOutputStream(des);
    while((len=bis.read()) != -1) {
    int key = keys.get(i % KEY_NUM);
    i++;
    bos.write(len^key);
    }

    3 对项目图像进行加密

    为了通用,写了一个方法类来对文件夹下的所有图像进行加密,大致用法如下。

    Usage: [enc sourceDir encryptDir keyDir | dec encryptDir decryptDir keyDir]
    
    example1:[enc /home /secure/enc /secure/key]
    
    example2:[dec /secure/enc/home /secure/dec /secure/key]

    程序会把源图像目录sourceDir(包括这个根目录)的目录结构复制到加密目录encryptDirkey目录keyDir下,然后把sourceDir下对应位置的文件加密,然后保存到encryptDirkeyDir下。解密也是同理,但是解密时候输入的加密目录要加密根目录的下一层,比如根目录是/secure/enc/,要使用/secure/enc/home,这个看了具体实现就明白了。其实就是简单的递归查找文件目录和复制以及加密解密后的放置。涉及到源图像目录,加密目录,解密目录和key目录。

  • 相关阅读:
    Java 过滤器的作用
    TreeView的绑定
    设计模式(一)工厂模式Factory(创建型)
    【剑指offer】员工年龄排序
    Spring3.0 AOP 具体解释
    IT行业新名词--透明手机/OCR(光学字符识别)/夹背电池
    MYSQL C API 记录
    Hibernate的介绍
    数据绑定(八)使用Binding的RelativeSource
    一、ExtJS下载使用
  • 原文地址:https://www.cnblogs.com/liaohuiqiang/p/7625857.html
Copyright © 2011-2022 走看看