2013-07-18 5 views
2

Я пытаюсь создать тег аутентификации в C#, который я уже сгенерировал в Ruby (для целей тестирования). Однако результаты разные, но, насколько я вижу, входы равны.тег аутентификации AES/GCM (AES-128-GCM) отличается в 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 (фрагмент):

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==

Wh я здесь делаю неправильно? Заранее благодарю за ваш ответ!

+0

Что такое «ключ доступа»? Это опечатка, или это неверный ключ? –

+0

Nevermind, это опечатка, см. Ответ ниже. –

ответ

8

Хорошо, я установил ruby ​​2.0.0 и сделал несколько тестов.

Прежде всего, чтобы воспроизвести ваш исходный вывод «ie74XTWtSLNad0BKdrhvmQ ==» в C#, установите IV в C# в «новый байт [12]».

Причина, по которой работает, заключается в том, что в настройке рубинового кода cipher.key очищает все установленные вами IV, поэтому эффективный IV является стандартным по умолчанию значением по умолчанию длины (96 бит для GCM). Таким образом, вы должны установить IV после ключа.

Если мы изменим код ruby ​​для этого, то выход изменится на «d1tAJ6Js94tSuPNbds0EJw ==»; все еще не совпадают. Чтобы воспроизвести это значение в C#, обрезайте IV до 12 байтов, то есть «kEWio77T7qWdytrI», и теперь результат будет соответствовать.

Из этого я делаю вывод, что openssl/EVP обрезает любой IV, который вы ему даете. Это не обязательно необходимо, поскольку GCM поддерживает более длинные IV, но 96 бит в некотором смысле являются «предпочтительной» длиной; Я не уверен, где эта политика применяется здесь.

+0

Спасибо! Изменение IV в C# действительно дает мне тот же результат, что и в Ruby. Однако, поскольку часть C# не моя, и я не могу найти, где Ruby caps IV может указать мне, где Ruby обрезает IV? Еще раз спасибо! – user2594963

+1

Nevermind, я обнаружил, что OpenSSL использует стандартную iv-длину 12. И Ruby еще не предоставляет интерфейс для изменения этой длины. – user2594963

 Смежные вопросы

  • Нет связанных вопросов^_^