업데이트로 돌아가기
UpdatedSep 2, 2026

jdvrif — Updated!

JPG 이미지용 스테가노그래피 도구

공유

jdvrif

jdvrifJPG 이미지를 통해 모든 파일 유형을 숨기고 추출할 수 있는 빠르고 사용하기 쉬운 스테가노그래피 명령줄 도구입니다.

CLI 소스 코드를 다운로드하고 컴파일하는 대신 바로 사용할 수 있는 편리한 대안으로 웹 버전도 있습니다. 웹 파일 업로드는 20MB로 제한됩니다.

해당 언어에 관심이 있는 분들을 위해 실험적인 Rust 포트인 jdvrif-rs도 제공됩니다.

데모 이미지
데모 이미지: "은닉의 장소" / PIN: 2190398302048725932

커버 이미지의 픽셀 내에 데이터를 숨기는 일반적인 LSB 스테가노그래피 방식과 달리, jdvrif는 대부분 JPG 이미지의 애플리케이션 세그먼트(ICC, EXIF, XMP 등) 내에 데이터를 숨깁니다.

이에 대한 예외는 Reddit 플랫폼 은닉 모드(-r)로, 이 경우 QIM 스테가노그래피 방식(JPEG DCT 도메인 양자화 인덱스 변조)을 사용합니다. 이는 현재 Reddit에서 작동하는 유일한 저장 방식이기 때문입니다.

기본 은닉 모드에서는 최대 2GB까지 모든 파일 유형을 숨길 수 있지만, 다른 플랫폼 은닉 모드와 호환 사이트(아래 나열)는 각각 훨씬 더 작은 크기 제한과 *기타 요구 사항이 있습니다.

저장 용량을 늘리고 보안을 강화하기 위해, 임베디드 데이터 파일은 libdeflate/zlib로 압축되고(이미 10MB를 초과하는 압축 파일 유형이 아닌 경우) libsodium 암호화 라이브러리를 사용하여 XChaCha20-Poly1305로 암호화됩니다.

jdvrif는 부분적으로 보안 연구원 ***David Buchanan***이 구현한 기술에서 파생되었습니다.

컴파일 및 사용법 (Linux)

$ sudo apt update
$ sudo apt install g++ cmake ninja-build util-linux libsodium-dev libturbojpeg0-dev zlib1g-dev libdeflate-dev

$ chmod +x compile_jdvrif.sh
$ ./compile_jdvrif.sh

$ sudo cp jdvrif /usr/bin
$ jdvrif 

Usage: jdvrif conceal [-b] <cover_image> <secret_file>
       jdvrif recover <cover_image>  
       jdvrif --info

$ jdvrif conceal your_cover_image.jpg your_secret_file.doc
 
Platform compatibility for output image:-

  ✓ X-Twitter
  ✓ Tumblr
  ✓ Mastodon
  ✓ Pixelfed
  ✓ PostImage
  ✓ ImgBB
  ✓ ImgPile
  ✓ Flickr
  
Saved "file-embedded" JPG image: jrif_4e87c566c.jpg (143029 bytes).

Recovery PIN: [***2166776980318349924***]

Important: Keep your PIN safe, so that you can extract the hidden file.

Complete!
        
$ jdvrif recover jrif_4e87c566c.jpg

PIN: *******************

Extracted hidden file: your_secret_file.doc (6165 bytes).

Complete! Please check your file.

호환 플랫폼

******************
참고: Bluesky는 이제 기본적으로 이미지를 WEBP로 저장합니다.

jdvrif로 은닉 데이터를 계속 복구할 수 있도록 이미지를 JPG로 저장하려면: 게시물의 이미지를 먼저 클릭하여 연 다음, 이미지를 마우스 오른쪽 버튼으로 클릭하세요. 메뉴에서 새 탭에서 이미지 열기를 선택합니다.

새 탭을 선택하고 주소 표시줄에서 주소 끝으로 이동하여 @jpg를 추가한 다음 Enter를 누르세요. 이미지를 마우스 오른쪽 버튼으로 클릭하고 메뉴에서 ***이미지 저장...***을 선택합니다.

이제 이미지가 JPG로 다운로드되며, jdvrif에서 사용할 수 있습니다.

Bluesky에 게시하기 위해 WEBP 이미지를 사용하여 데이터를 숨기는 도구가 필요하다면, 제 WEBP 스테가노그래피 CLI 도구 wbpdv를 사용할 수 있습니다. ************

게시 크기 제한은 커버 이미지 + 압축 데이터 파일합산 크기로 측정됩니다:

Flickr (200MB), ImgPile (100MB), ImgBB (32MB),
PostImage (32MB), Pixelfed (15MB).

크기 제한은 압축 데이터 파일 크기로만 측정됩니다:

Mastodon (~6MB), Tumblr (~64KB), X-Twitter (~10KB).

예를 들어, Mastodon의 경우 커버 이미지가 1MB라도 최대 ~6MB 크기 제한까지 데이터 파일을 임베드할 수 있습니다.

기타: Bluesky 플랫폼은 커버 이미지압축된 숨김 데이터 파일에 대해 별도의 크기 제한이 있습니다:

Bluesky (-b 옵션). 커버 이미지 최대 크기 제한 (2,000,000 바이트 / ~1.9MB). 압축된 숨김 데이터 파일(페이로드) 최대 크기 제한 (~171KB).

최종 임베디드 커버 이미지(커버 이미지 + 숨김 파일)는 2,000,000 바이트(~1.9MB)를 초과할 수 없습니다. Bluesky에 이미지를 게시하려면 "create_bsky_post.py" 스크립트가 필요합니다. 이 스크립트에 대한 자세한 정보는 페이지 하단에 있습니다.

Reddit (-r 옵션). Reddit 플랫폼의 이미지 업로드 크기 제한은 20MB이지만, 커버 이미지의 데이터 저장 용량은 훨씬 더 작으며 이미지 크기에 따라 달라집니다.

예를 들어, 1024x1024 크기의 커버 이미지는 ~6KB의 데이터만 저장할 수 있고, 4096x4096 크기의 이미지는 ~109KB, 6324×6324 최대 크기의 이미지는 ~254KB를 저장할 수 있습니다.

X-Twitter, RedditTumblr과 같이 데이터 크기 제한이 작은 플랫폼의 경우, 텍스트 파일 등 압축률이 좋은 데이터에 집중하는 것이 좋습니다.

https://github.com/user-attachments/assets/c8c38e6d-ea23-4d67-98d9-cebdcd82b449

https://github.com/user-attachments/assets/88aaa5f7-3272-4d0c-aa59-1a5bfe2f08dc

jdvrif 모드 인수:

conceal - 비밀 데이터 파일을 JPG 커버 이미지 내에 압축, 암호화 및 임베드합니다.
recover - JPG 커버 이미지에서 은닉된 데이터 파일을 복호화, 압축 해제 및 추출합니다.

jdvrif conceal 모드 플랫폼 옵션:

"-r" Reddit 플랫폼에 게시하기 위한 호환 "파일 임베디드" JPG 이미지를 만들려면 conceal 모드와 함께 -r 옵션을 사용해야 합니다.

$ jdvrif conceal -r my_image.jpg hidden.doc

이 이미지는 Reddit에만 게시할 수 있습니다. 다른 플랫폼에 게시하면 임베디드 데이터 파일이 제거됩니다.

Reddit에서 이미지를 저장/다운로드할 때는 게시물 내의 이미지를 클릭하여 완전히 확장한 후 저장해야 합니다.

https://github.com/user-attachments/assets/9f1b4607-e7f1-4c5f-8929-b42c1a85bb88

"-b" Bluesky 플랫폼에 게시하기 위한 호환 "파일 임베디드" JPG 이미지를 만들려면 conceal 모드와 함께 -b 옵션을 사용해야 합니다.

$ jdvrif conceal -b my_image.jpg hidden.doc

이 이미지는 Bluesky에만 게시할 수 있습니다. 다른 플랫폼에 게시하면 임베디드 데이터 파일이 제거됩니다.

또한 Bluesky에 이미지를 게시하려면 리포지토리의 src/bsky 폴더에 있는 Python 스크립트 create_bsky_post.py를 사용해야 합니다. 브라우저 사이트나 모바일 앱을 통해 Bluesky에 이미지를 게시하면 작동하지 않습니다.

스크립트를 사용하려면 Bluesky 계정에서 앱 비밀번호를 생성해야 합니다.

기본적인 사용 예시는 src/bsky 폴더의 create_bsky_post.py 스크립트를 참조하세요.

https://github.com/user-attachments/assets/b4c72ea7-40e3-49b0-89aa-ae2dd8ccccb9

타사 소프트웨어 및 자산

핵심 애플리케이션

  • libsodium — 암호화 난수 생성, Argon2id 키 파생 및 XChaCha20-Poly1305 비밀 스트림. 시스템 라이브러리로 동적 링크됩니다.

    라이선스: ISC 라이선스

    Copyright (c) 2013–2026 Frank Denis.

  • libjpeg-turbo — JPEG 처리 및 무손실 변환. 시스템 라이브러리로 동적 링크됩니다.

    이 소프트웨어는 부분적으로 Independent JPEG Group의 작업을 기반으로 합니다.

    라이선스: Independent JPEG Group 라이선스, 수정된 BSD 3-Clause 라이선스 및 zlib 라이선스.

    Copyright © 1991–2020 Thomas G. Lane and Guido Vollbeding.

    Copyright © 2009–2023 D. R. Commander. All Rights Reserved.

    Copyright © 2015 Viktor Szathmáry. All Rights Reserved.

  • zlib — 스트리밍 zlib 압축 및 압축 해제. 시스템 라이브러리로 동적 링크됩니다.

    라이선스: zlib 라이선스

    Copyright (C) 1995–2026 Jean-loup Gailly and Mark Adler.

  • libdeflate — 빠른 전체 버퍼 zlib 형식 압축. 시스템 라이브러리로 동적 링크됩니다.

    라이선스: MIT

    Copyright 2016 Eric Biggers.

    Copyright 2024 Google LLC.

통합 코드 및 자산

  • base64simd — AVX2 Base64 인코더는 Wojciech Muła의 벡터 Base64 구현에서 각색되었습니다.

    라이선스: BSD 2-Clause

    Copyright (c) 2015–2018, Wojciech Muła. All rights reserved.

  • Compact ICC Profiles — 임베디드 Adobe 호환 ICC 프로필.

    라이선스: CC0 1.0 Universal

선택적 Bluesky 게시 도우미

  • Bryan Newbold / ATProto Hacker Cookbook — create_bsky_post.py — 포크된 Bluesky 게시 도우미(src/bsky/bsky_post.py)의 기반. 참조: Cookbook 사본

    라이선스: CC0 1.0 Universal.

  • Requests — HTTP 및 Bluesky API 요청.

    라이선스: Apache 2.0 / NOTICE

    Copyright 2019 Kenneth Reitz.

  • Beautiful Soup 4 — HTML 및 Open Graph 메타데이터 파싱.

    라이선스: MIT

    Copyright (c) Leonard Richardson.

  • Pillow — 이미지 검증, 크기 및 종횡비 처리.

    라이선스: MIT-CMU

    PIL copyright © 1997–2011 Secret Labs AB 및 © 1995–2011 Fredrik Lundh and contributors.

    Pillow copyright © 2010 Jeffrey "Alex" Clark and contributors.

카테고리