文件加密解密
文件加密解密是用一个口令把任意文件变成只有知道口令才能还原的 .enc 加密文件的在线工具。本页用浏览器内置的 Web Crypto,口令经 PBKDF2-SHA256 迭代 60 万次派生密钥,文件按 1MB 分段用 AES-256-GCM 加密,原文件名也一起加密。口令错误或文件被改动都会直接提示,不会输出乱码。全程本地处理,文件和口令不上传。
加解密全部在浏览器本地用 Web Crypto 完成,文件和口令不上传、不保存;页面只记住「用随机名」这一项偏好。
如何使用文件加密解密
在「加密文件」模式选择要加密的文件(照片、视频、文档、压缩包都可以),设置口令并在「确认口令」里再输一遍;想连文件名也藏起来,勾选「用随机名」。
点「加密」,等进度走完后点「下载加密文件」得到 .enc 文件,把它发给对方,口令通过另一个渠道(电话、当面)告知;可先点「去解密验证」当场确认能解开。
对方打开本页切到「解密文件」,选择 .enc 文件并输入口令,点「解密」后下载原文件,原来的文件名会自动还原;口令不对或文件不完整会直接报错。
关于文件加密解密的常见问题
- 在线文件加密会把我的文件上传到服务器吗?
- 不会。加密和解密都由浏览器内置的 Web Crypto 在你的设备上完成,文件和口令都不经过网络,页面加载完后断网也能加解密。本页不保存文件、文件名和口令,只在本地记住你是否勾选了「用随机名」。
- 加密后的enc文件对方要怎么解密打开?
- 让对方打开本页,切到「解密文件」,选择你发的 .enc 文件并输入口令即可,原文件名会自动还原。口令请通过电话、当面等另一个渠道告知,不要和加密文件发在同一个聊天里。对方也可以不用本站,用正文里那段 Node.js 解密脚本在自己电脑上解开。
- 文件加密的口令忘了还能解密吗?
- 不能。本工具没有后门,也没有任何找回口令的途径,口令不会离开你的浏览器,本站同样解不开。所以加密时要输两遍口令,并建议把口令记在密码管理器里;想要既好记又足够强的口令,可以用口令短语生成器生成 5~6 个随机单词。
- 给文件加密码后原文件名还会暴露吗?
- 原文件名和文件类型都被加密保存在 .enc 文件里,不知道口令就看不到。默认输出名是「原文件名.enc」,勾选「用随机名」后会变成 encrypted-加 8 位随机字符,连外面的名字也看不出是什么文件。需要说明的是,文件大小仍然可见,加密只比原文件多出很少的字节。
- 解密文件时提示口令不正确或文件损坏怎么办?
- 提示口令不正确时,先核对大小写、首尾空格和全角半角,必须一模一样。提示文件不完整,多半是聊天软件、网盘或邮件传输中断了,请对方重新发一次完整的 .enc 文件。提示第几段已损坏,说明文件在那个位置被改动过,本页不会输出残缺或乱码的文件。
- 照片加密、视频加密这类大文件最大支持多大?
- 任意类型的文件都能加密,照片加密、视频加密、文档加密都一样,单个文件最大 1GB。文件在浏览器内存里处理,超过 256MB 时建议用电脑浏览器,手机可能因内存不足失败;视频太大可以先压缩再加密。
- 文件加密能一次加密多个文件或整个文件夹吗?
- 本页一次只加密一个文件。要加密多个文件或整个文件夹,先用「在线创建 ZIP」把它们打包成一个 zip 压缩包,再把这个 zip 拿来加密,对方解密后解压即可。
- 文件加密和zip压缩包加密码有什么区别?
- zip 加密码的好处是对方用解压软件输入密码就能打开,但很多 zip 工具不加密文件名,旧的 ZipCrypto 加密也比较弱。本页用 AES-256-GCM 分段认证加密,文件名一起加密,文件被改动能准确报错;代价是对方需要打开本页或用正文的脚本来解密。
- 别的软件生成的enc文件能用这个工具解密吗?
- 不能。.enc 只是一个扩展名,不同软件的加密格式完全不同。本页只能解开以 DTEF 开头的、由本工具生成的加密文件;选中别的文件时页面会提示它是什么格式。OpenSSL 命令加密的文件请用 openssl enc -d 命令解密。
- 手机浏览器上能给文件加密解密吗?
- 能。iOS Safari、安卓 Chrome 和微信内置浏览器都支持 Web Crypto,直接用手机浏览器打开本页即可,不用安装文件加密软件。需要通过 https 访问;手机内存有限,几百 MB 以上的大文件建议用电脑处理。
enc加密文件的格式结构是什么
本页生成的 .enc 文件格式是公开的:开头 37 字节是明文头部,记录解密需要的参数,并作为每一段 AES-GCM 的附加认证数据;改动头部任何一个字节,所有段都会认证失败。原文件按 1 MB 分段,每段单独加密并带16 字节认证标签,段号和「是否最后一段」写进 nonce,所以删段、调换顺序、截断都能被发现。
| 字段 | 字节数 | 说明 |
|---|---|---|
| 魔数 | 4 | 固定为 DTEF,用来识别本工具的加密文件 |
| 版本 | 1 | 当前为 1 |
| KDF | 1 | 1 表示 PBKDF2-SHA256 |
| 迭代次数 | 4 | 大端整数,默认 600,000 |
| 盐 | 16 | 每次加密随机生成,参与密钥派生 |
| 分段大小 | 4 | 大端整数,默认 1,048,576(1 MB) |
| nonce 前缀 | 7 | 每次加密随机生成,与段号拼成每段的 nonce |
| 元数据段 | 1040 | 加密后的原文件名、类型与大小(明文定长 1024 字节,不泄露文件名长度) |
| 数据段 | 明文 + 16 | 每段 AES-256-GCM 密文加认证标签,最后一段可以不满 |
文件加密后体积会变大多少字节
加密几乎不增加体积:固定多出 1077 字节(头部与元数据段),另外每 1 MB 多 16 字节认证标签。下表按本页的计算公式现算。
| 原大小 | 加密后 | 多出 |
|---|---|---|
| 0 B(空文件) | 1,077 | 1,077 |
| 1 MB | 1,049,669 | 1,093 |
| 100 MB | 104,860,277 | 2,677 |
| 1 GB | 1,073,759,285 | 17,461 |
文件加密、zip加密码和PDF密码怎么选
| 对比项 | 本页 AES 文件加密 | zip 压缩包加密码 | PDF 设置密码 |
|---|---|---|---|
| 对方用什么打开 | 本页或正文的 Node.js 脚本 | 任意解压软件 | 任意 PDF 阅读器 |
| 能否加密任意文件 | 能,照片、视频、文档都行 | 能,可一次打包多个 | 只能是 PDF |
| 文件名是否隐藏 | 隐藏,原文件名一起加密 | 多数工具不隐藏 | 不适用 |
| 完整性校验 | 有,能定位到第几段被改 | 取决于加密方式 | 无 |
| 适合场景 | 发私密文件、网盘备份 | 对方不方便打开网页 | 只需要保护一份 PDF |
要把多个文件一起加密,先用 在线创建 ZIP 打包再来本页;只想给 PDF 设打开密码,用姊妹站 pdftools 的 PDF 加密更合适;想确认加密前后文件没变,可以用 文件 MD5/SHA 校验对比解密后的文件。要加密的是一段文字而不是文件,用 文本加密解密。
不用本站也能解密enc文件
担心哪天打不开本站?下面这段脚本只用 Node.js 18+ 自带的模块,按上面的文件结构解开 .enc 文件。把它保存为 decrypt-enc.mjs,在命令行运行 node decrypt-enc.mjs 文件.enc 口令, 原文件会以原来的名字写到当前目录。
// 小鹿tools .enc 文件解密脚本(DTEF v1),需要 Node.js 18+,不联网、不依赖第三方包。
// 用法:node decrypt-enc.mjs 文件.enc 口令
import { readFileSync, writeFileSync, existsSync } from 'node:fs';
import { pbkdf2Sync, createDecipheriv } from 'node:crypto';
const [file, password] = process.argv.slice(2);
const fail = (msg) => { console.error(msg); process.exit(1); };
if (!file || password === undefined) fail('用法:node decrypt-enc.mjs 文件.enc 口令');
const data = readFileSync(file);
if (data.length < 1077 || data.toString('latin1', 0, 4) !== 'DTEF') fail('不是小鹿tools加密的 .enc 文件');
// 头部 37 字节:DTEF | 版本 | KDF | 迭代次数 | 盐 16 | 分段大小 | nonce 前缀 7
const header = data.subarray(0, 37);
if (header[4] !== 1 || header[5] !== 1) fail('不支持的文件版本');
const iter = header.readUInt32BE(6);
const salt = header.subarray(10, 26);
const chunk = header.readUInt32BE(26);
const prefix = header.subarray(30, 37);
if (iter < 1 || iter > 5000000 || chunk < 1024 || chunk > 16777216) fail('文件头部参数异常');
// 口令先做 NFC 归一再按 UTF-8 派生 256 位密钥
const key = pbkdf2Sync(Buffer.from(password.normalize('NFC'), 'utf8'), salt, iter, 32, 'sha256');
// 每段 nonce = 前缀 7 字节 + 段号(大端 4 字节)+ 是否最后一段(1 字节),头部作为 AAD
const open = (counter, last, ct) => {
const nonce = Buffer.concat([prefix, Buffer.alloc(5)]);
nonce.writeUInt32BE(counter, 7);
nonce[11] = last ? 1 : 0;
const d = createDecipheriv('aes-256-gcm', key, nonce);
d.setAAD(header);
d.setAuthTag(ct.subarray(ct.length - 16));
return Buffer.concat([d.update(ct.subarray(0, ct.length - 16)), d.final()]);
};
let meta;
let metaLast;
for (const last of data.length === 1077 ? [true, false] : [false, true]) {
try { meta = open(0, last, data.subarray(37, 1077)); metaLast = last; break; } catch {}
}
if (!meta) fail('口令不正确(或文件头部被改动过)');
const info = JSON.parse(meta.toString('utf8', 2, 2 + meta.readUInt16BE(0)));
if (metaLast !== (info.s === 0)) fail('文件已损坏或被改动过');
const k = Math.ceil(info.s / chunk);
if (data.length !== 1077 + info.s + 16 * k) fail('文件不完整或末尾有多余数据');
const parts = [];
for (let i = 1, off = 1077; i <= k; i++) {
const len = Math.min(chunk, info.s - (i - 1) * chunk) + 16;
try { parts.push(open(i, i === k, data.subarray(off, off + len))); } catch { fail('第 ' + i + ' 段已损坏或被改动'); }
off += len;
}
// 还原原文件名(去掉路径与非法字符),不覆盖已有文件
const name = String(info.n).split(/[\\/]/).pop().replace(/[\u0000-\u001f\u007f:*?"<>|]/g, '_')
.trim().replace(/[.\s]+$/, '').replace(/^\./, '_') || 'decrypted-file';
if (existsSync(name)) fail('当前目录已有同名文件:' + name);
writeFileSync(name, Buffer.concat(parts));
console.log('已解密:' + name + '(' + info.s + ' 字节)');
文件加密工具还有哪些叫法
这个文件加密工具也常被叫作在线文件加密、免费文件加密、给文件加密码、文件设置密码或文件加密码:选一个文件、设一个口令,就是加密文件; 选 .enc 文件、输入口令,就是解密文件。它做的是 AES文件加密,英文里搜 file encrypt online、aes file encryption 的也是这类工具。和需要安装的文件加密软件不同,它在浏览器里就能完成,但 enc文件解密只支持本工具生成的文件。