在Android API级别15+上进行AES-GCM加密;

在Android API级别15+上进行AES-GCM加密;,android,security,encryption,kotlin,aes,Android,Security,Encryption,Kotlin,Aes,我想在Android API 15+上进行AES-256-GCM加密。这是我的密码: 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 encr

我想在Android API 15+上进行AES-256-GCM加密。这是我的密码:

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)
}
我有两个问题:

  • 由于我的目标是v4.4之前的版本,考虑到我的用例,我是否需要担心这篇博文中的
    SecureRandom
    漏洞

  • 使用
    IvParameterSpec
    而不是
    GCMParameterSpec
    可以吗?我使用的是
    Iv
    版本,因为
    GcmParameterSpec
    仅在API级别19+中可用。据我所知,唯一的区别是GCM版本允许我指定标记长度,但代码中的默认标记长度将是128,这似乎很好


  • 谢谢你的洞察力

    根据Maarten的文章,你的第二个问题很好。对于第一个问题,你的链接实际上通过代码提供答案!