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中相同的输出?
您使用的是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)
| 归档时间: |
|
| 查看次数: |
409 次 |
| 最近记录: |