我有一个遗留应用程序,它具有以下 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 中相同的输出?
最佳答案
您使用的是 256 位加密,但您的输入是 128 位。 PHP 自动将 key 填充到 256 位并输入到下一个 256 位的倍数,因为您明确指定了您想要 AES- 256 -欧洲央行。我不知道它究竟是如何填充它们的,但通过一些试验和错误,我发现 key 用空字节填充,输入用 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=
关于cryptography - 如何在 Elixir 中进行 AES-256-ECB 加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50623417/