вторник, 16 февраля 2010 г.

Криптография под Qt выпуск 3

Криптография с симметричным ключом вполне заработала. Ширфемся по алгоритму AES.

Чтобы расшифроваться нужно у чипера  поменять QCA::Encode на QCA::Decode.
 
QString encrypt(const QString & strToEnrypt)
{
  //инициализация
  QCA::Initializer init;
  //переводим строку в засекречивамый массив
  QCA::SecureArray arg = QVariant(strToEnrypt).toByteArray();
 
  QString res;
  // проверка что поддерживаем алгоритм AES128 testing
  if (QCA::isSupported("aes128-cbc-pkcs7"))
  {
   QString sKey = "aes128-cbc-pkcs7-sn93-sh21-jks-12";
   //некоторые преобразования над ключом
   //по идее должны затруднять реверсинг
   QStringList lst = sKey.split("-");
   lst = lst.replaceInStrings("c", "s");
   lst.removeAt(0);
   lst.removeAt(5);
   QString sKeyCh = lst.join(".");
   //создаем ключ
   QCA::SymmetricKey key(QVariant(lst.join(".")).toByteArray());
  
   //Создать случайный инициализирующий вектор
   //вам нужно это значение чтобы расшифровать результат шифра
   //но это нужно хранить в секрете в отличие от ключа
   QCA::InitializationVector iv(QVariant(lst.join(">")).toByteArray());

   //содать 128 битный AES шифр объект используя CBC режим
   QCA::Cipher cipher(QString("aes128"), QCA::Cipher::CBC,
      //использовать отступ по умолчанию который эквивалентен PKCS7 для CBC
              QCA::Cipher::DefaultPadding,
              // этот объект будет зашифрован
              QCA::Encode,
              key, iv);

   QCA::SecureArray u = cipher.update(arg);
   if (!cipher.ok())
   {
     return res;
   }

   QCA::SecureArray f = cipher.final();
   if (!cipher.ok())
   {
     return res;
   }
   res = QString(f.data());
  }
 
  return res;
}

* This source code was highlighted with Source Code Highlighter.

В следующем выпуске рассмотрим какие библиотеки нужны для переноса OpenSSL на чистую машину.

5 комментариев:

  1. спасибо очень полезная статья

    ОтветитьУдалить
  2. Ты реально понимешь что тут написано?)))

    ОтветитьУдалить
  3. В чем трудности? Код простейший

    ОтветитьУдалить
  4. Если ты про слова PKCS7 CBC AES то да, не очень понимаю, но это и не нужно для простейшего прикладного использования. А подробнее можно узнать на википедии

    ОтветитьУдалить
  5. Небольшая поправочка

    // Create a random initialisation vector - you need this
    // value to decrypt the resulting cipher text, but it
    // need not be kept secret (unlike the key).
    QCA::InitializationVector iv(16);

    судя по оригинальному комменту, вектор НЕ нужно хранить в секрете (в отличие от ключа)

    ОтветитьУдалить