Сейчас на форуме: Lohmaty, tyns777, cppasm (+7 невидимых)

 eXeL@B —› Вопросы новичков —› проблема с aes
Посл.ответ Сообщение

Ранг: 57.0 (постоянный), 10thx
Активность: 0.050.08
Статус: Участник

Создано: 06 февраля 2018 19:00
· Личное сообщение · #1

помогите решить проблему с декриптом aes
в программе используется CryptoPP библиотека с включенным SSE кодом. Сигнатуры в иде не распознают большинство используемых функций.
По строкам нашел нужные функции.
сначала в проге получаю key1,key2 (по 0x10 байт) и array1 размером 0x13 байт
дальше я отлавливаю выполнение следующей процедуры
Code:
  1. void AuthenticatedSymmetricCipherBase::SetKey(const byte *userKey, size_t keylength, const NameValuePairs &params)
  2. {
  3.          m_bufferedDataLength = 0;
  4.          m_state = State_Start;
  5.  
  6.          this->SetKeyWithoutResync(userKey, keylength, params);
  7.          m_state = State_KeySet;
  8.  
  9.          size_t length;
  10.          const byte *iv = GetIVAndThrowIfInvalid(params, length);
  11.          if (iv)
  12.                  Resynchronize(iv, (int)length);
  13. }

аргументы здесь
userKey = key1+key2
keylength = 0x20
при выполнении данной строки
Code:
  1. const byte *iv = GetIVAndThrowIfInvalid(params, length);

результатом получаю iv=array1 (массив полученный ранее, видимо где-то выше он был забит в параметры???)
далее соответственно идет выполнение
Code:
  1. void AuthenticatedSymmetricCipherBase::Resynchronize(const byte *iv, int length)
  2. {
  3.          if (m_state < State_KeySet)
  4.                  throw BadState(AlgorithmName(), "Resynchronize", "key is set");
  5.  
  6.          m_bufferedDataLength = 0;
  7.          m_totalHeaderLength = m_totalMessageLength = m_totalFooterLength = 0;
  8.          m_state = State_KeySet;
  9.  
  10.          Resync(iv, this->ThrowIfInvalidIVLength(length));
  11.          m_state = State_IVSet;
  12. }

и
Code:
  1. void GCM_Base::Resync(const byte *iv, size_t len)
  2. {
  3.     BlockCipher &cipher = AccessBlockCipher();
  4.     byte *hashBuffer = HashBuffer();
  5.  
  6.     if (len == 12)
  7.     {
  8.         memcpy(hashBuffer, iv, len);
  9.         memset(hashBuffer+len, 0, 3);
  10.         hashBuffer[len+3] = 1;
  11.     }
  12.     else
  13.     {
  14.         size_t origLen = len;
  15.         memset(hashBuffer, 0, HASH_BLOCKSIZE);
  16.  
  17.         if (len >= HASH_BLOCKSIZE)
  18.         {
  19.             len = GCM_Base::AuthenticateBlocks(iv, len);
  20.             iv += (origLen - len);
  21.         }
  22.  
  23.         if (len > 0)
  24.         {
  25.             memcpy(m_buffer, iv, len);
  26.             memset(m_buffer+len, 0, HASH_BLOCKSIZE-len);
  27.             GCM_Base::AuthenticateBlocks(m_buffer, HASH_BLOCKSIZE);
  28.         }
  29.  
  30.         PutBlock<word64, BigEndian, true>(NULLPTR, m_buffer)(0)(origLen*8);
  31.         GCM_Base::AuthenticateBlocks(m_buffer, HASH_BLOCKSIZE);
  32.  
  33.         ReverseHashBufferIfNeeded();
  34.     }
  35.  
  36.     if (m_state >= State_IVSet)
  37.         m_ctr.Resynchronize(hashBuffer, REQUIRED_BLOCKSIZE);
  38.     else
  39.         m_ctr.SetCipherWithIV(cipher, hashBuffer);
  40.  
  41.     m_ctr.Seek(HASH_BLOCKSIZE);
  42.  
  43.     memset(hashBuffer, 0, HASH_BLOCKSIZE);
  44. }

здесь 3 раза в функции AuthenticateBlocks идут манипуляции с iv

вопрос в том можно ли это все повторить на delphi в какой-нибудь крипто библиотеке?
пробовал DCPcrypt, но там IV больше 16 байт просто обрезается, без всяких манипуляций



Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 06 февраля 2018 20:18
· Личное сообщение · #2

а разве там не кей переменной длины 16, 24, 32 и IV в 16 байт?

-----
...или ты работаешь хорошо, или ты работаешь много...




Ранг: 71.2 (постоянный), 33thx
Активность: 0.050.12
Статус: Участник

Создано: 06 февраля 2018 20:42
· Личное сообщение · #3

Почитайте в вики, что такое GCM, для общего понимания.

| Сообщение посчитали полезным: zds

Ранг: 57.0 (постоянный), 10thx
Активность: 0.050.08
Статус: Участник

Создано: 07 февраля 2018 19:02
· Личное сообщение · #4

kunix
спасибо. все получилось в VC++. только теперь бы найти все тоже самое на Delphi....
Code:
  1. const int TAG_SIZE = 12
  2. string rpdata;
  3. try
  4.     {
  5.                  byte key_my[32] = {60, 209, 13, 169, 172, 162, 196, 203, 225, 166, 165, 6, 214, 204, 90, 76, 17, 155, 16, 252, 237, 15, 66, 207, 149, 69, 149, 223, 72, 72, 240, 59 };
  6.                  byte iv_my[19] = {187, 129, 202, 198, 81, 115, 244, 91, 47, 249, 155, 120, 90, 31, 215, 135, 35, 247, 63};
  7.  
  8.         GCM< AES >::Decryption d;
  9.         d.SetKeyWithIV( key_my, sizeof(key_my), iv_my, sizeof(iv_my) );
  10.  
  11.         AuthenticatedDecryptionFilter df( d,
  12.             new StringSink( rpdata ),
  13.             AuthenticatedDecryptionFilter::DEFAULT_FLAGS,
  14.             TAG_SIZE
  15.         );
  16.  
  17.         FileSource("c:/1.dat"
  18.                         , true,
  19.             new Redirector( df /*, PASS_EVERYTHING */ )
  20.         ); // StringSource
  21.  
  22.         bool b = df.GetLastResult();
  23.         assert( true == b );
  24.  
  25.         cout << "recovered text: " << rpdata << endl;
  26.     }
  27.     catch( CryptoPP::HashVerificationFilter::HashVerificationFailed& e )
  28.     {
  29.         cerr << "Caught HashVerificationFailed..." << endl;
  30.         cerr << e.what() << endl;
  31.         cerr << endl;
  32.     }
  33.     catch( CryptoPP::InvalidArgument& e )
  34.     {
  35.         cerr << "Caught InvalidArgument..." << endl;
  36.         cerr << e.what() << endl;
  37.         cerr << endl;
  38.     }
  39.     catch( CryptoPP::Exception& e )
  40.     {
  41.         cerr << "Caught Exception..." << endl;
  42.         cerr << e.what() << endl;
  43.         cerr << endl;
  44.     }



 eXeL@B —› Вопросы новичков —› проблема с aes
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати