一個 Windows 桌面 GUI 工具,用來對檔案做加密與解密,可一次處理多個檔案。 介面純中文、免安裝、可攜。
到 Releases 下載 file-crypto-vX.Y.Z-windows-x64.exe,雙擊即可執行,不需安裝。
每個 exe 都由 GitHub Actions 從原始碼自動建置,並附上 .sha256 檔供驗證:
Get-FileHash .\file-crypto-v1.5.0-windows-x64.exe -Algorithm SHA256首次執行時 Windows SmartScreen 可能會警告「無法辨識的應用程式」,這是因為 exe 沒有程式碼簽章。點「其他資訊 → 仍要執行」即可。
本程式唯一的官方來源是下列 GitHub 頁面:
| 用途 | 網址 |
|---|---|
| 原始碼 | https://github.com/tntrock/file-crypto |
| 官方下載 | https://github.com/tntrock/file-crypto/releases |
| 問題回報 | https://github.com/tntrock/file-crypto/issues |
- 其他網站、網路硬碟或他人轉傳的檔案,可能已被植入惡意程式,請勿使用。
- 作者不會透過私訊、Email 或其他管道傳送程式,也不會向你索取密碼或金鑰檔。
- 程式內按視窗下方的「關於」也能看到這些資訊:
- 加密演算法:AES-256-GCM(AEAD,含完整性驗證,防竄改)
- 金鑰衍生:Argon2id(64 MiB / 3 iterations / 平行度 1),抗暴力破解
- 串流分塊加密:以 1 MiB 分塊處理,支援 GB 等級大檔,不吃爆記憶體
- 兩種金鑰來源:使用者密碼 或 金鑰檔(任何檔案皆可當金鑰,以串流雜湊處理,再大的檔案也不佔記憶體)
- 產生金鑰檔:一鍵產生 512 位元的隨機金鑰檔,自動設為唯讀,且絕不覆蓋既有檔案
- 檔名也加密:原始檔名存在加密內容裡,
.enc檔可以任意改名,解密時自動還原 - 絕不毀損既有檔案:先寫入暫存檔,成功才改名成正式檔名;密碼錯誤、檔案損毀或取消時,不會動到任何既有檔案
- 批次處理:一次選擇多個檔案,用同一組密碼或金鑰檔各自加解密;某個檔案失敗時其餘照常處理,最後列出結果
- 拖放檔案:直接把檔案從檔案總管拖進視窗
- 進度顯示 + 取消:即時進度條(批次時顯示目前第幾個檔案),可中途取消
- 新版提示:啟動時自動檢查 GitHub 上是否有新版本(可關閉),也可以手動檢查
- 單一 exe:複製即用,可放在隨身碟
- 選擇「🔒 加密」,點「選擇輸入檔…」。
- 輸出位置預設為
原檔名.enc,可按「輸出位置…」更改。 - 選金鑰來源:輸入兩次密碼,或選擇金鑰檔。 沒有金鑰檔時,可以按「產生新金鑰檔…」建立一個(見下方說明)。
- 按「開始加密」。
- 在加密模式選擇「📄 金鑰檔」,按「產生新金鑰檔…」,選擇存放位置(預設檔名
file-crypto.key)。 - 程式會以作業系統的安全亂數產生器寫入 64 位元組(512 位元)的隨機內容,並自動選用這個金鑰檔。
- 金鑰檔會設為唯讀,避免不小心被修改;若選到已存在的檔案,程式會拒絕,絕不覆蓋既有的金鑰檔。
- 請立即把金鑰檔備份到其他地方(例如隨身碟)。金鑰檔遺失或被修改,用它加密的檔案將永遠無法解密。
- 選擇「🔓 解密」,點「選擇輸入檔…」挑選
.enc檔。程式會自動切換成加密時使用的金鑰來源。 - 輸出位置預設為同一資料夾、使用原始檔名;若已有同名檔案,會自動存成
名稱 (1).副檔名,不會覆蓋。 也可以按「輸出位置…」指定檔案;指定的檔案已存在時會先詢問是否覆蓋。 - 輸入密碼或選擇金鑰檔,按「開始解密」。
- 按「選擇輸入檔…」時可以一次選取多個檔案,或直接把多個檔案拖進視窗。按「檔案清單」可展開查看,按「清除」重新選擇。
- 輸出位置預設為每個檔案各自所在的資料夾;也可以按「輸出資料夾…」統一放到同一個資料夾。
- 批次處理一律不覆蓋既有檔案:遇到同名檔案時自動加上編號,例如
報告.docx (1).enc。 - 所有檔案使用同一組密碼或金鑰檔。某個檔案失敗(例如密碼不符、檔案損毀)時,其餘檔案照常處理,完成後會列出成功與失敗的檔案及原因。
- 按「取消」會停止目前的檔案,剩下的檔案不再處理。
每個檔案都會各自產生獨立的
.enc檔,格式與單檔加密完全相同,可以個別解密。
- 視窗最下方有「檢查更新」按鈕,以及「啟動時自動檢查更新」選項(預設開啟)。
- 發現新版本時,視窗上方會出現提示,按「前往下載」會用瀏覽器開啟該版本的 Release 頁面。
- 只會提示,不會自動下載或替換程式:請自行下載,並用
.sha256檔驗證。 - 檢查時只會向
api.github.com查詢最新版本號,不會傳送任何檔案或密碼。但 GitHub 會看到你的 IP 位址;若希望程式完全不連網,請取消勾選自動檢查。 - 設定儲存在
%APPDATA%\file-crypto\settings.ini。
- 認證式加密:AES-256-GCM 為業界標準的 AEAD。密碼/金鑰錯誤或檔案遭竄改時,解密會直接失敗,不會輸出錯誤的明文。
- 標頭受保護:整段標頭(版本、金鑰來源、Argon2 參數、salt、nonce)作為每個分塊的附加驗證資料(AAD),竄改任何一個位元組都會解密失敗。
- 隨機 salt 與 nonce:每次加密都重新產生;相同檔案、相同密碼,每次的密文都不同。
- STREAM 分塊:採用 STREAM(BE32)建構,每個分塊各自帶驗證標籤,可偵測分塊被重排、刪除或截斷。
- 不信任輸入檔:解密前會檢查標頭參數的上限(避免惡意檔案耗盡記憶體),並把還原的檔名淨化為單純檔名(避免
..\或絕對路徑把檔案寫到其他位置)。 - 敏感資料清除:衍生出的金鑰與明文緩衝區使用後以
zeroize清零。
⚠️ 請務必牢記密碼,並備份好金鑰檔。 本工具沒有任何後門或救援機制,遺失即無法解密。
- 本工具未經專業安全稽核。 設計上使用成熟的密碼學套件(RustCrypto),但請自行評估是否適合你的用途。
- 金鑰檔必須逐位元組相同。 任何檔案都能當金鑰檔,但只要內容有一點改變(例如圖片被重新存檔、被修改中繼資料),就再也無法解密。建議使用程式產生的金鑰檔(見「產生金鑰檔」),或其他不會變動的檔案,並另外備份。
- 不能同時使用密碼和金鑰檔。
- 不支援資料夾。 拖進資料夾會被略過;目前也無法把多個檔案打包成單一加密檔(每個檔案會各自產生
.enc,別人看得出檔案數量與大小)。 - 批次處理時,每個檔案都要各算一次金鑰(Argon2id),檔案很多時會比較慢。
.enc檔名本身不加密。 預設輸出名稱是原檔名.enc;若不想透露檔名,請自行把.enc檔改名(解密時仍會還原原始檔名)。- 輸入框中的密碼由 GUI 框架管理,無法保證在記憶體中被完全清除。
- 只支援 Windows(介面字型取自 Windows 系統字型)。
目前版本為 v2(v1.1.0 起)。所有整數為小端序。
| 位移 | 長度 | 欄位 |
|---|---|---|
| 0 | 6 | Magic = RFENC1 |
| 6 | 1 | 格式版本(2) |
| 7 | 1 | 演算法(1 = AES-256-GCM / STREAM BE32) |
| 8 | 1 | 金鑰來源(0 = 密碼、1 = 舊式金鑰檔、2 = 金鑰檔雜湊) |
| 9 | 4 | Argon2 m_cost(KiB) |
| 13 | 4 | Argon2 t_cost(迭代次數) |
| 17 | 4 | Argon2 p_cost(平行度) |
| 21 | 1 | Salt 長度(16) |
| 22 | 16 | Salt |
| 38 | 7 | STREAM nonce 前綴 |
| 45 | … | 加密分塊(每塊 = 明文 1 MiB + 16 位元組驗證標籤,最後一塊可較短) |
- 位移 0–44 的標頭作為每個分塊的 AAD。
- 加密前的明文串流為:
原始檔名長度 (u16)+原始檔名 (UTF-8)+檔案內容。 - 金鑰 = Argon2id(輸入, salt),長度 32 位元組。依金鑰來源,Argon2 的輸入為:
0(密碼):密碼的 UTF-8 位元組2(金鑰檔,v1.2.0 起):金鑰檔的 BLAKE2b-512 雜湊值(串流計算)1(舊式金鑰檔,v1.1.0 以前):金鑰檔的完整內容;僅用於解密舊檔
| 格式 | 產生版本 | 新版可否解密 | 差異 |
|---|---|---|---|
| v2 | v1.1.0 起 | ✅ | 標頭受驗證、檔名加密(v1.2.0 起金鑰檔改用雜湊,見下方說明) |
| v1 | v1.0.0 – v1.0.1 | ✅ | 標頭未受驗證,原始檔名以明文存在標頭 |
新版一律產生 v2 檔案;舊版程式無法解密 v2 檔案。解密 v1 檔案時程式會提示,建議解密後重新加密。
金鑰檔加密的檔案:v1.2.0 起改用金鑰檔的雜湊值(金鑰來源 2),所以 v1.2.0 以後用金鑰檔加密的檔案,v1.1.0 無法解密;用密碼加密的檔案則不受影響。新版仍可解密舊版用金鑰檔加密的檔案。
- 安裝 Rust 工具鏈(含
cargo)。 - MSVC 工具鏈需要 Windows SDK 的
rc.exe來嵌入 exe 圖示(安裝 Visual Studio Build Tools 即內含);GNU 工具鏈則需要 MinGW-w64。
git clone https://github.com/tntrock/file-crypto.git
cd file-crypto
cargo build --release產物:target\release\file-crypto.exe
rustup target add x86_64-pc-windows-gnu
cargo build --release --target x86_64-pc-windows-gnu產物:target/x86_64-pc-windows-gnu/release/file-crypto.exe
(需安裝 MinGW-w64;Debian/Ubuntu:sudo apt install mingw-w64)
cargo test測試涵蓋加解密往返、分塊邊界、竄改與截斷偵測、失敗時不毀損既有檔案、惡意標頭、金鑰檔、批次處理,以及舊檔相容性。
- 修改
Cargo.toml的version(例如1.1.1)並合併到main。 - 推送同名 tag:
git tag -a v1.1.1 -m "v1.1.1" git push origin v1.1.1 - GitHub Actions 會自動跑測試、編譯 exe、計算 SHA-256,並上傳到同名的 Release。若 tag 與
Cargo.toml版本不一致,建置會失敗。
- EXE 檔案圖示(檔案總管):
build.rs透過winresource把assets/icon.ico嵌入 exe。 - 視窗圖示(標題列/工作列):
main.rs讀取assets/icon.png。
替換這兩個檔案即可:icon.ico 建議包含 256/48/32/16 多種尺寸,icon.png 建議 256×256。
file-crypto/
├─ .github/workflows/
│ ├─ ci.yml # push/PR 時執行格式檢查、clippy、測試
│ └─ release.yml # 推送 v* tag 時建置 exe 並發佈
├─ assets/
│ ├─ icon.ico # exe 檔案圖示(多尺寸)
│ └─ icon.png # 視窗/工作列圖示(256×256)
├─ docs/
│ ├─ screenshot.png
│ └─ about.png
├─ src/
│ ├─ main.rs # 進入點、視窗設定、載入視窗圖示
│ ├─ batch.rs # 批次處理:逐一加解密多個檔案並彙整結果
│ ├─ app.rs # egui GUI 介面(含「關於」視窗)與背景工作執行緒
│ ├─ crypto.rs # AES-256-GCM + Argon2id 核心、檔案格式與單元測試
│ ├─ project.rs # 專案資訊:版本、作者、授權、官方網址(取自 Cargo.toml)
│ └─ update.rs # 檢查新版本與使用者設定
├─ tests/fixtures/
│ ├─ v1_sample.enc # v1 格式範例檔(密碼)
│ ├─ v2_keyfile_legacy.enc # v1.1.0 以舊式金鑰檔加密的範例檔
│ └─ keyfile.bin # 上面範例檔使用的金鑰檔
├─ build.rs # 建置腳本:嵌入 exe 圖示與版本資訊
├─ Cargo.toml
└─ Cargo.lock

