무료 프라이버시 도구
브라우저에서 파일 암호화
파일을 고르고, 패스프레이즈를 정하고, 암호화된 사본을 다운로드하세요. AES-256-GCM이며, 키는 이 브라우저에서 유도됩니다. 아무것도 업로드되지 않고, 한 번 로드되면 오프라인에서도 작동합니다. 아래에 포맷이 바이트 단위로 문서화되어 있으니, 저희 말을 믿을 필요조차 없습니다.
이 탭 안에서만 실행됩니다. 업로드되는 것은 없고, 한 번 로드되면 오프라인에서도 작동합니다.
어떤 파일이든 됩니다. 큰 파일은 메모리가 필요합니다. 아래의 정직한 한계를 보세요.
복구는 없습니다. 패스프레이즈를 잊으면 그 파일은 저희를 포함해 누구도 영원히 열 수 없습니다.
모든 매개변수, 명시
- 암호 알고리즘
- AES-256-GCM (WebCrypto), 128비트 태그
- 키 유도
- PBKDF2-HMAC-SHA-256, 600,000회 반복
- KDF 솔트
- 16바이트, CSPRNG, 파일마다 새로 생성
- GCM 논스
- 12바이트, CSPRNG, 파일마다 새로 생성
- 인증 데이터
- 42바이트 헤더 전체, 따라서 명시된 매개변수 하나라도 변조되면 복호화가 실패합니다
- 패스프레이즈 인코딩
- UTF-8, NFC 정규화 (어느 기기에서 입력해도 같은 문구가 같은 키를 유도하도록)
정직한 한계
이것은 Sealby 앱의 금고 포맷이 아닙니다. 앱은 기기별로 보정된 Argon2id로 키를 유도하고, Secure Enclave로 감싸고, 콘텐츠를 부인 가능한 청크 컨테이너에 저장합니다. 웹 페이지는 그 어느 것도 할 수 없습니다. 이 페이지는 브라우저가 기본으로 제공하는 것 위에 세운 독립 유틸리티입니다.
PBKDF2는 메모리 하드가 아닙니다. 브라우저가 기본 탑재한 유일한 키 유도 함수이고, 600,000회 반복은 추측 한 번을 느리게 만들지만, GPU 장비는 여전히 Argon2id보다 훨씬 빠르게 공격합니다. 따라서 보호는 패스프레이즈에 있습니다. 암호 하나가 아니라, 무작위 단어 네 개 이상.
WebCrypto는 한 번에 암호화합니다. 스트리밍이 없어서 처리하는 동안 파일 전체가 메모리에 두세 배로 올라갑니다. 수백 메가바이트는 대부분의 기기에서 괜찮습니다. 수 기가바이트 아카이브에는 데스크톱 도구를 쓰세요. 또한 암호화된 출력은 파일의 대략적인 크기를 드러냅니다. 이름은 안에 암호화되지만, 크기는 숨겨지지 않습니다.
포맷, 바이트 단위로
기술 독자가 이 페이지의 출력을 독립적으로 검증하거나, Python 스무 줄로 복호화하는 데 필요한 전부:
| bytes | field | contents |
|---|---|---|
| 0–7 | magic | ASCII "SBXF0001" |
| 8 | version | 0x01 |
| 9 | algorithm | 0x01 = AES-256-GCM + PBKDF2-HMAC-SHA-256 |
| 10–13 | iterations | uint32, 빅 엔디언 (600,000) |
| 14–29 | salt | 16바이트 |
| 30–41 | nonce | 12바이트 |
| 42–끝 | ciphertext | 페이로드의 AES-256-GCM, AAD = 0–41 바이트; 마지막 16바이트는 GCM 태그 |
암호화 전 페이로드: [2바이트 이름 길이, 빅 엔디언][파일 이름, UTF-8][파일 바이트]. 원래 파일 이름은 암호화되어 함께 이동하고, 복호화 시 복원됩니다.
참조 복호화기 (Python, cryptography 라이브러리)
import sys, hashlib, struct, unicodedata
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
raw = open(sys.argv[1], "rb").read()
assert raw[:8] == b"SBXF0001" and raw[8] == 1 and raw[9] == 1
iters = struct.unpack(">I", raw[10:14])[0] # 600000
salt, nonce, ct = raw[14:30], raw[30:42], raw[42:]
phrase = unicodedata.normalize("NFC", sys.argv[2]).encode()
key = hashlib.pbkdf2_hmac("sha256", phrase, salt, iters, 32)
plain = AESGCM(key).decrypt(nonce, ct, raw[:42]) # AAD = header
name_len = struct.unpack(">H", plain[:2])[0]
name = plain[2 : 2 + name_len].decode()
open(name, "wb").write(plain[2 + name_len :])
print("decrypted ->", name)이것은 데모입니다. 금고가 제품입니다.
파일 하나, 패스프레이즈 하나, 페이지 하나. 브라우저가 할 수 있는 것은 여기까지입니다. Sealby는 제대로 합니다. 내 기기에 맞춰 보정된 Argon2id, Secure Enclave 속 키, 그리고 목록이나 개수가 어디에도 저장되지 않는 숨김 금고.
iPhone과 iPad · iOS 17+ · 무료