如何在Elixir中进行AES-256-ECB加密?

sha*_*evy 4 erlang cryptography elixir

我有一个具有以下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));
?>
Run Code Online (Sandbox Code Playgroud)

该脚本提供以下输出

wenBZciza683mhjk3ydcMeOZBIFais5RNpIQ6jkxLGA=
Run Code Online (Sandbox Code Playgroud)

我试图将上述PHP脚本转换为Elixir,如下所示

 input = "eeeeeeeeeeeeeeee"
 key = "dddddddddddddddd"
 Base.encode64 :crypto.block_encrypt(:aes_ecb, key, string)
Run Code Online (Sandbox Code Playgroud)

我在Elixir中得到以下输出:

 "Br5nc46qS2eAXajEbP0pGw=="
Run Code Online (Sandbox Code Playgroud)

我想念什么?如何在Elixir中获得与PHP中相同的输出?

Dog*_*ert 5

您使用的是256位加密,但是输入是128位。由于您已明确指定要使用AES- 256 -ECB,因此PHP自动将密钥填充到256位,并输入到256位的下一个倍数。我不知道它是如何填充它们的,但是通过反复试验,我发现密钥用空字节填充,输入用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
Run Code Online (Sandbox Code Playgroud)

这是最终代码:

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

输出:

wenBZciza683mhjk3ydcMeOZBIFais5RNpIQ6jkxLGA=
Run Code Online (Sandbox Code Playgroud)