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

标签 cryptography erlang 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));
?>

此脚本提供以下输出
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/

相关文章:

erlang - 如何手动向我刚刚生成的进程发送消息?

erlang - Elixir-Erlang : is there a "reasonable" limit of children handled by a supervisor?

c - OpenSSL GOST 参数集

java - Node.js 解密不适用于其他密码的密文

mysql - Tsung Erlang 函数 (dynvars) - 转义引号

parsing - Erlang:解码二进制流中的可变长度数据字段

elixir - 管道链应该以原始值开始

elixir - 监督 gen_tcp 客户端/服务器

security - 临时存储敏感数据

java - 在 Java 中解密 C# AES 加密文本