指定图片指定方式加密

一、图片概述
每种图片都有自己的文件格式和压缩方式;文件格式主要由文件头和文件域组成。压缩方式有很多种如PNG格式的图片采用调色板或者行程编码方式的进行压缩。PNG采用无损压缩,jpg则采用有损压缩的方式进行压缩等等。
二、图像加密种类
1、置乱加密:有RGB平移置乱、HENON置乱、混沌置乱等;
2、灰度加密:DES加密、HILL加密、LOGISTIC加密、ECA加密等;
3、混合加密:复合混沌加密、baker加密、位平面加密等;
4、频域加密:DCT加密、HAAR加密等;
这些加密算法有的在时域中进行加密,有的却在频域中进行加密。主要原理是让图片中的事物轮廓变得不可辨识,并不一定是在频域中进行加密就比在时域中加密性能好。
三、一个例子
LOGISTIC加密,为什么举这个例子,是由于这是公司首先的方案,且容易说明。该加密算法的思路是1、生成一个在一定范围之内的数据序列;2、根据数据序列进行颜色位置的对调或者是颜色数值的修改。这个数据序列两个特点就是1、序列长度是图片像素长度和宽度的积;2、序列中数据的范围是0到1之间,且不重复;这样使得数据归一化很容易,如归一化到0-255、0-W*H等区域后数据不出现重样;废话少说上代码。

    public static void docrypto(String map, String key, int mode, int[] pixels,int width,int height)
    {   
        //开始
        long start = System.nanoTime();

        //获取参数和序列
        int N_0 = 200;
        String[] params = key.split(" ");
        double r   = Float.parseFloat(params[0]);
        double x_0 = Float.parseFloat(params[1]);   
        double x_N = r*x_0*(1-x_0);
        for(int i = 0; i < N_0; i++)
            x_N = r*x_N*(1-x_N);

        double[] ax = new double[width * height];
        if(ax.length == 0)
            return;
        for(int i = 0; i < width * height; i++)
            ax[i] = x_N = r*x_N*(1-x_N);    

        //位置置换 
        if(mode == Crypto.DECRYPT)
        {
            for(int y = height-1; y >=0 ; y--)
            {
              for(int x = width-1; x >=0; x--) 
              {     
                    int t_n = Math.floor(ax[y * width + x] * height * width);
                    int x_new = t_n % width;
                    int y_new = t_n / width;

                    int Color1 = pixels[y_new*width+x_new];
                    int Color2 = pixels[y*width+x];

                    Color1^=Color2;
                    Color2^=Color1;
                    Color1^=Color2;

                    pixels[y_new*width+x_new] = Color1;
                    pixels[y*width+x]  = Color2;
              }
            }
        }
        else
        {
            for(int y = 0; y < height; y++)
            {
                for(int x = 0; x < width; x++)
              {     
                    int t_n = Math.floor(ax[y * width + x] * height * width);
                    int x_new = t_n % width;
                    int y_new = t_n / width;

                    int Color1 = pixels[y_new*width+x_new];
                    int Color2 = pixels[y*width+x];

                    Color1^=Color2;
                    Color2^=Color1;
                    Color1^=Color2;

                    pixels[y_new*width+x_new] = Color1;
                    pixels[y*width+x]  = Color2;
              }
            }
        }

        ax =null;

        //结束
        long stop = System.nanoTime();
        Log.d(Crypto.TAG,"use time : " + (stop - start));
    }
package com.beijing.lebo.util.image;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
/**
 * 图片加密解密工具类
 * 
 * @author Administrator
 */
public class ImageLock {
 
	/**
	 * @param args
	 *            测试主方法
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		lockImage("C:/1.png", "C:/2.png", 111111);
		unLockImage("C:/2.png", "C:/3.png", 111111);
	}
 
	/**
	 * 
	 * @param file_path
	 *            待加密的图片路径
	 * @param save_path
	 *            加密后的图片路径
	 * @param lock_num
	 *            加密密钥
	 * @throws IOException
	 */
	public static void lockImage(String file_path, String save_path,
			int lock_num) throws IOException {
		File soure = new File(file_path);
		File save = new File(save_path);
		lockImage(soure, save, lock_num);
	}
 
	/**
	 * 
	 * @param file_path
	 *            待加密的图片文件
	 * @param save_path
	 *            加密后的图片文件
	 * @param lock_num
	 *            加密密钥
	 * @throws IOException
	 */
	public static void lockImage(File soure_file, File save_file, int lock_num)
			throws IOException {
		FileInputStream fis = new FileInputStream(soure_file);
		FileOutputStream fos = new FileOutputStream(save_file);
		int b = 0;
		while ((b = fis.read()) != -1) {
			fos.write(b - lock_num);
			fos.flush();
		}
		fos.close();
		fis.close();
		System.out.println("加密完成");
	}
 
	/**
	 * 
	 * @param file_path
	 *            待解密的图片路径
	 * @param save_path
	 *            解密后的图片路径
	 * @param unlock_num
	 *            解密密钥
	 * @throws IOException
	 */
	public static void unLockImage(String file_path, String save_path,
			int unlock_num) throws IOException {
		File soure = new File(file_path);
		File save = new File(save_path);
		unLockImage(soure, save, unlock_num);
	}
 
	/**
	 * 
	 * @param file_path
	 *            待解密的图片文件
	 * @param save_path
	 *            解密后的图片文件
	 * @param unlock_num
	 *            解密密钥
	 * @throws IOException
	 */
	public static void unLockImage(File soure_file, File save_file,
			int unlock_num) throws IOException {
		FileInputStream fis = new FileInputStream(soure_file);
		FileOutputStream fos = new FileOutputStream(save_file);
		int b = 0;
		while ((b = fis.read()) != -1) {
			fos.write(b + unlock_num);
			fos.flush();
		}
		fos.close();
		fis.close();
		System.out.println("解密完成");
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值