如何为 AES 加密生成随机密钥?
How to generate a random key for AES Encryption?
每次收到对端点的请求时,我都会使用 openssl crate 生成一个随机密钥。我将使用新生成的密钥加密请求数据并将其作为响应发回。
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
方法时,出现如下错误:
thread 'actix-rt:worker:3' panicked at 'called `Result::unwrap()` on an `Err` value: KeyError(())', src/**/**.rs:23:18
我的要求是密钥对于每个请求都必须是随机且唯一的。
编辑 1:
谢谢你的回答。现在我已经改变了大小,我现在可以得到一个 AesKey。
修改后的代码:
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
我尝试增加 outbuf 的大小,但仍然出现与上述相同的错误。
我查看了文档并指出:
Panics if in_ is not the same length as out, if that length is not a multiple of 16, or if iv is not at least 32 bytes.
我不确定我做错了什么。
编辑 2:
感谢您的投入。我能够通过将输入和输出缓冲区的大小调整为 16 的倍数来解决这个问题。
let mut buf = [0; 128];
您提供了一个 128 字节 的缓冲区作为键。
根据 new_encrypt 的文档:
Returns an error if the key is not 128, 192, or 256 bits.
你的密钥大了 4 倍,我猜比你预期的大 8 倍。
每次收到对端点的请求时,我都会使用 openssl crate 生成一个随机密钥。我将使用新生成的密钥加密请求数据并将其作为响应发回。
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
方法时,出现如下错误:
thread 'actix-rt:worker:3' panicked at 'called `Result::unwrap()` on an `Err` value: KeyError(())', src/**/**.rs:23:18
我的要求是密钥对于每个请求都必须是随机且唯一的。
编辑 1:
谢谢你的回答。现在我已经改变了大小,我现在可以得到一个 AesKey。
修改后的代码:
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
我尝试增加 outbuf 的大小,但仍然出现与上述相同的错误。
我查看了文档并指出:
Panics if in_ is not the same length as out, if that length is not a multiple of 16, or if iv is not at least 32 bytes.
我不确定我做错了什么。
编辑 2:
感谢您的投入。我能够通过将输入和输出缓冲区的大小调整为 16 的倍数来解决这个问题。
let mut buf = [0; 128];
您提供了一个 128 字节 的缓冲区作为键。
根据 new_encrypt 的文档:
Returns an error if the key is not 128, 192, or 256 bits.
你的密钥大了 4 倍,我猜比你预期的大 8 倍。