栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JAVA中的AES GCM解密绕过身份验证

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JAVA中的AES GCM解密绕过身份验证

是的,可以解密不带有身份验证标签的消息:如果您阅读了GCM规范,则可以看到CTR的IV只是IV,后面加上四个字节

00000002
(即,计数器从零开始,为计算而增加了一个)身份验证标签,然后再次输入加密计数器的起始值)。

所以这是代码,

inc
我用它两次来验证我的计数器代码。当然也可以简单地将最后一个字节设置为value
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)。如果标签完全缺失

- TAG_SIZE /Byte.SIZE
doFinal
请将其删除。

编辑2:请注意,这假定12字节/ 96位IV,这是GCM的默认IV大小。对于其他尺寸,您需要首先计算IV。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/507384.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号