2

RNCryptor で暗号化された画像ファイルがいくつかあり、それらを復号化し、フレームレイアウトの背景として使用したいと考えています。サンプル ファイルを確認しましたが、アプリケーション フォースはしばらくすると終了し、画像は表示されませんでした。JNCryptor ライブラリを使用し ています

以下のように、暗号化された画像を raw フォルダーに入れます。

ここに私のプロジェクトフォルダ

これは私の活動の私のコードです:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FrameLayout img = (FrameLayout) findViewById(R.id.scrollView);

    final String password = "myPasswordString";

    JNCryptor cryptor = new AES256JNCryptor();

    Resources res = getResources();
    InputStream in_s = res.openRawResource(R.raw.troodon_ph);
    byte[] b = null;
    byte[] data = null;
    try {
        b = new byte[in_s.available()];
        in_s.read(b);
    } catch (IOException e) {
        Log.i("decrypt error", e.toString());
    }

    try {
        data = cryptor.decryptData(b, password.toCharArray());
    } catch (InvalidHMACException e) {
        Log.i("decrypt error", e.toString());
    } catch (CryptorException e) {
        Log.i("decrypt error", e.toString());
    }

    Bitmap mBitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
    BitmapDrawable bDrawable = new BitmapDrawable(res, mBitmap);

    img.setBackgroundDrawable(bDrawable);
}

このファイルは、次のコードを使用して iOS でうまく機能します。

NSString  *imagePath = [[NSBundle mainBundle] pathForResource:getName ofType:@"wod"];
NSData *encryptedData = [NSData dataWithContentsOfFile:imagePath];
NSData *decryptedData = [RNDecryptor decryptData:encryptedData
                                    withPassword:PASSWORD
                                           error:&error];

UIImage*  bgImage = [UIImage imageWithData:decryptedData];
UIImageView * movingImageView = [[UIImageView alloc]initWithImage:bgImage];

logcat の出力は次のとおりです。

08-28 19:52:11.720: E/AndroidRuntime(1063): 致命的な例外: メイン 08-28 19:52:11.720: E/AndroidRuntime(1063): java.lang.RuntimeException: アクティビティ ComponentInfo{net を開始できません。 appersian.android.wod/net.appersian.android.wod.MainActivity}: java.lang.NullPointerException 08-28 19:52:11.720: E/AndroidRuntime(1063): android.app.ActivityThread.performLaunchActivity(ActivityThread.java で:2059) 08-28 19:52:11.720: E/AndroidRuntime(1063): android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 08-28 19:52:11.720: E/AndroidRuntime(1063): android.app.ActivityThread.access$600(ActivityThread.java:130) 08-28 19:52:11.720: E/AndroidRuntime(1063): android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 08 -28 19:52:11.720: E/AndroidRuntime(1063): android.os.Handler で。dispatchMessage(Handler.java:99) 08-28 19:52:11.720: E/AndroidRuntime(1063): android.os.Looper.loop(Looper.java:137) 08-28 19:52:11.720: E/ AndroidRuntime(1063): android.app.ActivityThread.main(ActivityThread.java:4745) 08-28 19:52:11.720: E/AndroidRuntime(1063): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) で08-28 19:52:11.720: E/AndroidRuntime(1063): java.lang.reflect.Method.invoke(Method.java:511) 08-28 19:52:11.720: E/AndroidRuntime(1063): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 08-28 19:52:11.720: E/AndroidRuntime(1063): com.android.internal.os.ZygoteInit.main(ZygoteInit) で.java:553) 08-28 19:52:11.720: E/AndroidRuntime(1063): dalvik.system.NativeStart.main(ネイティブ メソッド) 08-28 19:52:11.720: E/AndroidRuntime(1063): 原因by: java.lang.NullPointerException 08-28 19:52:11.720: E/AndroidRuntime(1063): net.appersian.android.wod.MainActivity.onCreate(MainActivity.java:54) 08-28 19:52:11.720: E/AndroidRuntime(1063 ): android.app.Activity.performCreate(Activity.java:5008) 08-28 19:52:11.720: E/AndroidRuntime(1063): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 08- 28 19:52:11.720: E/AndroidRuntime(1063): android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 08-28 19:52:11.720: E/AndroidRuntime(1063): ... 11 もっと見るE/AndroidRuntime(1063): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 08-28 19:52:11.720: E/AndroidRuntime(1063): android.app.ActivityThread.performLaunchActivity(ActivityThread.java) :2023) 08-28 19:52:11.720: E/AndroidRuntime(1063): ... 11 もっと見るE/AndroidRuntime(1063): android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 08-28 19:52:11.720: E/AndroidRuntime(1063): android.app.ActivityThread.performLaunchActivity(ActivityThread.java) :2023) 08-28 19:52:11.720: E/AndroidRuntime(1063): ... 11 もっと見る

ファイルの復号化について何が間違っていますか?

更新: e.printStackTrace() を try/catch に追加しました。これが新しい logcat です:

08-28 20:54:10.496: W/System.err(1487): org.cryptonode.jncryptor.InvalidHMACException: HMAC 値が正しくありません。08-28 20:54:10.496: W/System.err(1487): org.cryptonode.jncryptor.AES256JNCryptor.decryptV3Data(AES256JNCryptor.java:244) で 08-28 20:54:10.496: W/System.err( 1487): org.cryptonode.jncryptor.AES256JNCryptor.decryptV3Data(AES256JNCryptor.java:319) 08-28 20:54:10.496: W/System.err(1487): org.cryptonode.jncryptor.AES256JNCryptor.decryptData(AES256JNCryptor .java:276) 08-28 20:54:10.496: W/System.err(1487): net.appersian.android.wod.MainActivity.onCreate (MainActivity.java:50) で 08-28 20:54:10.496 : W/System.err(1487): android.app.Activity.performCreate(Activity.java:5008) 08-28 20:54:10.496: W/System.err(1487): android.app.Instrumentation で。 callActivityOnCreate(Instrumentation.java:1079) 08-28 20:54:

4

2 に答える 2

1

私はこの問題にかなり取り組んでいます。Github で開発者に尋ねたところ、問題はパスワード文字列であり、間違ったパスワードではなく、パスワード文字列の Unicode 文字が原因であることがわかりました。エンコード/デコードはすべてのデバイスとプラットフォームでうまく機能します。パスワードには ascii 文字を選択することをお勧めします。

于 2014-09-09T09:38:49.560 に答える
1

最初:

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available%28%29

http://docs.oracle.com/javase/8/docs/technotes/guides/io/troubleshooting.html

Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream

それらが問題を引き起こすかどうかはわかりませんが、これを試してみましょう:

    InputStream is = getResources().openRawResource(R.raw.troodon_ph);
    BufferedInputStream bis = new BufferedInputStream(is);
    ByteArrayBuffer baf = new ByteArrayBuffer(50);
    int current = 0;
    try {
        while ((current = bis.read()) != -1) {

            baf.append((byte) current);

        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    byte[] data = baf.toByteArray();

うまくいくといいのですが、教えてください!!

最後に、うまくいかない場合は、ファイルが正しく暗号化されていることを確認してください。

于 2014-08-29T05:43:08.367 に答える