2014-08-28 34 views
2

我有一些使用RNCryptor加密的圖像文件,我想解密它們並將它們用作Framelayout的背景。 我瀏覽了示例文件,但我的應用程序力量在一段時間後關閉,沒有顯示任何圖像。 我用 JNCryptor library在Android上使用RNCryptor

我把加密圖像的原始文件夾,如下:

here my project folder

,這是我在我的活動代碼:

@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):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 08-28 19:52:11.720:E/AndroidRuntime(1063):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084 ) 08-28 19:52:11.720:E/AndroidRuntime(1063):在android.app.ActivityThread.access $ 600(ActivityTh read.java:130) 08-28 19:52:11.720:E/AndroidRuntime(1063):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1195) 08-28 19:52:11.720: E/AndroidRuntime(1063):at android.os.Handler.dispatchMessage(Handler.java:99) 08-28 19:52:11.720:E/AndroidRuntime(1063):at android.os.Looper.loop(Looper。 java:137) 08-28 19:52:11.720:E/AndroidRuntime(1063):at android.app.ActivityThread.main(ActivityThread.java:4745) 08-28 19:52:11.720:E/AndroidRuntime 1063):在java.lang.reflect.Method.invokeNative(Native Method) 08-28 19:52:11.720:E/AndroidRuntime(1063):at 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):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 08-28 19:52:11.720:E/AndroidRuntime 1063):at dalvik.system.NativeStart.main(Native Method) 08-28 19:52:11.720:E/AndroidRuntime(1063):引起:java.lang.NullPointerException 08-28 19:52:11.720: E/AndroidRuntime(1063):at net.appersian.android.wod.MainActivity.onCreate(MainActivity.java:54) 08-28 19:52:11.720:E/AndroidRuntime(1063):at android.app.Activity。 (Activity.java:5008) 08-28 19:52:11.720:E/AndroidRuntime(1063):at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 08-28 19:52:11.720: E/AndroidRuntime(1063):at 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):at org.cryptonode.jncryptor.AES256JNCryptor.decryptV3Data(AES256JNCryptor.java:244) 08-28 20:54:10.496:W/System。 err(1487):at org.cryptonode.jncryptor.AES256JNCryptor.decryptV3Data(AES256JNCryptor.java:319) 08-28 20:54:10.496:W/System.err(1487):at org.cryptonode.jncryptor.AES256JNCryptor。 decryptData(AES256JNCryptor.java:276) 08-28 20:54:10.496:W/System.err(1487):at net.appersian.android.wod.MainActivity.onCreate(MainActivity.java:50) 08-28 20:54:10.496:W/System.err(1487):at android.app.Activity.performCreate(Activity.java:5008) 08-28 20:54:10.496:W/System.err(1487):at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 08-28 20:54:10.496:W/System.err(1487):at android.app.ActivityThread .performLaunchActivity(ActivityThread.java:2023) 08-28 20:54:10.496:W/System.err(1487):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 08-28 20:54 :10.496:W/System.err(1487):在android.app.ActivityThread.access $ 600(ActivityThread.java:130) 08-28 20:54:10.496:W/System.err(1487):在android。 app.ActivityThread $ H.handleMessage(ActivityThread.java:1195) 08-28 20:54:10.496:W/System.err(1487):at android.os.Handler.dispatchMessage(Handler.java:99) 08 -28 20:54:10.496:W/System.err(1487):at android.os.Looper.loop(Looper.java:137) 08-28 20:54:10.496:W/System.err(1487) :at android.app.ActivityThread.main(ActivityThread.java:4745) 08-28 20:54:10.496:W/System.err(1487):at java.lang.reflect.Method.invokeNative(Native Method) 08-28 20:54:10.496:W/System.err(1487):at java.lang.reflect.Method.invoke(Method.java:511) 08-28 20:54:10.496:W/System。 err(1487):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786) 08-28 20:54:10.496:W/System.err(1487):at com.android。 internal.os.ZygoteInit.main(ZygoteInit.java:553) 08-28 20:54:10.496:W/System.err的(1487):在dalvik.system.NativeStart.main(本機方法)

回答

1

我在這個問題上工作了很多,我問Github上的開發人員,最後,我發現問題是密碼字符串,而不是因爲密碼錯誤,是因爲密碼字符串中的unicode字符,在某些原因,如果我們想要在所有設備和平臺上都得到很好的編碼/解碼工作,最好爲密碼選擇ascii字符。

+0

非常好,我想加密我的電腦上的圖像,並在我的應用程序中解密它使用什麼代碼或庫?請指導我我搜索並找到了'隱藏'的臉書,但它不能用於電腦或我不知道如何做到這一點,你能告訴我你的加密和AES解密鏈接? – mmlooloo 2014-09-09 09:51:41

+0

JNCryptor在Java和Android上很慢,但是,我做了一個獨立的類來加密和解密,在Android或Java(對於PC)中,我可以將它分享給Github,如果你想要 – 2014-09-09 10:14:32

+0

非常好的主意,請張貼鏈接非常感謝 !!! – mmlooloo 2014-09-09 10:16:28

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(); 

我希望它的作品,但讓我知道!

並在最後如果它不起作用,請確保您的文件已正確加密。

+0

我測試你的代碼,並且我沒有什麼區別,所以我決定用我自己的代碼加密一張圖片,然後再解密它,所有的東西都以這種方式工作。我不知道如何解決這個問題,我想現在就知道了!是我必須再次使用java加密所有文件!如果你知道更好的加密方法,請讓我知道!感謝您的支持。 – 2014-08-29 11:32:23

+0

@AliAbdolahi如果您的問題沒有解決,那麼我不會將此標記爲已接受。它值得+1,因爲它突出了代碼中的錯誤,並且*可能*是唯一的問題。附註:我是JNCryptor的作者,所以我有個人興趣看到你的問題完全解決。 – 2014-08-29 12:49:48