Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android上用于加密和解密的最快密码_Android_Encryption_Aes_Blowfish - Fatal编程技术网

Android上用于加密和解密的最快密码

Android上用于加密和解密的最快密码,android,encryption,aes,blowfish,Android,Encryption,Aes,Blowfish,我在Android上使用Cipher方法进行了一些测试,对文本(String)进行加密,并将其解密回原始字符串 我需要最快的方法(最好的性能)。而且似乎河豚是最快的 我说得对吗?还是有更快的?还有其他方法吗?我只需要加密字符串 我也在考虑将河豚的C/C++实现添加到Android(NDK,Cmake)。性能应该更好 测试代码: companion object { private const val PLAY_TEST_TEXT = "Some Text Line !" pri

我在Android上使用
Cipher
方法进行了一些测试,对文本(
String
)进行加密,并将其解密回原始字符串

我需要最快的方法(最好的性能)。而且似乎河豚是最快的

我说得对吗?还是有更快的?还有其他方法吗?我只需要加密字符串


我也在考虑将河豚的C/C++实现添加到Android(NDK,Cmake)。性能应该更好

测试代码:

companion object {
    private const val PLAY_TEST_TEXT = "Some Text Line !"

    private val ISO = charset("ISO-8859-1") // is used because we can get our bytes from string back without any problems
    private val UTF = charset("UTF-8")
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    val handler = Handler()
    handler.postDelayed({

        testFastestCipher("AES/ECB/PKCS5Padding", "AES", false)
        testFastestCipher("AES/CBC/PKCS5Padding", "AES", true)
        testFastestCipher("AES/CFB/PKCS5Padding", "AES", true)
        testFastestCipher("AES/OFB/PKCS5Padding", "AES", true)
        testFastestCipher("AES/CTR/PKCS5Padding", "AES", true)

        testFastestCipher("Blowfish/ECB/PKCS5Padding", "Blowfish", false)
        testFastestCipher("Blowfish/CBC/PKCS5Padding", "Blowfish", true)
        testFastestCipher("Blowfish/CFB/PKCS5Padding", "Blowfish", true)
        testFastestCipher("Blowfish/OFB/PKCS5Padding", "Blowfish", true)
        testFastestCipher("Blowfish/CTR/PKCS5Padding", "Blowfish", true)
        testFastestCipher("Blowfish/CTR/PKCS5Padding", "Blowfish", true)

        if (Build.VERSION.SDK_INT >= 28) {
            testFastestCipher("ChaCha20/None/NoPadding", "ChaCha20", true)
        }
    }, 2000)
}

private fun testFastestCipher(transformation: String, keyAlgorithm: String, requiresIV: Boolean) {

    val cipherEnc = Cipher.getInstance(transformation)
    val cipherDec = Cipher.getInstance(transformation)

    val secretKeyString = when (keyAlgorithm) {
        "ChaCha20" -> "aNdRgUkXp2s5v8y/B?E(G+KbPeShVmYq"
        else -> "C&E)H@McQfTjWnZr"
    }
    val secretKey = SecretKeySpec(secretKeyString.toByteArray(), keyAlgorithm)

    if (requiresIV) {
        val ivKey = when (keyAlgorithm) {
            "Blowfish" -> "12345678"
            "ChaCha20" -> "123456789123"
            else -> "1234567891230000"
        }
        val iv = IvParameterSpec(ivKey.toByteArray())
        cipherEnc.init(Cipher.ENCRYPT_MODE, secretKey, iv)
        cipherDec.init(Cipher.DECRYPT_MODE, secretKey, iv)
    } else {
        cipherEnc.init(Cipher.ENCRYPT_MODE, secretKey)
        cipherDec.init(Cipher.DECRYPT_MODE, secretKey)
    }

    var encMsg = ""
    var decMsg = ""

    var timeTook = System.currentTimeMillis()

    for (i in 0..5000) {
        encMsg = encryptMsg(PLAY_TEST_TEXT, cipherEnc)
        decMsg = decryptMsg(encMsg, cipherDec)
    }

    timeTook = System.currentTimeMillis() - timeTook

    textView.text = "${textView.text}\n\n$transformation\nEnc (bytes displayed as ISO-8859-1): $encMsg\nDec: $decMsg\n$timeTook ms"
}

private fun encryptMsg(message: String, cipher: Cipher): String {
    val bytes = cipher.doFinal(message.toByteArray(UTF))
    return String(bytes, ISO)
}

private fun decryptMsg(cipherText: String, cipher: Cipher): String {
    val encryptedString = cipherText.toByteArray(ISO)
    return String(cipher.doFinal(encryptedString), UTF)
}
结果:

更新

更多结果(包括外部库ChaCha和内部库):

1)Android 28模拟器x86

因为我在0..500000

ChaCha (from third-party library bcprov-jdk15on) 3724 ms
Blowfish/ECB/PKCS5Padding 4216 ms
Blowfish/CBC/PKCS5Padding 4508 ms
Blowfish/OFB/PKCS5Padding 4991 ms
Blowfish/CTR/PKCS5Padding 5158 ms
Blowfish/CFB/PKCS5Padding 5296 ms
ChaCha20/None/NoPadding 5530 ms
AES/OFB/PKCS5Padding 6649 ms
AES/CTR/PKCS5Padding 6703 ms
AES/CFB/PKCS5Padding 7126 ms
AES/ECB/PKCS5Padding 10170 ms
AES/CBC/PKCS5Padding 10619 ms
2)联想安卓21 ARM64

因为我在0..50000

Blowfish/ECB/PKCS5Padding 3270 ms
Blowfish/CTR/PKCS5Padding 3404 ms
Blowfish/CBC/PKCS5Padding 3483 ms
Blowfish/CFB/PKCS5Padding 3490 ms
Blowfish/OFB/PKCS5Padding 3502 ms
AES/CTR/PKCS5Padding 3577 ms
AES/CFB/PKCS5Padding 3692 ms
AES/OFB/PKCS5Padding 3709 ms
AES/ECB/PKCS5Padding 4739 ms
AES/CBC/PKCS5Padding 5248 ms
ChaCha (from third-party library bcprov-jdk15on) 10195 ms
ChaCha (from third-party library bcprov-jdk15on) 3969 ms
Blowfish/ECB/PKCS5Padding 5282 ms
Blowfish/CTR/PKCS5Padding 5569 ms
AES/CTR/PKCS5Padding 6160 ms
Blowfish/CBC/PKCS5Padding 6201 ms
AES/CFB/PKCS5Padding 6217 ms
AES/CBC/PKCS5Padding 6320 ms
Blowfish/OFB/PKCS5Padding 6382 ms
Blowfish/CFB/PKCS5Padding 6808 ms
AES/OFB/PKCS5Padding 7224 ms
AES/ECB/PKCS5Padding 7247 ms
3)三星安卓16 ARMv7

因为我在0..50000

Blowfish/ECB/PKCS5Padding 3270 ms
Blowfish/CTR/PKCS5Padding 3404 ms
Blowfish/CBC/PKCS5Padding 3483 ms
Blowfish/CFB/PKCS5Padding 3490 ms
Blowfish/OFB/PKCS5Padding 3502 ms
AES/CTR/PKCS5Padding 3577 ms
AES/CFB/PKCS5Padding 3692 ms
AES/OFB/PKCS5Padding 3709 ms
AES/ECB/PKCS5Padding 4739 ms
AES/CBC/PKCS5Padding 5248 ms
ChaCha (from third-party library bcprov-jdk15on) 10195 ms
ChaCha (from third-party library bcprov-jdk15on) 3969 ms
Blowfish/ECB/PKCS5Padding 5282 ms
Blowfish/CTR/PKCS5Padding 5569 ms
AES/CTR/PKCS5Padding 6160 ms
Blowfish/CBC/PKCS5Padding 6201 ms
AES/CFB/PKCS5Padding 6217 ms
AES/CBC/PKCS5Padding 6320 ms
Blowfish/OFB/PKCS5Padding 6382 ms
Blowfish/CFB/PKCS5Padding 6808 ms
AES/OFB/PKCS5Padding 7224 ms
AES/ECB/PKCS5Padding 7247 ms

ChaCha(来自第三方库bcprov-jdk15on)在不同设备上的效果最好或最差…

我之前一直在寻找一种快速密码,对于其他平台,您可以看到以下站点

我发现查查密码很快,而且仍然普遍可用。AES的速度可能取决于平台版本是否支持硬件加速(Blowfish尚未被破解,但其作者已表示密码应被视为过时)


由于改进-密码模式(ctr、ofb)不需要填充,您可以在那里使用'NoPadding'值

“我也在考虑将Blowfish的C/C++实现添加到Android(NDK、Cmake)。性能应该更好。”Android的实现,代码< javax·CuthoOut/Case> API已经在原生代码中有相当长的时间了。@通用SWARE测试了 AES/ECP/NopAudi/<代码>,用Android默认SDK加密文本,并用Android“C++”使用“微小AES C”加密文本。最新的方法工作得更快可能有些环境中软件中的河豚比软件中的AES快,但未来属于AES。它在64位CPU上更快,并且现在和将来在许多CPU上都有硬件支持。该示例基本上没有Java代码,而您所问的代码是从Java内部驱动测试循环。确保在测试之间进行“苹果对苹果”的比较。另外,在Android 6.0中切换到本机代码;如果您正在(或担心)较旧的设备上进行测试,那么NDK实现可能很值得考虑。我相当确定,在4.1时间段内,我们仍然在使用Bouncy Castle for
javax.crypto
,这是用Java实现的。我本以为OpenSSL会有一些改进。但是,我从未运行过此类基准测试,所以
”\_(ツ)_/“
。那他们为什么在那里为CTR/OFB指定填充?我发现ChaCha只在28安卓上可用。Mb安卓是否有一些库?@user924您可以尝试使用BouncyCastle提供程序。填充-在类似流的模式下,如果您指定,您可以使用填充,但没有necessary@user924BouncyCastle是纯内联imple无需使用
ChaChaEngine
您可以将默认java加密与
ChaCha
cipher()
Security一起使用。addProvider(BouncyCastleProvider())
返回-1(添加提供程序时的首选位置,如果提供程序已安装,则返回-1)