当前位置: 首页 > 知识库问答 >
问题:

在Android上使用RNCryptor

缪修德
2023-03-14

我有一些用RNCryptor加密的图像文件,我想对它们进行解密,并将它们用作框架布局的背景。我浏览了示例文件,但我的应用程序force在一段时间后关闭,没有显示任何图像。我使用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-2819:52:11.720:E/AndroidRuntime(1063):致命异常:main 08-2819:52:11.720:E/AndroidRuntime(1063):java。lang.RuntimeException:无法启动活动组件信息{net.appersian.android.wod/net.appersian.android.wod.MainActivity}:java。lang.NullPointerException 08-28 19:52:11.720:E/AndroidRuntime(1063):在android上。应用程序。活动线程。performLaunchActivity(ActivityThread.java:2059)08-28 19:52:11.720:E/AndroidRuntime(1063):在android上。应用程序。活动线程。handleLaunchActivity(ActivityThread.java:2084)08-28 19:52:11.720:E/AndroidRuntime(1063):在android上。应用程序。活动线程。在android上访问$600(ActivityThread.java:130)08-2819:52:11.720:E/AndroidRuntime(1063)。应用程序。ActivityThread$H.handleMessage(ActivityThread.java:1195)08-2819:52:11.720:E/AndroidRuntime(1063):在android上。操作系统。汉德勒。dispatchMessage(Handler.java:99)08-2819:52:11.720:E/AndroidRuntime(1063):在android上。操作系统。活套。loop(Looper.java:137)08-2819:52:11.720:E/AndroidRuntime(1063):在android上。应用程序。活动线程。main(ActivityThread.java:4745)08-2819:52:11.720:E/AndroidRuntime(1063):在java。朗,反思一下。方法Invokenactive(本机方法)08-28 19:52:11.720:E/AndroidRuntime(1063):在java。朗,反思一下。方法invoke(Method.java:511)08-2819:52:11.720:E/AndroidRuntime(1063):在com上。Android内部的操作系统。ZygoteInit$MethodandArgscaler。运行(zyteinit.java:786)08-2819:52:11.720:E/AndroidRuntime(1063):在com上。Android内部的操作系统。合子体。main(zyteinit.java:553)08-2819:52:11.720:E/AndroidRuntime(1063):在dalvik。系统原生艺术。main(原生方法)08-2819:52:11.720:E/AndroidRuntime(1063):由java引起。lang.NullPointerException 08-28 19:52:11.720:E/AndroidRuntime(1063):在网络上。绥靖主义者。Android哇。主要活动。onCreate(MainActivity.java:54)08-2819:52:11.720:E/AndroidRuntime(1063):在android上。应用程序。活动performCreate(Activity.java:5008)08-2819:52:11.720:E/AndroidRuntime(1063):在android上。应用程序。仪器仪表。callActivityOnCreate(Instrumentation.java:1079)08-28 19:52:11.720:E/AndroidRuntime(1063):在android上。应用程序。活动线程。performLaunchActivity(ActivityThread.java:2023)08-28 19:52:11.720:E/AndroidRuntime(1063):。。。还有11个

解密文件我做错了什么?

更新:我添加了e.printStackTrace()来尝试/捕获,下面是我的新日志:

08-28 20:54:10.496:W/系统。err(1487):组织。加密节点。jncryptor。InvalidHMAceException:HMAC值不正确。08-28 20:54:10.496:W/系统。err(1487):在org。加密节点。jncryptor。AES256JNCryptor。decryptV3Data(AES256JNCryptor.java:244)08-28 20:54:10.496:W/System。err(1487):在org。加密节点。jncryptor。AES256JNCryptor。decryptV3Data(AES256JNCryptor.java:319)08-28 20:54:10.496:W/System。err(1487):在org。加密节点。jncryptor。AES256JNCryptor。解密数据(AES256JNCryptor.java:276)08-28 20:54:10.496:W/System。err(1487):净空。绥靖主义者。Android哇。主要活动。onCreate(MainActivity.java:50)08-28 20:54:10.496:W/System。err(1487):在android上。应用程序。活动performCreate(Activity.java:5008)08-28 20:54:10.496:W/System。err(1487):在android上。应用程序。仪器仪表。callActivityOnCreate(Instrumentation.java:1079)08-28 20:54:10.496:W/System。err(1487):在android上。应用程序。活动线程。performLaunchActivity(ActivityThread.java:2023)08-28 20:54:10.496:W/System。err(1487):在android上。应用程序。活动线程。handleLaunchActivity(ActivityThread.java:2084)08-28 20:54:10.496:W/System。err(1487):在android上。应用程序。活动线程。访问$600(ActivityThread.java:130)08-28 20:54:10.496:W/System。Android:1487。应用程序。ActivityThread$H.handleMessage(ActivityThread.java:1195)08-28 20:54:10.496:W/System。err(1487):在android上。操作系统。汉德勒。dispatchMessage(Handler.java:99)08-28 20:54:10.496:W/System。err(1487):在android上。操作系统。活套。loop(Looper.java:137)08-28 20:54:10.496:W/System。err(1487):在android上。应用程序。活动线程。main(ActivityThread.java:4745)08-28 20:54:10.496:W/System。在爪哇(1487):呃。朗,反思一下。方法invokenactive(本机方法)08-28 20:54:10.496:W/System。err(1487):在java。朗,反思一下。方法调用(Method.java:511)08-28 20:54:10.496:W/System。err(1487):在com.Android内部的操作系统。ZygoteInit$MethodandArgscaler。运行(zyteinit.java:786)08-2820:54:10.496:W/System。err(1487):在com.Android内部的操作系统。合子体。main(ZygoteInit.java:553)08-28 20:54:10.496:W/System。呃(1487):在达尔维克。系统原生艺术。主(本机方法)

共有2个答案

卫沈义
2023-03-14

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

於乐语
2023-03-14

第一:

http://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html#available()

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

请注意,虽然InputStream的一些实现将返回流中的总字节数,但许多实现不会返回。使用此方法的返回值来分配用于保存此流中所有数据的缓冲区永远都是不正确的

我不确定这些有什么问题,但让我们试试这个:

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

我希望它能起作用,但请告诉我!!

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

 类似资料:
  • 问题内容: 有人尝试过使用Android应用程序吗? 可能吗?我试图从中使用Jar,并收到以下异常: 我使用的代码非常简单 我有,,和在我的目录中。 在我的服务器应用程序中,此代码可以在相同的库中正常工作。 问题答案: msgpack :可在Android上正常使用 msgpack-rpc :适用于Android,但有一个警告。 具体来说,您需要为API级别8(Android 2.2.1)添加以下

  • 我想实现与以下2个请求旋转: 1。在显示选择项列表时,文本如下图所示左对齐。4. 2。在选择一个项目后,我想让所选的一个显示右对齐,如下图所示。 我的旋转器布局旋转器布局如下: 和适配器的getView如下所示: 但是,如果将行改为. 将显示为picture.3和picture.4. 如何修改以同时到达picture.1和picture.4?

  • 问题内容: 在浏览Android WebView文档时遇到了ServiceWorkerController,并决定尝试一下。不幸的是,我无法截获任何电话。我知道WebViewClient.shouldInterceptRequest,但有兴趣了解有关ServiceWorkerController的更多信息。不幸的是,这些文档比我下面已经实现的稀疏。任何帮助,将不胜感激。 我整理了一个由单个Acti

  • 问题内容: 有没有人有关于在SQLite中从Android上的libGDX存储数据的任何提示。我对Android SDK中使用的技术非常熟悉,但是我不知道如何从libGDX调用这些Android数据库函数。我知道从libGDX调用函数会使我的游戏无法在桌面上使用,但是我可以解决这个问题。 问题答案: 一种方法总是在您的主项目中创建一个界面,我们称它为。然后,让桌面和Android应用程序/活动都实

  • 问题内容: 我在Android的OpenGL-ES 3.0中使用的工作代码如下所示: 我的问题是在第三行上将结果转换为to 。被声明为返回一个: 在我的测试平台上,该函数返回的子类,因此强制转换有效,但对于支持OpenGL-ES 3+的所有平台或Android版本进行此假设似乎并不十分安全。尽管看起来很合理,但我还没有找到任何可以保证它的文档,如果可以保证,似乎应该将该函数声明为returning

  • 问题内容: 我正在尝试在Android的Java应用程序中使用Mozilla Rhino 评估一些JavaScript。我正在使用Eclipse + ADT插件。 首先,我尝试仅从Mozilla的网站下载Rhino .jar文件,并将其作为Eclipse中的库添加到项目中。Eclipse很好地识别了它并编译了该应用程序。但是,在运行它时,调用时会出现异常(有关堆栈跟踪,请参见下文)。 然后,我尝试