cryptography - 如何在 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 中相同的输出?
解决方案
您使用的是 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=
推荐阅读
- angular - Angular:测试拦截器正确的请求顺序
- node.js - 资金无法发送到位于我们的账户,因为它在您的平台区域之外
- c# - Blazor .Net Core 3.0 Preview 9 - AuthenticationStateProvider 实现问题
- electron - 如何将 Electron 的 crashReporter 的 minidump 文件上传到远程服务器并存储在本地?
- ios - CloudKit CKError 扩展在 Objective-C 中不可用?
- c# - 如何使用 Newtonsoft 解析这个 Json
- python - 如何使用 cx_freeze 冻结一些 python 测试?
- matlab - 如何计算代表性相似度矩阵值是否显着
- php - 如何从 for 循环的输出中删除最后一个逗号
- python - 在 Python 中检查文件是否存在于 GCS 存储桶中并搜索部分文件名的最佳方法是什么?