SafeCrypto Pro 加密文件格式规范 (v1.0) 概述 本格式用于 RSA + AES 混合加密系统。加密后的文件以 .enc 为扩展名,采用“数字信封”结构:使用 RSA 公钥加密 AES 会话密钥,使用 AES-GCM 加密原始数据。 核心特性: 算法:RSA-2048 (OAEP) + AES-256-GCM 防篡改:内置 GCM 认证标签 (Tag) 支持大文件:流式分块处理(1 MB/块) 完整文件结构(磁盘布局) 加密文件由 5 个部分顺序拼接而成: 偏移量 (字节) : 0 长度 (字节) : 4 字段名 : EncryptedKeyLength 内容描述 : 无符号整数(大端序),表示后续 EncryptedKey 的字节长度(固定值为 256)。 是否加密 : 否(明文) 偏移量 (字节) : 4 长度 (字节) : 256 字段名 : EncryptedKey 内容描述 : 使用接收方 RSA 公钥 (OAEP) 加密后的 AES-256 会话密钥。 是否加密 : 是(密文) 偏移量 (字节) : 260 长度 (字节) : 12 字段名 : Nonce 内容描述 : AES-GCM 算法所需的 12 字节随机数(Initialization Vector)。 是否加密 : 否(明文) 偏移量 (字节) : 272 长度 (字节) : (文件大小) 字段名 : Ciphertext 内容描述 : 原始文件内容经 AES-256-GCM 加密后的密文。长度与原文件相同。 是否加密 : 是(密文) 偏移量 (字节) : 272 + 文件大小 长度 (字节) : 16 字段名 : Tag 内容描述 : AES-GCM 算法生成的 16 字节认证标签,用于完整性校验。 是否加密 : 否(明文) 字段详细说明 3.1 EncryptedKeyLength (4 字节,大端序) 类型:uint32_t(无符号 32 位整数) 值:固定为 0x00000100(即十进制 256) 说明:因为程序使用 2048 位 RSA 密钥,OAEP 填充后的输出长度固定为 256 字节。该字段用于程序在读取时验证头部完整性。 3.2 EncryptedKey (256 字节) 生成方式: 程序生成 32 字节随机数作为 AES 会话密钥 SessionKey。 使用接收方的 RSA 公钥,通过 RSA-OAEP 填充算法加密 SessionKey。 解密依赖:必须持有对应的 RSA 私钥,并用 RSA-OAEP 解密,还原出 32 字节的 SessionKey。 3.3 Nonce (12 字节) 生成方式:加密前随机生成,每加密一个文件重新生成一次。 作用:确保相同密钥加密相同文件时,密文输出不同。 安全性:公开明文,无需保密。 3.4 Ciphertext (长度 = 原文长度) 加密算法:AES-256-GCM 密钥:由 EncryptedKey 解密后得到的 32 字节 SessionKey 随机数:Nonce 处理方式:原文分块(1 MB/块)加密,输出长度与原文完全一致。 3.5 Tag (16 字节) 生成方式:AES-GCM 算法在加密结束时,根据 SessionKey、Nonce 和全部 Ciphertext 计算得出。 作用:解密时用于验证密文是否被篡改或损坏。 校验过程:解密后重新计算 Tag,与文件末尾的 Tag 比较;若不一致,则抛出异常并删除输出文件。 完整加密流程(参考) 加载接收方 RSA 公钥。 生成 32 字节 AES 会话密钥 + 12 字节 Nonce。 使用 AES-256-GCM 加密原始文件,得到 Ciphertext 和 Tag。 使用 RSA-OAEP 加密 AES 会话密钥,得到 EncryptedKey。 按顺序写入文件: [4字节长度] + [256字节EncryptedKey] + [12字节Nonce] + [Ciphertext] + [16字节Tag] 完整解密流程(参考) 读取前 4 字节,验证长度是否为 256。 读取 256 字节 EncryptedKey,使用 RSA 私钥 (OAEP) 解密,还原出 AES 会话密钥。 读取 12 字节 Nonce。 读取剩余所有数据,从中分离出末尾 16 字节的 Tag,前面部分为 Ciphertext。 使用 AES-256-GCM(会话密钥 + Nonce)解密 Ciphertext,同时验证 Tag。 校验通过后输出原始文件。 兼容性说明 二进制字节序:所有整数采用大端序(Big-Endian)编码。 加密算法:完全遵循 NIST 标准,任何支持 RSA-OAEP 和 AES-256-GCM 的加密库均可实现互操作。 示例代码(Python)可参考程序中的 process_file_hybrid 函数。 文件示例(十六进制头部) 一个典型的 .enc 文件开头可能如下(256 字节的 EncryptedKey 为随机内容,此处省略中间部分): 00 00 01 00 (EncryptedKeyLength = 256) A3 F1 9C 2B ... (256字节随机乱码) D4 8A 67 1C (12字节 Nonce) ... 注意事项 解密时必须使用与加密公钥配对的 RSA 私钥,否则 AES 会话密钥无法还原。 若私钥受密码保护,需先通过 scrypt 派生密钥解锁私钥文件。 Tag 验证失败时,务必丢弃输出文件,防止使用被篡改的数据。 本格式为私有格式,但算法与公开标准完全兼容,可用于跨平台文件交换。