首页 > 解决方案 > AES-256-GCM 解码

问题描述

我尝试使用java7实现AES-256-GCM解码我在GCM中遇到mac check failure response请大家帮帮我,谢谢。

import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

  public static void main(String[] args) throws Exception {
    String iv = "35d117c42d1c1835420b6b9942dd4f1b"; // utf-8
    String key = "3a7bd3e2360a3d29eea436fcfb7e44c7"; // utf-8
    String hexCipherString = "07a604fc0c143a6e"; // hex
    String hexAuthTagString = "984e81176ff260717beb184db3d73753"; //hex

    byte[] decodedCipherHexBtye = Hex.decodeHex(hexCipherString.toCharArray());
    byte[] base64Cipher = Base64.decodeBase64(decodedCipherHexBtye);
    byte[] decodedAuthTagHex = Hex.decodeHex(hexAuthTagString.toCharArray());
    byte[] base64AuthTag = Base64.decodeBase64(decodedAuthTagHex);

    SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES");
    byte[] gcmIv = iv.getBytes("UTF-8");

    Security.addProvider(new BouncyCastleProvider());
    Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "BC");
    GCMParameterSpec params = new GCMParameterSpec(base64AuthTag.length * Byte.SIZE, gcmIv);
    cipher.init(Cipher.DECRYPT_MODE, skeySpec, params);
    cipher.updateAAD(base64AuthTag);
    byte[] result = cipher.doFinal(base64Cipher);
    System.out.println(Base64.encodeBase64(result));
  }

期待Base64Encode的预期结果:dGVzdA==

标签: java

解决方案


如何解决安全警告注释以实现安全代码。

警告中的核心问题是每次加密都需要一个随机生成的 IV(一组真正的随机字节)

当您制作 Cypher 时,这里是使用 Java 8 Oracle SE的具体示例

       val cipher = Cipher.getInstance("some scheme", "some provider");

那么当我们安全地使用 Cypher 时,我们需要一个真正的随机初始化向量 IV 来正确解决这个警告也指向我们的问题,

事实证明,至少在 Oracle Java 8 中这很容易,

使用上述密码

    cipher.getIV()

密码对象的实例方法是安全的,请参见

通常与IvParameterSpec一起使用

    ivParams = IvParameterSpec( cipher.getIV())
    cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);

推荐阅读