在开发一个文件管理系统的路上,总有坑在等着你。

今天需求爸爸又开始早早的对我进行“问候”了,加一个文件的加密解密功能。@#¥%,我态度的友好的答应了。

进入正文,加密算法大家应该都不陌生,当然都只是听过,比如信息安全课上那花里胡哨的一堆AES、DES、md5等等。具体的算法,早已忘的一干二净,但是现在做事网上的工具类已经很发达了,何必自己造轮子,耗时耗力,又好的主要我不会。

网上可以看到很多加密算法,这里顺便推荐给大家一个网址,别问我是什么,点它 ,你会谢谢我的。

然后我就去问需求爸爸要什么算法,他说最简单的就行,只有一个要求解密要快。好勒,base64。具体它是什么,什么原理我就不浪费时间了。具体说说我是怎么实现的。

首先在上面提供的工具类里面就有base64编码解码,(刚刚不是在说加密解密吗),我对加密的理解就是:一切让你无法直观看见明文的操作都可以称为加密,比如ABCD->BCDA。

首先我们要加密肯得有一个源文件吧,我们来看看前面提供的工具类,
String encodeString = Base64.encode(file);
saveFile(encodeString,filePath);
可以找到一个传入参数是File的,返回参数是String的方法,就是它了,首先我们将这个文件Base64编码后变成String,然后再用saveFile方法,把它保存成文件。

// String保存成文件
    private static void saveFile(String content,String path) {

        FileWriter fwriter = null;
        try {
            fwriter = new FileWriter(path);
            fwriter.write(content);
        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                fwriter.flush();
                fwriter.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
    }

这样就成功的加密了,可以输出或者打开文件看一看。

然后在需要预览的时候就得吧它解密。也很简单

String decode = readFileContent(file);
File file = Base64.decodeToFile(decode,filePath);

首先把这个被加密的文件先以String的形式读出来,然后继续用刚刚那个工具类将这个String解码成文件。filepath就是你存放这个明文文件的地址,记得有需要的话预览完要把它删掉哦。

public static String readFileContent(String fileName) {
        File file = FileUtil.getFile(fileName);
        Log.e("filetest", file.getPath() );
        BufferedReader reader = null;
        StringBuffer sbf = new StringBuffer();
        try {
            reader = new BufferedReader(new FileReader(file));
            String tempStr;
            while ((tempStr = reader.readLine()) != null) {
                sbf.append(tempStr);
            }
            reader.close();
            return sbf.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
        }
        return sbf.toString();
    }