d openssl aes加密字节数组在执行之间不是常量

d openssl aes加密字节数组在执行之间不是常量,openssl,aes,d,ldc,Openssl,Aes,D,Ldc,我使用D的Deimos OpenSsl头将D链接到OpenSsl,并使用ldc 1.8.0编译器尝试将字符串加密为一个小测试。 加密的字节数组与我预期的不一致。 当我运行程序并加密字符串,然后解密它时,我得到了我的原始字符串。 但中间加密字节数组在代码执行之间不一致 所以我的问题是,这是预期的行为吗?OpenSsl中的AES是否在内容中添加了某种盐,因此更难攻击,或者这是我的错误 import std.stdio; import std.conv; import std.string; impo

我使用D的Deimos OpenSsl头将D链接到OpenSsl,并使用ldc 1.8.0编译器尝试将字符串加密为一个小测试。 加密的字节数组与我预期的不一致。 当我运行程序并加密字符串,然后解密它时,我得到了我的原始字符串。 但中间加密字节数组在代码执行之间不一致

所以我的问题是,这是预期的行为吗?OpenSsl中的AES是否在内容中添加了某种盐,因此更难攻击,或者这是我的错误

import std.stdio;
import std.conv;
import std.string;
import std.outbuffer;

import deimos.openssl.aes;

void main()
{
    writeln("hello world");
    const auto encryption_passphrase = "foo!";

    writeln("The encryption key is \"" ~ encryption_passphrase ~ "\"");

    const auto encryption_content = "bar";
    writeln("The to be encrypted content is: \"" ~ encryption_content ~ "\"");

    writeln("The content lenght is " ~  encryption_content.length.to!string);

    writeln("----------");
    writeln("encrypting");

    AES_KEY encryption_key;

    AES_set_encrypt_key(cast(ubyte*) encryption_passphrase.toStringz, 128, &encryption_key);


    OutBuffer buf = new OutBuffer();
    buf.write(encryption_content);

    ubyte[] inbuffer = buf.toBytes();
    ubyte[] encryptedbuffer = new ubyte[inbuffer.length];
    AES_encrypt(&inbuffer[0], &encryptedbuffer[0], &encryption_key);
    writeln("The encrypted content is: \"" ~ (cast(char*)encryptedbuffer).fromStringz ~ "\"");

    writeln("----------");
    writeln("decrypting");
    AES_KEY decryption_key;
    AES_set_decrypt_key(cast(ubyte*)  encryption_passphrase.toStringz, 128, &decryption_key);

    ubyte[] outbuffer = new ubyte[inbuffer.length];

    AES_decrypt(&encryptedbuffer[0], &outbuffer[0], &decryption_key);
    writeln("the decrypted content is: \"" ~ (cast(char*)outbuffer).fromStringz ~ "\"");
}

代码中有几个错误

首先,您似乎混淆了密码短语和密钥。假设您使用128位的密钥大小(第二个参数)调用
AES\u set\u encrypt\u key()
,则用于密钥的实际字节将是第一个参数指向的128位=16字节。由于第一个参数指向以0结尾的字符串
“foo!”
,因此第五个字节以外的所有内容都将是不可预测的,并且每次运行此代码时所使用的实际键都可能不同

然后您想使用
AES\u encrypt()
函数“加密您的数据”,您的数据是以0结尾的字符串
“bar”
。但该函数实际上对固定大小为128位=16字节的块执行操作,与所使用的密钥大小无关。报告对此进行了详细解释。因此,该函数的输入和输出缓冲区都应该是16字节的缓冲区。您给出的函数参数指向错误大小的缓冲区

同样的问题也适用于代码的“解密”部分

请查看如何正确使用这些函数。这可能会帮助您正确地编写代码(并重新设定您对这些函数实现的预期)。要以正确的方式实现您真正想要的,请参阅OpenSSL wiki页面。我没有
D
编程经验,但乍一看,Deimos openssl绑定似乎提供了所需的所有功能