【问题标题】:using RNCryptor on android在安卓上使用 RNCryptor
【发布时间】:2014-10-22 19:07:58
【问题描述】:

我有一些使用 RNCryptor 加密的图像文件,我想解密它们并将它们用作 Framelayout 的背景。 我浏览了示例文件,但我的应用程序强制在一段时间后关闭并且没有显示任何图像。 我用 JNCryptor library

我将加密的图像放在原始文件夹中,如下所示:

这是我活动中的代码:

@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): 致命异常: main 08-28 19:52:11.720: E/AndroidRuntime(1063): java.lang.RuntimeException: 无法启动活动 ComponentInfo{net.appersian.android.wod/net.appersian.android.wod.MainActivity}: java.lang 。空指针异常 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(Native Method) 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): 在 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): 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): 在 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.printStackTrace() 来尝试/捕获,这是我的新 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): at 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:10.496: W/System.err(1487): 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 08-28 20:54:10.496: W/System.err(1487): 在 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): 在 android.os.Handler.dispatchMessage(Handler.java:99) 08-28 20:54:10.496: W/System.err(1487): 在 android.os.Looper.loop(Looper.java:137) 08-28 20:54:10.496: W/System.err(1487): 在 android.app.ActivityThread.main(ActivityThread.java:4745) 08-28 20:54:10.496: W/System.err(1487): 在 java.lang.reflect.Method.invokeNative(Native Method) 08-28 20:54:10.496: W/System.err(1487): 在 java.lang.reflect.Method.invoke(Method.java:511) 08-28 20:54:10.496: W/System.err(1487): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 08-28 20:54:10.496: W/System.err(1487): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 08-28 20:54:10.496: W/System.err(1487): at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android encryption rncryptor jncryptor


    【解决方案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();
    

    我希望它有效,但请告诉我!

    最后,如果它不起作用,请确保您的文件已正确加密。

    【讨论】:

    • 我测试了你的代码,我没有得到任何不同,所以,我决定用我自己的代码加密一张图片,然后再次解密,一切都很好用这种方式!我不知道如何解决这个问题,我想现在就知道!是我必须用java再次加密所有文件!如果您知道更好的加密方法,请告诉我!感谢您的支持。
    • @AliAbdolahi 如果您的问题没有得到解决,那么我不会将此标记为已接受。它值得 +1,因为它突出显示了您的代码中的一个错误,并且 可能 是唯一的问题。旁注:我是 JNCryptor 的作者,所以我个人有兴趣看到你的问题完全解决。
    【解决方案2】:

    我在这个问题上做了很多工作,我在 Github 上询问了开发人员,最后我发现问题是密码字符串而不是因为密码错误,是因为密码字符串中的 unicode 字符,在某种原因,如果我们想要在所有设备和平台上都能很好地进行编码/解码,最好选择 ascii 字符作为密码。

    【讨论】:

    • 非常好我想在我的电脑上加密图像并在我的应用程序中解密你使用什么代码或库?请指导我搜索并找到conceal 用于facebook,但它不能在电脑上使用或者我不知道该怎么做,你能告诉我你的AES加密和解密的链接吗?
    • JNCryptor 在 Java 和 Android 上非常慢,但是,我做了一个独立的类来加密和解密,在 Android 或 Java(PC)上,如果你愿意,我可以分享到 Github 跨度>
    • 这里是:gist.github.com/aliab/8cc7c4b9f8cbda263dc7 我创建了一个 Android Helper 类,以便在 android 上轻松工作,但是顺便说一下,如果你想在 java 中使用它,只需将 Fileinputstream 转换为 byte[] 并使用Ecryptor.java 类 ;)
    • @AliAbdolahi 密码中的 Unicode 字符应该不是问题。请您在此处更新您的问题或 GitHub 问题,提供有关您的问题的更多信息吗?正如我在 GitHub 中提到的,您的替换代码存在缺陷(关于密钥生成)。
    猜你喜欢
    • 2017-03-29
    • 1970-01-01
    • 2013-08-10
    • 2012-05-10
    • 2014-02-28
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    • 2012-05-24
    相关资源
    最近更新 更多