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#的方法加密得到的密文老是跟客户给 ...
随机推荐
- 使用 Notepad 或 TextEdit 来编写 HTML
可以使用专业的 HTML 编辑器来编辑 HTML: Adobe Dreamweaver Microsoft Expression Web CoffeeCup HTML Editor 不过,我们同时推荐 ...
- 【BZOJ】3391: [Usaco2004 Dec]Tree Cutting网络破坏(dfs)
http://www.lydsy.com/JudgeOnline/problem.php?id=3391 显然判断每个点只需要判断子树是否小于等于n/2即可 那么我们虚拟一个根,然后计算每个子树的si ...
- jquery XHTML
传送门:异步编程系列目录…… 示例源码:触碰jQuery:AJAX异步详解.rar AJAX 全称 Asynchronous JavaScript and XML(异步的 JavaScript 和 X ...
- 为什么要使用自增ID作为主键
1.从业务上来说 在设计数据库时不需要费尽心思去考虑设置哪个字段为主键.然后是这些字段只是理论上是唯一的,例如使用图书编号为主键,这个图书编号只是理论上来说是唯一的,但实践中可能会出现重复的 情况.所 ...
- jeesite学习笔记(一) 项目框架
JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台. 在github上,对jeesite平台有详细的介绍,这里稍作整理,给出项目的内置功能 ...
- SPOJ Number of Palindromes(回文树)
Number of Palindromes Time Limit: 100MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu ...
- java根据方法名动态调用invoke方法!
public class Activity { public void deal(String name, long id) { System.out.println(name + id + &quo ...
- PHP下SESSION无法跨页传递的解决
修改PHP.ini1.Windows下PHP的session文件保存路径要设置成为一个绝对路径session.save_path = C:\windows\temp2.为temp设置权限,允许User ...
- 你不知道的Javascript(上卷)读书笔记之四 ---- 提升、this
1. 提升 使用var声明的变量声明和函数的声明(函数表达式不会)会被提升至所在函数作用域顶部 a. 从编译器角度出发 回忆一下, 中关于编译器的内容,引擎会在解释 JavaScript 代码之前首先 ...
- 【Python之路】第十九篇--Python操作MySQL
本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...