gpt4 book ai didi

openssl - d openssl aes 加密字节数组在执行之间不是恒定的

转载 作者:行者123 更新时间:2023-12-01 08:27:07 26 4
gpt4 key购买 nike

我使用 D 的 Deimos openssl header 将 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 ~ "\"");
}

最佳答案

您的代码有几个错误。

首先,您似乎将密码与 key 混淆了。鉴于您调用 AES_set_encrypt_key()如果 key 大小为 128 位(第二个参数),则用于 key 的实际字节将是第一个参数指向的 128 位 = 16 字节。由于您的第一个参数指向以 0 结尾的字符串 "foo!" ,第五个字节之外的所有内容都将是不可预测的,并且每次运行此代码时使用的实际 key 可能会有所不同。

那么你想使用AES_encrypt()函数“加密您的数据”,您的数据是以 0 结尾的字符串 "bar" 。但该函数实际上对固定大小 128 位 = 16 字节的 block 执行操作,与所使用的 key 大小无关。 wikipedia page about AES详细解释一下。因此该函数的输入和输出缓冲区预计都是 16 字节的缓冲区。您提供的函数参数指向错误大小的缓冲区。

代码的“解密”部分也存在同样的问题。

看看this concise C example正确使用这些功能。这可能会帮助您正确编写代码(并重新设置您对这些函数的实现目的的期望)。要以正确的方式实现您实际想要的内容,请参阅 OpenSSL wiki 页面 EVP Symmetric Encryption and Decryption 。我没有D的经验编程,但乍一看,Deimos openssl 绑定(bind)似乎提供了所需的所有功能。

关于openssl - d openssl aes 加密字节数组在执行之间不是恒定的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51546894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com