在Android上使用RNCryptor

问题描述:

我有一些使用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(本机方法)

我在这个问题上工作了很多,我问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

第一:

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