Ruby AES-128-GCM似乎没有检查身份验证
若我正确理解GCM模式,它应该不仅提供加密,还提供密文的身份验证。然而,当我使用Ruby的OpenSSL实现以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
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的可用性。当我发布功能请求时,会给你回复。