【问题标题】:Using Android NDK for encryption of data passed from normal android app使用 Android NDK 加密从普通 Android 应用程序传递的数据
【发布时间】:2011-02-16 08:13:29
【问题描述】:

是否有可能并且值得尝试使用 android NDK 开发一些服务器应用程序,该应用程序将加密从普通基于 Java 的应用程序传递给它的数据(或仅使用一些内置的 Linux 加密库)?

我尝试使用 Cipher 库,但用 AES 加密 2MB 文件花了将近一分钟。在 Android 2.3(?)之前,河豚在 Cipher 中不可用。我怀疑它会更快。

我在 Symbian 上使用河豚进行加密,它的速度要快得多(不到 5-10 秒),所以我认为在 android 中它会因为使用 Java 虚拟机而变慢,我想尝试使用本机应用程序。

以前有人做过吗?

编辑:NDK 中的加密速度要快得多。在那里做。 AES 有一个类似的问题,答案相同:AES decryption on Android too slow to be usable. Will NDK be faster? Other ideas?

【问题讨论】:

  • 我在 Java 中实现了相当多的加密算法,在这方面它肯定比 C/C++ 慢很多。我没有让 Skein 在 Oracle JVM 上运行比 100 MB/s 快得多。如果您实施 AES,请尝试获得一个良好的展开循环(例如,一次迭代 8 轮)并确保您的应用程序不会执行任何不必要的内存复制。
  • 我也在尝试在 NDK 中实现 AES。你能分享一下你做了什么吗?您是否在 NDK 项目中为 AES 使用了其他提供商,或者您是否推出了自己的实现?
  • 我使用的是河豚,实现取自there

标签: android encryption android-ndk blowfish


【解决方案1】:

在使用流解密时,Android 2.2 中的 BouncyCastle 使用 AES/CBC/PKCS5 速度非常慢。 CPU 将达到 100%,吞吐量为 5kb/秒。

使用 Chilkat 速度更快,并且 CPU 使用率保持在较低水平(即使在模拟器中也是如此)。 但是 Chilkat 没有提供 InputStream 来处理流解密,而是在内部缓冲所有加密字节(直到发生堆空间错误)。因此,您必须自己管理流解密(例如,通过为每个块初始化 chilkat...)

【讨论】:

    【解决方案2】:

    您要针对哪个版本的 Android 进行测试?请记住,从 Froyo 开始,有一个跟踪 JIT 应该可以很好地用于加密库中的数学密集型循环。

    对于旧版本,您可能希望使用 NDK 来实现,是的。不过,我不知道您为什么需要服务器 - 只需编译任何好的/快速的加密库并使用 NDK 围绕它制作一个包装器。然后,您可以简单地使用基于 java 的应用程序中的包装器。

    【讨论】:

    • 在 froyo 和旧版本上的加密没有太大区别。但是在我在 NDK 中实现它之后,1MB 文件在大约 1 秒内被加密(与使用 gnuCrypto java lib 的 30 - 60 秒相比)。所以我会认为你的回答是正确的——在 NDK 中做。
    【解决方案3】:

    要回答您的问题,是的,您可能会编写一些可以与 NDK 一起运行的东西,但我不明白您为什么需要这样做。

    如果您只想加密进入 sql 存储的数据,您可以查看 SQLCipher (https://guardianproject.info/code/sqlcipher/)

    您也可以尝试使用一些充气城堡库 (http://www.bouncycastle.org/java.html)。它们可能比内置的 android 更快,或者它们可能有一个可供您使用的河豚库。

    【讨论】:

    • 如果你确实使用了充气城堡库,我相信你必须对它们进行一些修改,因为它们已经在 android 堆栈中,但不向应用程序开发人员公开。
    【解决方案4】:

    这不是开源的,但从性能的角度来看Chillkat是我发现的最好的。

    【讨论】:

      【解决方案5】:

      当然可以使用外部库进行加密。您可以使用 openssl,例如 https://github.com/guardianproject/openssl-android。唯一的问题是存在于 Java 和 C 代码之间的 JNI 层的影响会有多大。如果您需要将大量日期传递给 C 并返回,那么 JNI 层可能会否定拥有本机库的好处。将更多功能从 Java 迁移到 C 会更好,这样应该加密的数据只能在 C 中处理。例如,网络堆栈和加密可以使用 C 语言,而用户界面使用 Java。这只是一个建议,您应该知道是否可行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 2011-06-11
        • 1970-01-01
        • 1970-01-01
        • 2012-11-05
        相关资源
        最近更新 更多