0

我创建了加密解密方法来加密图像和视频。我正在对视频进行部分加密,确切地说是 1 MB。更复杂的解密方法需要很长时间才能解密 android 设备上的内容。然而 img_decrypt 根本不需要很长时间。不知道他们为什么这样做。

这是一个。这个可以解密完全加密的视频或图像。以毫秒为单位解密完整图像,但无法解密部分加密的视频。

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

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


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

            out.write(buf, 0, numRead);
        }


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

这是另一个。这需要永远运行。将解密完全加密的图像或部分加密的视频。

    public void decrypt(InputStream in, OutputStream out) {
    try {
        // Bytes written to out will be decrypted
        AppendableOutputStream out_append = new AppendableOutputStream(out);
        System.out.println(ecipher.getOutputSize(1024*1024));
        OutputStream out_d = new CipherOutputStream(out_append, dcipher);

        // Read in the decrypted bytes and write the cleartext to out
        int numRead = 0;
        int count = 0;
        int max = 1024;
        boolean out_d_closed = false;

        while ((numRead = in.read(buf, 0, max)) > 0) {
            count += numRead;
            if(count <= ecipher.getOutputSize(1024*1024)){
                out_d.write(buf, 0, numRead);
                out_d_closed = false;
                // last encryption pass, close buffer and fix max
                if(count == ecipher.getOutputSize(1024*1024)){
                    // fix reading 1k in case max was decreased
                    max = 1024;
                    out_d.close();
                    out_d_closed = true;
                }
                // if next read will go over a meg, read less than 1k
                else if(count + max > ecipher.getOutputSize(1024*1024))
                    max = ecipher.getOutputSize(1024*1024) - count;
            }
            // past the first meg, don't decrypt
            else{
                out.write(buf, 0, numRead);
            }

        }
        if(!out_d_closed){

            out_d.close();

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

        e.printStackTrace();

    }
}

因为解密()方法需要很长时间才能解密一个 100KB 的文件,所以设备要求我中止或等待。

如果我使用 img_decrypt() 它根本不会工作。这对我来说毫无意义,他们在做同样的事情。

我试图使用decrypt() 来解密视频的第一个MB。

在计算机上一切正常。

任何想法都可能会有所帮助。

这两种方法都适用于解密完全加密的文件,但 decrypt() 花费的时间太长。

还有一件事。decrypt() 对写入的数据进行解密。img_decrypt() 对读取的数据进行解密。不知道这是否会影响任何事情。

谢谢

4

1 回答 1

0

如果有人在乎。FilterOutputStream 实现错误。Sun 写错了 write 方法。必须覆盖写入才能正常工作。

于 2012-03-29T14:40:30.527 回答