#crypto #reader #stream #key #encryption #random #salt

redseat-crypto

插件创建的通用描述

1 个不稳定版本

0.1.0 2024年4月7日

#1092 in 加密学

MIT/Apache

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