部分文件加密

时间:2012-03-26 20:28:42

标签: java encryption filestream

我有一堆视频文件需要作为我们应用程序的数据放到Android平板电脑上。因为我们不想轻松访问,所以我们决定加密视频。我通过默默无闻的方式采取安全措施。我开始时通过加密整个视频并在播放之前对其进行解密,但很快就发现加载视频是一个很大的保真杀手。拍摄用户体验和应用程序流程。

我想也许我可以加密视频的第一个MB,因为我们所有的视频都超过1MB。如果小偷至少接触到视频,那么这不是全部事情而且是无用的。

Bellow是加密和解密文件的代码。它适用于视频,因为我试图将文件的两个部分一起修补。加密文件似乎很好。解密的文件在一个位置关闭。我想通过差异测试来运行它们。

 public void encrypt(InputStream in, OutputStream out) {
    try {
        // Bytes written to out will be encrypted
       OutputStream out_c = new CipherOutputStream(out, ecipher);

        // Read in the cleartext bytes and write to out to encrypt
        int numRead = 0;
        int count = 0;
        boolean first = true;

        while ((numRead = in.read(buf)) >= 0) {

            if(count <= 1048576){
                count += numRead;
                out_c.write(buf, 0, numRead);
            }else{

                out.write(buf, 0, numRead);

            }
        }
        out.close();
        out_c.close();


    } catch (java.io.IOException e) {
    }
}

// Movies encrypt only 1 MB.

public void decrypt(InputStream in, OutputStream out) {
    try {
        // Bytes read from in will be decrypted
        InputStream in_c = new CipherInputStream(in, dcipher);

        // Read in the decrypted bytes and write the cleartext to out
        int numRead = 0;
        int count = 0;

        while ((numRead = in_c.read(buf)) >= 0 && count <= 1048576) {
            count += numRead;
            out.write(buf, 0, numRead);
        }

        //in.skip(count); This removed 1MB from the final file. No need to skip.

        while((numRead = in.read(buf)) >= 0){

            out.write(buf,0,numRead);

        }

        out.close();
    } catch (java.io.IOException e) {
    }
}

我想知道是否有人能够通过加密或解密发现问题。我知道这不是一个理想的解决方案,但它适用于我们的情况。

谢谢。

2 个答案:

答案 0 :(得分:2)

您不会以正确的1048576字节停止读取或写入,您可以读取/写入缓冲区的任何部分超过该阈值。在读/写情况下,数量的大小不能保证相同,因此不一致。

解决方案是准确读取明文的1048576字节,通过加密例程写出,然后继续文件的其余部分。同样在解密案例中。

当然,您还必须确保size(cleartext) == size(ciphertext)

答案 1 :(得分:1)

好吧,当你达到这一点时:

if(count <= 1048576){
   count += numRead;
   out_c.write(buf, 0, numRead);
}

假设在计数为1,048,575之前(仅缺少1个字节以达到最大值)。你的缓冲区是1024字节。因此,当您输入if语句时,您的计数结束为1,049,599。

因此,您的计数可能会大于1,048,576。在阅读文件之前,您需要该实际数字。