最近开发一个手机上的类似于保险箱的功能,就是把选择某个文件然后这个文件就加密起来了,在普通的文件管理器中无法显示。
下面简单介绍下思路,在做这个功能之前,参考很多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中,一个.开头的默认隐藏文件,所以可以把加密后的文件放在隐藏文件夹里面。不过为了防止用户误操作。添加提示文件,比如“重要文件请勿删除”等。不过这个还是比较尴尬的事情,万一用户失误操作,就完蛋,可以考虑使用网盘,同步到服务器上。
先写到这里吧,关于同步网盘问题,以后在实现吧。
打完手工,下班了,周六加班,伤不起啊。