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を使用することもできます。この APIの暗号実装は、独自のものよりも効率的 (最適化されたネイティブ コードに実装されている可能性があります) である可能性があります。Crypto API は、上で説明した方法で動作するDecryptorInputStreamクラスも既に提供しています。

考えられる欠点の 1 つは、Crypto API が署名付きアプリでのみ使用できるように見えることです。

于 2012-09-10T12:59:40.557 に答える