首页 > 解决方案 > 如何在 Elixir 中进行 AES-256-ECB 加密?

问题描述

我有一个遗留应用程序,它具有以下 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 中相同的输出?

标签: cryptographyerlangelixir

解决方案


您使用的是 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=

推荐阅读