Ruby AES-128-GCM似乎没有检查身份验证

Ruby AES-128-GCM似乎没有检查身份验证,ruby,encryption,openssl,cryptography,Ruby,Encryption,Openssl,Cryptography,若我正确理解GCM模式,它应该不仅提供加密,还提供密文的身份验证。然而,当我使用Ruby的OpenSSL实现以AES-256-GCM模式加密数据时,即使我篡改auth_标记,它也会很高兴地解密数据。我是否遗漏了一些东西,或者实施过程确实中断了 require 'openssl' # ALICE encrypts some secret data data = 'secret' cipher = OpenSSL::Cipher.new('aes-128-gcm') cipher.encrypt

若我正确理解GCM模式,它应该不仅提供加密,还提供密文的身份验证。然而,当我使用Ruby的OpenSSL实现以
AES-256-GCM
模式加密数据时,即使我篡改
auth_标记
,它也会很高兴地解密数据。我是否遗漏了一些东西,或者实施过程确实中断了

require 'openssl'

# ALICE encrypts some secret data

data = 'secret'
cipher = OpenSSL::Cipher.new('aes-128-gcm')
cipher.encrypt
key = cipher.random_key
iv = cipher.random_iv
cipher.auth_data = 'auth_data'
ciphertext = cipher.update(data) + cipher.final
auth_tag = cipher.auth_tag

# EVE tampers with the auth tag, e.g. dropping the last 10 bytes

auth_tag = auth_tag[0..-11]

# BOB decrypts the ciphertext

cipher = OpenSSL::Cipher.new('aes-128-gcm')
cipher.decrypt
cipher.key = key
cipher.iv = iv
cipher.auth_tag = auth_tag
cipher.auth_data = 'auth_data'
data = cipher.update(ciphertext) + cipher.final

# BOB is very sad because no error is raised!
我正在使用OS X内置的OpenSSL版本:

% openssl version
OpenSSL 0.9.8zg 14 July 2015

GCM支持身份验证标记的多种大小。在这些版本中,通过从右侧删除字节来缩短身份验证标记。这正是攻击者所做的

现在,API非常不稳定。首先,(16-10)*8=48,这不是AES-GCM的有效大小(根据)。此外,身份验证标签大小应该是密码的输入或配置参数。至少API应该警告用户自己检查身份验证标签大小,而不是只允许任何身份验证标签输入


因此,是的,您缺少了一些东西是的,我想说实现——或者至少是文档——被破坏了;这是一个很好的发现。

我自己不是Ruby开发人员,但是如果您决定采取行动(例如提交错误报告),您可以在这里发表评论(使用@MaartenBodewes)让我知道吗?很高兴支持您和Ruby社区的想法,之前创建了AEAD API。有些东西在某个地方弯曲或断裂……另请参阅NIST存档的McGrew和Viega。其中讨论了标记截断攻击,并引用了Ferguson对模式的伪造攻击。其缺点是:应用程序负责使标记长度变长安全参数。@MaartenBodewes相应的Github问题在这里:感谢您精心研究的答案,我现在将手动检查标记长度。因为GCM允许0到128字节之间的任意标记长度,所以Ruby实现的这一部分似乎是正确的。固定的标记长度是有意义的,但如果我理解没错,它们只是建议。我完全同意标签长度应该是一个输入参数,这将极大地提高API的可用性。当我发布功能请求时,会给你回复。