java 密码的默认 AES 长度

Default AES length for java crypto cipher

我想查询 javax.crypto.Cipher 库中的默认 AES 密钥长度和 symmetric/asymmetric 模式。

我创建了一个密码如下(我在 Java8 & Scala 2.12.x):

val mycipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
mycipher.init(Cipher.ENCRYPT_MODE, givemeKey(), givemeIV())

private def givemeKey(keyPass: Option[String] = None) = {
    new SecretKeySpec(new BASE64Decoder().decodeBuffer('XxXxXxYyYyYXxZzZz-5z3y**\n'), "AES")
}

private def givemeIV() = {
    val myuuid = UUID.randomUUID().toString.split("-").mkString("").getBytes()
    val mybyteIV = new Array[Byte](16)
    System.arraycopy(myuuid, 0, mybyteIV, 0, 16)
    val returnIV = new IvParameterSpec(mybyteIV)
    returnIV
}

我确实查看了 Cipher 包的文档。我仍然有两个问题无法弄清楚,因此与您联系:

  1. 这里AES的长度是多少? AES-256 还是其他?
  2. 什么是'type'(对称或不对称)。我认为它是对称的 -- 只是想确认一下。

根据 javax.crypto.Cipherjavadocs,该字符串 ("AES/CBC/PKCS5Padding") 为您提供了 AES 密码算法。

没有默认的密钥长度。 (但是可以保证每个标准 Java SE 平台 支持 128 位的 AES 密钥。一些 Java SE 平台支持其他 AES 密钥长度(192 和 256 ) 还有。)

实际密钥长度不是算法名称/Cipher 对象的一部分。这将取决于 givemeKey 返回的任何密钥。但是在您的示例中,base64 编码的密钥字符串长度为 24 个字符,这意味着它不可能是 265 位密钥。

(计算一下。每个字符 6 位 x 24 个字符 == 最多 144 位。因此假设其中一些位是“信封”或“填充”,这看起来像是一个 128 位密钥。 )

AES 是一种对称密钥算法;参见 Wikipedia