You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AES-GCM-256无认证解密首块实现方法问询

无需认证解密AES-GCM-256的第一个数据块

AES-GCM的底层加密逻辑就是CTR模式加GMAC认证,所以跳过认证只解密第一个数据块,确实可以直接用CTR模式实现——CTR的解密和加密逻辑完全一致,都是用密钥流和密文做异或运算。

你当前的代码思路是对的,但要适配AES-GCM-256,需要注意几个细节:

  • AES-256要求密钥长度为32字节,你代码里用的是16字节的AES-128密钥,需要调整
  • GCM标准推荐用12字节(96位)的IV,解密时的IV必须和加密时完全一致
  • 只需传入第一块密文(16字节,AES的块大小),用CTR流做异或就能得到对应明文块

以下是修正后的AES-GCM-256版本代码:

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "fmt"
)

func main() {
    // AES-256需要32字节密钥,必须和加密时完全一致
    key := []byte("examplekey123456examplekey123456")
    // GCM的IV,必须和加密时使用的完全一致(这里以12字节标准IV为例)
    iv := []byte("1234567890ab")

    // 待解密的第一块密文(16字节)
    ciphertext := []byte{0x76, 0xa3, 0x4c, 0x2e, 0x87, 0x89, 0xb7, 0xa6, 0xb0, 0xcf, 0x6d, 0x98, 0x55, 0x8f, 0xee, 0x0a}

    // 创建AES-256密码实例
    block, err := aes.NewCipher(key)
    if err != nil {
        panic(err)
    }

    // 创建CTR流,GCM的计数器初始值由IV推导而来,直接传入IV即可
    stream := cipher.NewCTR(block, iv)

    // 解密第一块密文
    plaintext := make([]byte, len(ciphertext))
    stream.XORKeyStream(plaintext, ciphertext)

    fmt.Printf("解密后的第一块明文: %x\n", plaintext)
}

重要提醒

这种方式完全跳过了GCM的认证环节,解密得到的内容无法确认是否被篡改或伪造,仅适用于不需要验证数据完整性和真实性的特殊场景。如果业务场景需要确保数据安全,必须使用GCM的完整认证解密流程。

内容的提问来源于stack exchange,提问作者Fernader

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 20:38:21