3

我使用此代码在 BlackBerry 上即时播放解密的音频(为简单起见,我使用TEA

public void play(String path){
    try {
        FileConnection fc = (FileConnection) Connector.open(path,   Connector.READ);
        InputStream is = fc.openInputStream();
        byte[] rawData = IOUtilities.streamToBytes(is);
        processEncryptedAudio(rawData);
        is.close();
        fc.close();
    }
    catch (IOException ioex){

    }
}

// TEA code is taken from http://www.winterwell.com/software/TEA.php
private void processEncryptedAudio(byte[] data) throws IOException {
    TEA tea = new TEA("ABCDE ABCDE ABC A ABCDEF".getBytes());
    byte[] decrypted_data = tea.decrypt(data);
    ByteArrayInputStream stream = new ByteArrayInputStream(decrypted_data);
    ByteArrayInputStreamDataSource source = new ByteArrayInputStreamDataSource(stream, "audio/mpeg");

    try {
        player = Manager.createPlayer(source);
        player.start();
    }
    catch (MediaException me){
        Dialog.alert("MediaException: "+me.getMessage());
    }
}

问题是解密需要很长时间才能完成。例如:在模拟器上,解密 9 MB 的音频大约需要 5 秒,但在 BlackBerry Torch 9860 上需要 20 多秒。

有什么办法可以改善这一点吗?实际上整个文件不需要加密,只要它被遮挡/不能直接播放。

4

1 回答 1

1

您可以尝试从 TEA 切换到RC4,这也很容易实现并且可能更快。

此外,您似乎在进行一些不必要的数据复制:让您的decrypt()方法直接修改输入字节数组会稍微高效一些。这可能需要更改调用代码以在解密数据的开头和/或结尾跳过一些字节,但这应该不会太难。(ByteArrayInputStream构造函数可以接受可选参数offsetlength参数。)

如果您想变得非常花哨,可以尝试编写自己的自定义InputStream子类,在播放音频时“即时”进行解密。如果您在CTR、CFB 或 CBC 模式(或 ECB,但这不安全)中使用分组密码,您甚至可以使流可搜索。如果你想变得更漂亮,可以把它封装在原版InputStream上,这样你就可以同时进行加载、解密和播放

另一种选择可能是使用RIM Crypto API,其密码实现可能比您自己的更有效(可能在优化的本机代码中实现)。Crypto API 也已经提供了以我上面描述的方式工作的DecryptorInputStream类。

One possible down side is that the Crypto API seems to be only available to signed apps.

于 2012-09-10T12:59:40.557 回答