Зашифруйте строку, используя стандарт тройного шифрования данных (3DES) с отступом PKCS7 - PullRequest
1 голос
/ 01 апреля 2020

Требование:

У меня есть приложение Ruby на рельсах, и мне нужно сделать следующее.

Следующая строка должна быть зашифрована с использованием алгоритма 3DES и рабочего ключа. Зашифрованное значение для ABJGTU9 будет vV51P0OGXt0 =

, рабочий ключ - A5157A0D77B24AEA868AD73288366826

Алгоритм 3DES, упомянутый в следующем документе, использует следующие шаги для шифрования данных: i. Зашифруйте данные, используя левую часть ключа, используя режим шифрования CB C и заполнение PKCS7. II. Расшифруйте данные, используя правую часть ключа в режиме шифрования CB C и без заполнения. III. Шифрование данных с использованием левой части ключа в режиме шифрования CB C и без заполнения.

Я попробовал следующее article Это то, что я сделал, и мой вывод "hsYUuA/Mo6A=\n" Ожидаемое значение vV51P0OGXt0=

  cipher = OpenSSL::Cipher::Cipher.new('DES-EDE3-CBC')
  cipher.encrypt # Must be called before anything else

  # Generate the key and initialization vector for the algorithm.
  # Alternatively, you can specify the initialization vector and cipher key
  # specifically using `cipher.iv = 'some iv'` and `cipher.key = 'some key'`
  # cipher.pkcs5_keyivgen('SOME_PASS_PHRASE_GOES_HERE')

  key = Digest::MD5.base64digest('A5157A0D77B24AEA')
  cipher.key = key
  data = "ABJGTU9"
  output = cipher.update(data)
  output << cipher.final
  output
end

Я не уверен, правильно ли я иду.

1 Ответ

0 голосов
/ 02 апреля 2020

В схеме, упомянутой в вопросе, есть много неправильных:

  1. ключ - это тройной ключ DES с двумя ключами, вам нужно шестнадцатеричное декодирование это, а не выполнить MD5 на нем;
  2. , если ваш код не работает с 128-битным ключом DES, как показано, вы должны скопировать первые 8 байтов и добавить их в конец ключа ( поэтому ключ DES 1 и ключ DES 3 идентичны) - однако OpenSSL должен нормально работать с ключами длиной 16 байт;
  3. метод шифрования, описанный в шагах i, ii и iii, работает только для каждого отдельного блок , который должен быть зашифрован - он вам не нужен, если вы уже используете шифр 'DES-EDE3-CBC'.

OpenSSL уже использует дополнения PKCS # 7 по умолчанию, поэтому нет причин чтобы сделать что-то особенное для этого.

CB C требует уникального, непредсказуемого IV для каждой операции шифрования с тем же ключом, который, по-видимому, отсутствует в описанной схеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...