【问题标题】:AES cypher in GCM mode with null byte IV in javaGCM模式下的AES密码,Java中的空字节IV
【发布时间】:2021-11-15 23:47:09
【问题描述】:

我必须使用 AES 密码在 GCM 模式下使用空字节 IV 加密 json 有效负载。

当我尝试使用密钥和 json 有效负载时,我得到的结果与预期不同。它只与 AES GCM MAC 部分不匹配。

这些是参数和我的源代码:

  • GCM_TAG_LENGTH= 16,

  • 十六进制对称密钥:083080D3D0C521C02CD3AE2134363D09EA50DFF914677FAB9E22F18F9C28A3B9

  • jsonPayload:{"Parameter1":"Value1","Parameter2":"Value2","Parameter3":"Value3"}

  • 输出(预期):EF6BA2FFA05B6985FE129E3CB6845C4EA1E94AE98D31A538A4E24906FB720D764D640894CD9 DE7CEC00114396651A1CCAEDCF480C57A959E925C04492B9CF85FC711FAB3CBED10DC2BA99A2B B063CEFF8DE1 P>

    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
    SecretKeySpec keySpec = new SecretKeySpec(secretkey, "AES");
    GCMParameterSpec gcmParameterSpec = new GCMParameterSpec(Integer.valueOf(WalletStaticTypes.GCM_TAG_LENGTH.getType()) * 8,newbyte[12]);
    cipher.init(Cipher.ENCRYPT_MODE, keySpec,gcmParameterSpec);
    byte[] encryptedPayLoad = cipher.doFinal(jsonPayload.getBytes("UTF-8"));
    Hex.encodeHexString(encryptedPayLoad,false);

【问题讨论】:

  • 我们没有看到 GCM 标签长度,也没有看到预期的结果(它来自哪里?)
  • 更新了 json 负载和密钥和标签长度的问题
  • mode with null byte IV 你知道吗,在 GCM 模式下重用密钥和 IV 会灾难性地破坏加密?

标签: java aes-gcm


【解决方案1】:

我注意到这是关于 Apple Pay 集成的,我设法从测试文档中使用

获得了相同的结果

GCMParameterSpec(128, ByteArray(12))

val cipher = Cipher.getInstance("AES/GCM/NoPadding")
    cipher.init(Cipher.ENCRYPT_MODE, finalKey, GCMParameterSpec(128, ByteArray(12)))
// AES Key 
083080D3D0C521C02CD3AE2134363D09EA50DFF914677FAB9E22F18F9C28A3B9
// JSON Payload (67 bytes), UTF-8 encoded: {"Parameter1":"Value1","Parameter2":"Value2","Parameter3":"Value3"}

Output:
E3EF6BA2FFA05B6985FE129E3CB6845C4EA1E94AE98D31A538A4E24906FB720D764D640894CD9DE7CEC00114396651A1CCAEDCF480C57A959E925C04492B9CF85FC711FAB3CBED10DC2BA99A2BB063CEFF8DE1

【讨论】:

    猜你喜欢
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2021-09-30
    • 2012-07-17
    • 2014-05-12
    • 1970-01-01
    • 2017-10-21
    相关资源
    最近更新 更多