【问题标题】:AES/GCM (AES-128-GCM) authentication-tag differs in C# and RubyAES/GCM (AES-128-GCM) 身份验证标签在 C# 和 Ruby 中不同
【发布时间】:2013-07-17 06:28:12
【问题描述】:

我正在尝试在 C# 中生成我已经在 Ruby 中生成的身份验证标记(用于测试目的)。但是结果不同,但据我所知,输入是相等的。

在 Ruby 2.0 中使用 OpenSSL 1.0.1c (Ubuntu 13.04):

require 'openssl'
require 'base64'
iv = Base64.decode64('kEWio77T7qWdytrIbUmRxA==')
key = Base64.decode64('FnUoIZvBUzC1Q/rn5WMi7Q==')
aad = Base64.decode64('/tTP07sPkoX8gah60eH89w==')
cipher = OpenSSL::Cipher.new('aes-128-gcm').encrypt
cipher.iv = iv
cipher.key = key
cipher.auth_data = aad
cipher.final
tag = Base64.strict_encode64(cipher.auth_tag)

生成的(编码的)标签是ie74XTWtSLNad0BKdrhvmQ==

在 C# 中使用 BouncyCastle (sn-p):

var iv = Convert.FromBase64String("kEWio77T7qWdytrIbUmRxA==");
var key = Convert.FromBase64String("FnUoIZvBUzC1Q/rn5WMi7Q==");
var aad = Convert.FromBase64String("/tTP07sPkoX8gah60eH89w==");
var cipher = new GcmBlockCipher(new AesFastEngine());
var parameters = new AeadParameters(new KeyParameter(passkey), 128, iv, aad);
cipher.Init(true, parameters);
var cipherText = new byte[cipher.GetOutputSize(0)];
cipher.DoFinal(cipherText, 0);
var tag = Convert.ToBase64String(cipher.GetMac());

C# 中的结果标签是sawCcwM1T8sGl5y6VT0CHA==

我在这里做错了什么?提前感谢您的回复!

【问题讨论】:

  • 什么是“密码”?这是一个错字,还是传递了错误的键?
  • 没关系,这是一个错字,请参阅下面的答案。

标签: c# ruby openssl bouncycastle aes-gcm


【解决方案1】:

好的,我安装了 ruby​​ 2.0.0 并做了一些测试。

首先,要在 C# 中复制原始输出“ie74XTWtSLNad0BKdrhvmQ==”,请将 C# 中的 IV 设置为“new byte[12]”。

有效的原因是,在 ruby​​ 代码设置中,cipher.key 会清除您设置的任何 IV,因此有效的 IV 是默认长度的默认全零(GCM 为 96 位)。所以你应该在key之后设置IV。

如果我们更改 ruby​​ 代码来执行此操作,则输出将更改为 "d1tAJ6Js94tSuPNbds0EJw==";仍然不匹配。要在 C# 中重现此值,请将 IV 截断为 12 个字节,即“kEWio77T7qWdytrI”,现在输出匹配。

据此,我推断 openssl/EVP 正在截断您提供的任何 IV。这不应该是绝对必要的,因为 GCM 确实支持更长的 IV,但 96 位在某种意义上是“首选”长度;我不确定该政策在哪里执行。

【讨论】:

  • 谢谢!!在 C# 中更改 IV 确实给了我与在 Ruby 中相同的结果。但是,由于 C# 部分不是我要更改的,而且我找不到 Ruby 限制 IV 的位置,您能否指出 Ruby 截断 IV 的位置?再次感谢!
  • 没关系,我发现 OpenSSL 使用默认的 iv-length 12。而 Ruby 尚未提供更改此长度的接口。
猜你喜欢
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2015-10-29
  • 2014-07-14
  • 2016-12-19
  • 2020-05-29
  • 2018-08-20
  • 1970-01-01
相关资源
最近更新 更多