如何正确实现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,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

