Как сделать шифрование AES-256-ECB в Elixir? - PullRequest
0 голосов
/ 31 мая 2018

У меня есть устаревшее приложение, которое имеет следующий код PHP

<?php
  $ivSize = openssl_cipher_iv_length('AES-256-ECB');
  $iv = openssl_random_pseudo_bytes($ivSize);   
  $input = "eeeeeeeeeeeeeeee";
  $key = "dddddddddddddddd";
  print base64_encode(openssl_encrypt($input,"AES-256-ECB", $key,OPENSSL_RAW_DATA,$iv));
?>

Этот сценарий выдает следующий вывод

wenBZciza683mhjk3ydcMeOZBIFais5RNpIQ6jkxLGA=

Я попытался преобразовать указанный выше сценарий PHP в Elixir какниже

 input = "eeeeeeeeeeeeeeee"
 key = "dddddddddddddddd"
 Base.encode64 :crypto.block_encrypt(:aes_ecb, key, string)

И я получаю следующий вывод в Elixir:

 "Br5nc46qS2eAXajEbP0pGw=="

Чего мне не хватает?Что я должен сделать, чтобы получить тот же вывод в Elixir, что и в PHP?

1 Ответ

0 голосов
/ 31 мая 2018

Вы используете 256-битное шифрование, но ваши входные данные 128-битные.PHP автоматически дополняет ключ до 256 бит и вводит следующий кратный 256 бит, поскольку вы явно указали, что хотите AES- 256 -ECB.Я не знал точно, как это дополняет их, но путем проб и ошибок я обнаружил, что клавиша заполнена нулевыми байтами, а ввод дополнен PKCS7.

Вот реализация заполнения PKCS7:

defmodule PKCS7 do
  def pad(data, block_size) do
    to_add = block_size - rem(byte_size(data), block_size)
    data <> String.duplicate(<<to_add>>, to_add)
  end
end

Вот окончательный код:

input = "eeeeeeeeeeeeeeee" |> PKCS7.pad(32)
key = "dddddddddddddddd" <> <<0::128>>
IO.puts Base.encode64(:crypto.block_encrypt(:aes_ecb, key, input))

Вывод:

wenBZciza683mhjk3ydcMeOZBIFais5RNpIQ6jkxLGA=
...