文件加密

最近开发一个手机上的类似于保险箱的功能,就是把选择某个文件然后这个文件就加密起来了,在普通的文件管理器中无法显示。

下面简单介绍下思路,在做这个功能之前,参考很多Android市场上的成熟产品,(大笑,我表示中国人的模仿能力实在太强大了,这个也是教育的悲哀啊,委屈)。


不过话说起来,如果不会创造,那么请模仿。大笑


思路:

1、选择一个文件

2、选择一种加密算法(可以选择加密级别),来实现加密,复制文件

3、删除原先的文件


关于加密算法,现在技术这么发到,有很多的,比如什么md5,des等,不过我们这边需要选择的是一种可逆的加密算法。

关于加密级别问题,其实是故弄玄虚,我只是简单想了下有三种,(从别的apk上参考的,然后估计思路是这样)。

1、直接重命名,去掉文件后缀,比如《开发宝典.pdf》,一看就是个pdf文件,如果换成《alfjafajfaldcmva》,这样就很难看出来的,如果在window上选择用某方式打开,还是可以打开的,当然这个是简单的级别。

2、选择一个可逆加密算法,密码固定,这样算是比较安全的,在级别1的基础上,添加了密码,在修改和查看前,必须先解密。

3、让用户自己设置一个密码,这样用户在解密前,必须先输入密码才可以。


关于加密算法,肯定想到什么加多少,减多少,与运算,或运算,自定义移动算法。算了吧,咱们也不是设计算法的人。而且Java中也自带中加密算法,Java程序员是幸福的。大笑

下面是级别2加密的核心算法,其中密码是"cnmmlgb!",唉,说粗话了,偷笑。这样级别就很容易实现了,替换下密码就好了,级别就不介绍了,大家都懂的。不够文件的命名可以使用Java随机生成一个字符串来实现。

void encode(File enfile, File defile) throws Exception{
	String Algorithm = "DES"; // 定义 加密算法,可用DES,DESede,Blowfish
	byte[] key = "cnmmlgb!".getBytes(); //字节数必须是8的整数倍 

	// 密码(对称)密钥(SecretKey继承(key))
	// 根据给定的字节数组构造一个密钥。
	SecretKey deskey = new SecretKeySpec(key, Algorithm);
	// 生成一个实现指定转换的 Cipher 对象。Cipher对象实际完成加解密操作
	Cipher c = Cipher.getInstance(Algorithm);
	// 用密钥初始化此 cipher
	c.init(Cipher.ENCRYPT_MODE, deskey);

	byte[] buffer = new byte[100 * 1024];
	FileInputStream in = new FileInputStream(enfile);
	OutputStream out = new FileOutputStream(defile);

	CipherInputStream cin = new CipherInputStream(in, c);
	int i;
	while ((i = cin.read(buffer)) != -1) {
		out.write(buffer, 0, i);
	}
	out.close();
	cin.close();
}

关于解密,基本上同上面代码。CipherInputStream,CipheroutputStream这2个类就是干这个事情的。以上就是简单的文件加密功能,不过还需二外的配置,就是原始文件和加密后的文件的映射问题,不过这个都是很简单的,简单设计个sqlite数据库就好了。


还有在Android中,一个.开头的默认隐藏文件,所以可以把加密后的文件放在隐藏文件夹里面。不过为了防止用户误操作。添加提示文件,比如“重要文件请勿删除”等。不过这个还是比较尴尬的事情,万一用户失误操作,就完蛋,可以考虑使用网盘,同步到服务器上。


先写到这里吧,关于同步网盘问题,以后在实现吧。

打完手工,下班了,周六加班,伤不起啊。快哭了


原文地址:https://www.cnblogs.com/liushuibufu/p/3253605.html