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

如何正确实现AES-256-GCM中GHASH函数的乘法功能?

AES-256-GCM实现中GHASH乘法函数的正确性验证问题

背景

我正尝试不依赖任何外部库用Python实现AES-256-GCM,目前已完成AES-256-ECB、AES-256-CBC、AES-256-CTR、AES-256-OFB模式的加解密,以及Base64编解码、JSON序列化与反序列化功能,所有功能均通过多源验证。

我早期的实现成果已在Stack Overflow分享,参考了AES官方规范、维基百科及其他加密技术文档独立完成了全部代码。

我原本计划添加AES-256-CFB和AES-256-PCBC模式,这对我而言难度不高,也找到相关参考代码,但暂时没着手实现——当前核心目标是完成AES-256-GCM,却卡在了GHASH函数的乘法实现上,无法验证结果正确性。我已查阅NIST发布的GCM相关规范文档。

现有GHASH乘法实现

我自己实现的版本

GHASH_POLY = 0xE1000000000000000000000000000000

def ghash_mul(a: int, b: int) -> int:
    c = 0
    for i in range(127, -1, -1):
        if a >> i:
            c ^= b
        
        if b & 1:
            b = (b >> 1) ^ GHASH_POLY
        else:
            b >>= 1
    
    return c

找到的参考实现版本

def ghash_mult(x, y):
    res = 0
    for i in range(127, -1, -1):
        res ^= x * ((y >> i) & 1)
        x = (x >> 1) ^ ((x & 1) * GHASH_POLY)
    
    return res

测试结果差异

两种实现对部分输入的结果一致,但并非所有输入都相同:

In [354]: ghash_mul(255, 255)
Out[354]: 184305769290552241502318497701996581888

In [355]: ghash_mult(255, 255)
Out[355]: 184305769290552241502318497701996581888

In [356]: ghash_mult(12345, 255)
Out[356]: 176413478065579303506952143281585670830

In [357]: ghash_mul(12345, 255)
Out[357]: 184305769290552241502318497702000014804

In [358]: ghash_mul(MAX128, MAX128)
Out[358]: 324345477096475565862205004031948663466

In [359]: ghash_mult(MAX128, MAX128)
Out[359]: 324345477096475565862205004031948663466

In [360]: ghash_mult(999, 999)
Out[360]: 184305769290552241502318497701997396837

In [361]: ghash_mul(999, 999)
Out[361]: 237807196120895105386696731878281261212

问题

请问哪一种实现是正确的?或是两者均错误?如何正确实现GHASH函数所用的乘法功能?

内容的提问来源于stack exchange,提问作者Ξένη Γήινος

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:15:12