1 个不稳定版本
0.1.0 | 2024年4月7日 |
---|
#1092 in 加密学
32KB
475 行
一站式流编码
无需了解加密:使用 Reader / Writer 之一(AesReader / AesWriter)包装你的读取器/写入器并读写!
创建读取器所需的所有内容
- 一个密钥:你可以通过
- 一个 SALT(每个应用程序的随机字节,因此你可以创建自己的(必须是128位)或者如果你想解码 RedSeat 文件,请使用下面的我们的)
- 一个字符串密钥
const SALT: &str = "e5709660b22ab0803630cb963f703b83"; let salt = URL_SAFE.decode(SALT).unwrap(); let key = derive_key("test password", &salt);
创建写入器所需的所有内容
- 一个(IV):你可以通过
- 与写入器相同的密钥生成一个
RedSeat Crypto 被 RedSeat 应用程序(用于加密备份和加密库)使用,并在加密文件中添加可以自定义的标题
pub struct CryptoInfo{
pub thumb: Option<Vec<u8>>,
pub mime: Option<String>,
pub thumb_mime: Option<String>,
pub info: Option<String>,
}
所有字段都是可选的,但它允许你在加密文件中存储缩略数据以及任何字符串格式的信息(例如序列化的 JSON)。
因此,只需读取标题,就可以提取缩略图或信息,而无需读取整个文件
- 读取文件的第一部分,它将包含字节
- 16 以获取 IV(用作与密钥一起进行解密的输入)
- 4 以存储加密缩略图大小 = T(可以是 0)(u32 BigEndian:
u32::from_be_bytes()
) - 4 以存储加密信息大小 = I(可以是 0)(u32 BigEndian:
u32::from_be_bytes()
) - 32 以存储缩略图 MIME 类型(UTF8 字符串
String::from_utf8()
) - 256 以存储文件 MIME 类型(UTF8 字符串
String::from_utf8()
)
例如,如果 T(缩略图大小)为 240:缩略图将在字节 [313 到 553] 中
下一个版本将提供易于检索缩略图和信息的功能
带信息的示例用法
fn encrypt_with_infos() -> Result<()> {
let infos = CryptoInfo {
thumb: Some(random_iv(Some(145))),
mime: Some("video/quicktime-mov".to_owned()),
thumb_mime: Some("image/jpeg".to_owned()),
info: Some("{JSONEXEMPLE====}".to_owned()),
};
let test_path = PathBuf::from_str("test_data/test_infos").unwrap();
if test_path.exists() {
remove_file(&test_path)?;
}
let salt = URL_SAFE.decode(SALT).unwrap();
let key = derive_key("test password", &salt);
let iv = random_iv(None);
{
let writer = File::create(&test_path)?;
let encryptor = AesSafe256Encryptor::new(&key);
let mut aes_writer = AesWriter::new_with_infos(iv, infos.clone(), writer, encryptor)?;
aes_writer.encrypt_write("test encrypted".as_bytes(), true)?;
}
{
let reader = File::open(&test_path)?;
let decryptor = AesSafe256Decryptor::new(&key);
let (dec_infos ,mut aes_reader) = AesReader::new_with_infos(reader, decryptor)?;
let mut decrypted = String::new();
assert_eq!(infos, dec_infos, "infos different than initial infos");
aes_reader.read_to_string(&mut decrypted)?;
assert_eq!(decrypted, "test encrypted", "Decrypted different than encprypted");
}
Ok(())
}
查看测试以获取更多示例
使用的加密:AES256 与 CBC 块模式
依赖项
~4MB
~54K SLoC