Я хочу сделать шифрование AES-256-GCM на Android API 15+. Вот мой код:
import android.util.Base64
import java.security.SecureRandom
import javax.crypto.Cipher
import javax.crypto.SecretKey
import javax.crypto.spec.SecretKeySpec
import javax.crypto.spec.IvParameterSpec
fun encryptGCM(key: String, plaintext: String): String {
val decodedKey = Base64.decode(key, 0)
val secretKey: SecretKey = SecretKeySpec(decodedKey, 0, decodedKey.size, "AES")
val secureRandom = SecureRandom()
val iv = ByteArray(12)
secureRandom.nextBytes(iv)
val cipher = Cipher.getInstance("AES/GCM/NoPadding")
cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(iv))
val cipherText: ByteArray = cipher.doFinal(plaintext.toByteArray())
return Base64.encodeToString(iv + cipherText, 0)
}
У меня есть два вопроса:
Так как я нацеливаюсь на pre v4.4, мне нужно беспокоиться о SecureRandom
Уязвимость в этом посте, учитывая мой вариант использования? https://android -developers.googleblog.com / 2013/08 / some-securerandom-ideas.html
Используется IvParameterSpec
вместо GCMParameterSpec
отлично? Я использую версию Iv
, потому что GcmParameterSpec
доступен только на уровне API 19+. Насколько я понимаю, единственное отличие заключается в том, что версия GCM позволяет мне указывать длину тега, но длина тега по умолчанию в моем коде будет 128, что кажется нормальным.
Спасибодля любого понимания!