java图像加密
0 前言
为了保护服务器的图像数据,需要用一个图像加密算法来加密服务器的图像:一开始找了一种基于混沌的图像加密算法,效果还是很理想的,是把矩阵图像上的像素点进行上下左右的混乱;后来发现加密后图像会变大,使用了简单的异或原理来加密图像;最后把加密算法应用到项目上,需要递归创建于源文件相同的目录结构和加密解密放置。
1 关于图像
我们平时看到的图像可能都是压缩过的,所以在程序里打开图像矩阵后可能会变大,,然后在加密过程中由于算法的原因图像又会变大,最后在存储的时候又没有对图像进行压缩,没有进行压缩,所以会导致最后图像变大。我把服务器的11G图像用基于混沌算法加密后超出了100多G(搞事搞事),所以后来换了直接对二进制异或的算法(简单粗暴ORZ)。
一般有JPG和PNG两种格式,而JPG(24位)一般是有损压缩的,图片会失真;而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(包括这个根目录)的目录结构复制到加密目录encryptDir和key目录keyDir下,然后把sourceDir下对应位置的文件加密,然后保存到encryptDir和keyDir下。解密也是同理,但是解密时候输入的加密目录要加密根目录的下一层,比如根目录是/secure/enc/,要使用/secure/enc/home,这个看了具体实现就明白了。其实就是简单的递归查找文件目录和复制以及加密解密后的放置。涉及到源图像目录,加密目录,解密目录和key目录。
java图像加密的更多相关文章
- Java 前端加密传输后端解密以及验证码功能
目录(?)[-] 加密解密 1 前端js加密概述 2 前后端加密解密 21 引用的js加密库 22 js加密解密 23 Java端加密解密PKCS5Padding与js的Pkcs7一致 验证码 1 概 ...
- js和java MD5加密
项目中用到js MD5加密和后台java MD5加密,刚开始加密后两个不一致,网上找了好久终于找到一个啦,记下来: md5.js /* * A JavaScript implementation of ...
- PHP、Java对称加密中的AES加密方法
PHP AES加密 <?php ini_set('default_charset','utf-8'); class AES{ public $iv = null; public $key = n ...
- bugzilla4的xmlrpc接口api调用实现分享: xmlrpc + https + cookies + httpclient +bugzilla + java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能
xmlrpc . https . cookies . httpclient.bugzilla . java实现加密通信下的xmlrpc接口调用并解决登陆保持会话功能,网上针对bugzilla的实现很 ...
- Java Base64加密、解密原理Java代码
Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...
- Java AES加密
Java AES 加密 加密 /** * * @description 加密 * * @param content 需要加密的内容 * @param password 加密密码 * @return * ...
- java c# 加密与解密对照
原文 java c# 加密与解密对照 最近一直烦恼,java , c# 加密的不同,然后整理了一下,留个备份的轮子: 其中在 java.c#加密转换时,最重要的是 IV 的确定,我常常用如下方法使得j ...
- java对称加密(AES)
java对称加密(AES) 博客分类: Java javaAES对称加密 /** * AESHelper.java * cn.com.songjy.test * * Function: TODO * ...
- C# Java DES加密解密
转自http://www.cnblogs.com/zhuiyi/archive/2013/04/01/2993201.html 最近被DES加解密弄得超级郁闷,我用C#的方法加密得到的密文老是跟客户给 ...
随机推荐
- Batch Normailzation
转自:http://blog.csdn.net/malefactor/article/details/51476961
- 2017 ACM区域赛(西安) 参赛流水账
day 0: 周五, 鸽了概统课,早上和紫金港的几位小伙伴一起打车去萧山机场,从咸阳机场到西北工业大学坐了五十多个站的公交车,感觉身体被掏空.晚上在宾馆本来打算补之前训练的一个题,想想还是先花个十来分 ...
- VC++ 带界面的ActiveX控件
一.新建MFC ActiveX工程OleHasInterface: 二.新建一个对话框资源,ID为 IDD_FORMVIEW,关联类CActXInterfaceDlg,基类CDialog: 三.设计对 ...
- [转帖收集] Java注解
1.Annotation 它的作用是修饰编程元素.什么是编程元素呢?例如:包.类.构造方法.方法.成员变量等.Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和任何元数据( ...
- Bower和Gulp集成前端资源
在我们开始前先介绍下流程: 安装node.js. 安装npm. 全局安装bower. 根目录创建 .bowerrc (可选) 在项目中安装bower 并创建 bower.json 文件,运行 bowe ...
- servlet之模板方法和多线程
接触了一小段时间的servlet,以下就总结一下关于servlet的两个方面的知识,一个是模板方法的应用.另外一个是servlet多线程产生的原因. 1. 模板方法设计模式 定义一个操作中的算法的骨架 ...
- Spring Mvc 上传文件Demo 实例
返得利购物. 淘宝.京东500家商城合作,包括全面的商城返利网.注冊就送5元,购物就有返利.随时提现. 同学们,新一轮的返利大潮正在慢慢靠近,让购物都认为自己在赚钱.购物,机票.游戏.酒店旅游,地方特 ...
- bnuoj 34990(后缀数组 或 hash+二分)
后缀数组倍增算法超时,听说用3DC可以勉强过,不愿写了,直接用hash+二分求出log(n)的时间查询两个字符串之间的任意两个位置的最长前缀. 我自己在想hash的时候一直在考虑hash成数值时MOD ...
- poj1691
Painting A Board Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3642 Accepted: 1808 ...
- 【BZOJ4566】[Haoi2016]找相同字符 后缀数组+单调栈
[BZOJ4566][Haoi2016]找相同字符 Description 给定两个字符串,求出在两个字符串中各取出一个子串使得这两个子串相同的方案数.两个方案不同当且仅当这两 个子串中有一个位置不同 ...