使用Android NDK加密从普通Android应用程序传递的数据

使用Android NDK加密从普通Android应用程序传递的数据,android,encryption,android-ndk,blowfish,Android,Encryption,Android Ndk,Blowfish,是否有可能并且值得尝试使用android NDK开发一些服务器应用程序,这些应用程序将加密从普通基于Java的应用程序传递给它的数据(或者只使用一些内置的Linux加密库) 我尝试使用密码库,但用AES加密2MB文件几乎花了一分钟。直到安卓2.3(?)版本,河豚才有密码。我怀疑它会快得多 我在Symbian上使用blowfish进行加密,速度要快得多(不到5-10秒),所以我认为在android上,由于使用Java虚拟机,速度要慢得多,我想试试原生应用程序 以前有人做过吗 编辑:在NDK中加密要

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

我尝试使用密码库,但用AES加密2MB文件几乎花了一分钟。直到安卓2.3(?)版本,河豚才有密码。我怀疑它会快得多

我在Symbian上使用blowfish进行加密,速度要快得多(不到5-10秒),所以我认为在android上,由于使用Java虚拟机,速度要慢得多,我想试试原生应用程序

以前有人做过吗


编辑:在NDK中加密要快得多。在那里做。对于AES有一个类似的问题,答案是相同的:

您测试的是哪个版本的Android?请记住,从Froyo开始,有一个跟踪JIT,它对于加密库中的数学密集型循环应该非常有效


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

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

如果您只想加密进入sql存储的数据,可以签出SQLCipher()


您还可以尝试使用一些bouncy castle库()。它们可能比内置的android one更快,或者它们可能有一个你可以使用的blowfish库。

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

当然,可以使用外部库进行加密。例如,您可以使用openssl。唯一的问题是存在于Java和C代码之间的JNI层的影响有多大。若您需要向C传递大量数据,那个么JNI层可能会否定拥有本机库的好处。最好将更多的功能从Java移到C,这样应该加密的数据只能在C中处理。例如,网络堆栈和加密可以是C语言,而用户界面可以是Java语言。这只是一个建议,您应该更清楚这是否可行。

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

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

我在Java中实现了很多加密算法,在这方面它肯定比C/C++慢(很多)。我没有发现Skein在Oracle JVM上的运行速度比100 MB/s快多少。如果您实现AES,请尝试获得一个良好的展开循环(例如,一次迭代8轮),并确保您的应用程序不会执行任何不必要的内存复制。我也尝试在NDK中实现AES。你能分享一下你所做的吗?您是否在NDK项目中使用了其他AES提供商,或者您推出了自己的实现?我使用的是blowfish,实现是从中获取的。如果您使用bouncy castle库,我相信您必须对它们进行一些修改,因为它们已经在android堆栈中了,但对应用程序开发人员来说不是公开的。在froyo和旧版本上加密并没有太大区别。但在我在NDK中实现它之后,1MB文件将在大约1秒内加密(相比之下,使用gnuCrypto java lib只需30-60秒)。所以我会认为你的答案是正确的——在NDK做。