Encryption 如何为AES加密生成随机密钥?

Encryption 如何为AES加密生成随机密钥?,encryption,rust,openssl,actix-web,Encryption,Rust,Openssl,Actix Web,每次接收到对端点的请求时,我都使用openssl板条箱生成一个随机密钥。我将使用新生成的密钥加密请求数据,并将其作为响应发送回 use openssl::rsa::{Rsa, Padding}; use openssl::aes::{AesKey, aes_ige}; use openssl::symm::Mode; use openssl::rand::rand_bytes; let mut buf = [0; 128]; rand_bytes(&mut buf).unwrap();

每次接收到对端点的请求时,我都使用openssl板条箱生成一个随机密钥。我将使用新生成的密钥加密请求数据,并将其作为响应发送回

use openssl::rsa::{Rsa, Padding};
use openssl::aes::{AesKey, aes_ige};
use openssl::symm::Mode;
use openssl::rand::rand_bytes;

let mut buf = [0; 128];
rand_bytes(&mut buf).unwrap();
let aeskey = AesKey::new_encrypt(&buf).unwrap();
执行AesKey::new_encrypt方法时,出现以下错误:

线程'actix rt:worker:3'在'Err'值:KeyError'上被调用'Result::unwrap',src/**/**。rs:23:18 我的要求是每个请求的密钥都必须是随机的和唯一的

编辑1:

谢谢你的回答。现在我已经改变了尺寸,我现在可以得到一把钥匙了

更改后的代码:

    let message = "
    {
        \"id\": 1,
        \"name\": \"xyzab\"
    }".to_string();

    let mut buf = [0; 16];
    rand_bytes(&mut buf).unwrap();
    let aeskey = AesKey::new_encrypt(&buf).unwrap();
    let mut iv = *b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\
    \x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F";
    let mut outbuf = [0u8; 16];
    aes_ige(message.as_bytes(), &mut outbuf, &aeskey, &mut iv, Mode::Encrypt);
当我执行此操作时,我从aes_ige方法中得到一个错误,表示:

'assertion failed: in_.len() == out.len()', /Users/shyamsundarb/.cargo/registry/src/github.com-1ecc6299db9ec823/openssl-0.10.29/src/aes.rs:142:9
我试图增加EXBUF的大小,但仍然得到了与上面提到的相同的错误

我查阅了文件,文件上说:

如果in_uu的长度与out的长度不同,如果该长度不是16的倍数,或者如果iv至少不是32字节,则会出现恐慌

我不确定我做错了什么

编辑2:

谢谢你的投入。我能够通过将输入和输出缓冲区的大小调整为16的倍数来解决这个问题

您提供了一个128字节的缓冲区作为密钥

根据新加密的文档:

如果密钥不是128、192或256位,则返回错误


您的钥匙太大了4倍,我想比您预期的大8倍。

嘿,谢谢!这解决了最初的错误。此外,当我运行aes_ige方法时,我得到一个错误。我在问题中添加了一个包含更多细节的编辑。错误消息看起来很清楚?您的消息大约有50个字节,我得到53个字节,将其粘贴到一个单独的缓冲区中,但不知道上下文,它可能有点偏离,这既不是输出缓冲区16的长度,也不是16的倍数,两者都是明确记录的要求。谢谢您的回答。我可以通过将缓冲区大小调整为16的倍数来加密它。很高兴你有了问题的解决方案!你应该把它作为一个答案而不是对你的问题进行编辑,然后潜在地接受这个答案。这样,问题在搜索结果中显示为已解决,人们可以对你的答案进行投票,你的解决方案对未来有相同问题的人更有帮助。很难在一篇文章中回答多个问题。请将这些问题分成多个问题,以便我们能够更好地帮助您,并且您的问题将在将来帮助与您有相同问题的其他人!理解。我已将原始答案标记为已回答。
let mut buf = [0; 128];