当前位置: 首页 > 知识库问答 >
问题:

JAVA中绕过认证的AES GCM解密

丌官翰采
2023-03-14

我有一些AES/GCM加密的数据,想解密它。我希望绕过身份验证对其进行解密,因为数据不包含身份验证信息(数据是由第三方应用程序加密的)。我尝试用javax.crypto包解密,它总是抛出标记不匹配错误。有没有办法绕过这个标记检查,解密数据。数据用AES128加密,使用12字节初始化向量。

编辑:我得到了这个问题的临时解决方案。不确定这是不是正确的方法。

            Key key = new SecretKeySpec(hlsKey, "AES");
            GCMParameterSpec gCMParameterSpec = new     GCMParameterSpec(96, initialisationVector);
            final Cipher c = Cipher.getInstance("AES/GCM/NoPadding", "BC");
            c.init(Cipher.DECRYPT_MODE, key, gCMParameterSpec);

            byte[] nodata = new byte[len * 2];
            System.arraycopy(cipherText, 0, nodata, 0, len);
            byte[] plaindata = new byte[len * 2];
            try { 

                int decrypted_index = 0;
                while (decrypted_index < len) {
                    int cp = c.update(nodata, decrypted_index, nodata.length - decrypted_index, plaindata, decrypted_index);//doFinal(nodata);
                    decrypted_index += cp;
                }
               if(decrypted_index>=len){
                   System.arraycopy(plaindata, 0, plainText, 0, len);
                   retvalue=1;
               }
            } catch (Exception e) {
                e.printStackTrace();
            }

共有1个答案

姚浩歌
2023-03-14

是的,在没有身份验证标记的情况下解密消息是可能的:如果阅读GCM规范,您可以看到CTR的IV仅仅是IV,附加了四个字节00000002(即从零开始的计数器,在计算身份验证标记时增加一个,在加密时增加计数器的开始值)。

下面是代码,在这里我执行inc两次,因为我用它来验证我的计数器代码;当然,也可以简单地将最后一个字节设置为值0x02

package nl.owlstead.so;

import java.nio.charset.StandardCharsets;

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

import org.bouncycastle.util.Arrays;

public class DecryptGCMWithoutVerification {

    private static final int TAG_SIZE = 128;

    public DecryptGCMWithoutVerification() {
        // TODO Auto-generated constructor stub
    }

    public static void main(String[] args) throws Exception {

        // --- encryption using GCM

        Cipher gcm = Cipher.getInstance("AES/GCM/NoPadding");
        SecretKey key = new SecretKeySpec(new byte[16], "AES");
        byte[] ivBytes = new byte[12];
        GCMParameterSpec iv = new GCMParameterSpec(TAG_SIZE, ivBytes);
        gcm.init(Cipher.ENCRYPT_MODE, key, iv);
        byte[] ct = gcm.doFinal("owlstead".getBytes(StandardCharsets.US_ASCII));

        // --- decryption using underlying CTR mode

        Cipher ctr = Cipher.getInstance("AES/CTR/NoPadding");

        // WARNING: this is only correct for a 12 byte IV in GCM mode
        byte[] counter = Arrays.concatenate(ivBytes, new byte[4]);
        inc(counter);
        inc(counter);
        IvParameterSpec ctrIV = new IvParameterSpec(counter);
        ctr.init(Cipher.DECRYPT_MODE, key, ctrIV);

        byte[] pt = ctr.doFinal(ct, 0, ct.length - TAG_SIZE / Byte.SIZE);

        System.out.println(new String(pt, StandardCharsets.US_ASCII));
    }

    private static final byte inc(byte[] counter) {
        for (int i = counter.length - 1; i >= 0; i--) {
            if (++counter[i] != 0) {
                return 0;
            }
        }
        return 1;
    }

}

编辑:此代码用于无效标记或无法重新计算的标记(例如,AAD可能丢失)。如果标记完全丢失,则从doFinal中删除-TAG_SIZE/byte.size

 类似资料:
  • 问题内容: 我有一些AES / GCM加密数据,想对其解密。我想绕过身份验证解密它,因为数据不包含身份验证信息(数据由第三方应用程序加密)。我尝试使用javax.crypto包进行解密,但它始终会引发标签不匹配错误。有什么方法可以绕过此标签检查并解密数据。数据使用AES128加密,并且使用12字节初始化向量。 编辑:我得到了这个问题的临时解决方案。不知道这是否是正确的方法。 问题答案: 是的,可以

  • 综述 尽管大多数应用程序需要认证来获得访问私有数据的权限或执行人物,但是不是每一个认证方法都能够提供适当的安全性。忽视、无视或低估安全威胁往往导致认证机制可以被轻易绕过,如通过简单跳过登录页面直接访问本需要登录后才能访问内部页面的行为。 此外,通常也可能通过更改请求,欺骗应用程序,使他认为用户已经被认证来绕过认证机制。这可以通过修改URL参数、操纵表单或伪造会话来达到目的。 有关认证模式的问题可以

  • 尽管我保留了verify=false,但在Python中还是出现了ssl错误。你能告诉我如何避免吗?但是curl命令使用-k选项。 错误:

  • 我希望在构建项目时忽略证书。我正在努力做类似的事情。 我收到下面的信息。有人能帮我在构建过程运行时忽略证书吗? 解压缩 /root/.gradle/wrapper/dists/gradle-3.5-bin/daoimhu7k5rlo48ntmxw2ok3e/gradle-3.5-bin.zip /root/.gradle/wrapper/dists/gradle-3.5-bin/daoimhu7k

  • 问题内容: 我正在尝试在超级用户环境中卸载所有django软件包,以确保将我所有的webapp依赖项都安装到我的virtualenv中。 但是pip希望确认每个软件包都已卸载,并且pip似乎没有选择。有更好的方法来卸载一批python模块吗?是正确的方法吗?是否有easy_install替代方法? 或者,最好是强制pip将所有依赖项安装到virtualenv上,而不是依靠系统python模块来满足

  • 我已经配置了CloseableHttpAsyncClient,如下所述 我想绕过SSL验证。我试图检查不同的配置,但没有找到解决方案。