
멀티플랫폼 스테가노그래피 앱으로 GUI, CLI 및 웹 서비스를 지원하며, WEBP와 AES를 지원합니다.
====================
요약하자면, 스테가노그래피는 다른 매체 속에 메시지를 눈에 띄지 않게 숨기는 기술입니다. 이 구현은 널리 사용되는 웹 형식(WEBP, PNG, GIF, JPEG)의 이미지를 읽어서 (선택적으로 암호화된) 텍스트를 숨기고 결과를 WEBP 이미지로 저장합니다. 그런 다음 이 새 이미지를 공개 웹사이트, 포럼, 인스타, 페이스북 채팅, 이메일 첨부 등 어디에든 업로드할 수 있습니다. 아무도 눈치채지 못하며, 명시적으로 알려주지 않는 한 (그리고 암호화를 사용했다면 올바른 비밀번호도 필요합니다) 사진에 실제로 메시지가 있다는 사실을 아무도 모릅니다.
입력 이미지를 선택합니다 (URL에서 또는 로컬 파일에서)
필요에 따라 비밀번호를 입력합니다 (추가 군사급 암호화를 원할 경우)
3/a. 이미지의 메시지를 확인하려면 Load를 누릅니다. 메시지가 없거나 비밀번호가 틀리면 의미 없는 문자가 표시될 수 있습니다.
3/b. 메시지를 입력하고 Save를 누릅니다. 숨겨진 메시지가 포함된 새 이미지가 저장되며, 해당 파일을 원하는 대로 사용하십시오.
웹사이트로 이동하세요.
Linux (GTK) 및 Windows (GDI)용 다운로드. 이들은 휴대용 실행 파일이며 설치가 필요 없고 시스템에 흔적을 남기지 않습니다. GUI는 웹 서비스와 동일하게 보이고 작동합니다.

Linux 및 Windows용 다운로드 (둘 다 libc만 필요). 그런 다음 입력
./stegano-cli <이미지 파일>
./stegano-cli -p <비밀번호> <이미지 파일>
을 입력하면 이미지의 메시지를 stdout으로 출력하고,
./stegano-cli <이미지 파일> <메시지>
./stegano-cli -p <비밀번호> <이미지 파일> <메시지>
을 입력하면 새 .webp 이미지 파일에 메시지를 인코딩합니다 (원본 파일을 덮어쓸 수 있음). 웹 서비스와 마찬가지로 비밀번호는 선택 사항입니다. 위의 GUI 버전과 달리 명령줄 버전은 전혀 의존성이 없으며, 어디서나 그냥 작동합니다(tm).
src 디렉토리에서 make를 실행하기만 하면 됩니다. suckless 방식입니다. 컴파일에는 emscripten의 emcc와 gcc만 필요합니다 (Linux GUI 버전은 pkg-config와 GTK, GDK, pango, cairo 등 일반적인 GTK 블로트웨어도 필요).
make wasm: WebAssembly 버전만 컴파일하려는 경우 (필요한 보일러플레이트 HTML은 public 디렉토리에 있음).make cli: 명령줄 버전만 컴파일하려는 경우 (완전히 의존성 없음, 모든 POSIX 시스템에서 작동).make gui: 그래픽 사용자 인터페이스 버전만 컴파일하려는 경우 (Windows GDI용, 그 외에는 GTK에 의존).비밀번호를 지정한 경우, 먼저 텍스트가 암호화됩니다. 그런 다음 이미지를 픽셀 버퍼로 압축 해제하고, (암호화된) 메시지의 비트를 색상 채널의 밝기에 저장합니다. 이로 인해 그림에 아주 미세한 파동 패턴이 생기지만, 인간의 육안으로는 전혀 알아차리기 어렵고 (원본 이미지와 비교할 수 없기 때문에 컴퓨터도 전혀 알아차리지 못합니다).
로드할 때 이미지를 다시 픽셀 버퍼로 압축 해제하고, 색상 채널의 이러한 밝기 파동을 연결된 비트 청크로 변환합니다. 비밀번호가 제공되면 비트 청크를 복호화합니다. 최종 메시지가 UTF-8 유효성 검사를 통과하면 표시됩니다. (이 UTF-8 검사가 필요한 이유는 이미지에 실제로 메시지가 있는지, 또는 주어진 비밀번호가 올바른지 확신할 수 없기 때문입니다.)
메시지는 널 종료 UTF-8 멀티바이트 스트림으로 저장되며, 여기에는 \t (가로 탭), \r (캐리지 리턴) 및 \n (줄 바꿈) 제어 시퀀스만 허용됩니다. 다시 로드할 때 Windows GUI 버전은 단일 \n 문자를 \r\n CRLF 시퀀스로 변환합니다. 저장 시 CLI 버전은 \+t, \+r, \+n 두 바이트 문자 시퀀스를 받아 해당하는 단일 바이트 제어 문자로 변환합니다.
암호화의 경우 메시지를 길이가 16의 배수가 되도록 0으로 패딩한 다음, 먼저 sha256(salt+sha256(password))를 계산하여 32바이트 이진 데이터를 얻고, 그 중 4번째 바이트 값 모듈로 16부터 시작하는 16개의 연속 바이트를 AES-256-CBC iv로 사용합니다. 그런 다음 AES-256-CBC 키는 sha256(sha256(salt+sha256(password))+salt)로 초기화됩니다 (sha의 sha를 사용하면 레인보우 해싱 공격을 매우 어렵게 만듭니다). 솔트는 Libre Steganography Standard입니다.
픽셀의 경우 모든 이미지는 32비트 팩형 RGBA 픽셀 버퍼로 변환됩니다. 각 채널의 최하위 2비트를 사용하여 메시지 8비트를 저장합니다 (캐리어 픽셀 1개당 메시지 1바이트). 알파 채널이 3보다 큰 픽셀만 저장에 사용되며, 모든 버전은 그러한 픽셀의 개수를 *"용량 N 바이트."*로 보고합니다.
메시지 바이트 1개의 비트 (7 MSB, 0 LSB): 76543210
캐리어 픽셀 1개 (알파 마지막, 빨강 첫 바이트): rrrrrr76 gggggg32 bbbbbb54 aaaaaa10 (a!=0)
(이 불투명 해킹이 필요한 이유는 WEBP 코덱이 주장만큼 무손실이 아니기 때문입니다. 알파가 3보다 크면 인코딩된 비트가 0이더라도 해당 픽셀이 투명하지 않음이 보장됩니다.)
이 스테가노그래피 도구는 GPLv3+ (또는 이후 버전) 조건에 따라 라이선스가 부여됩니다. stb_image (퍼블릭 도메인) 및 libwebp (BSD-3-Clause 라이선스)와 정적으로 링크됩니다. SHA 해시 및 AES 인코더/디코더 부분은 인라인되어 있습니다 (직접 작성). 타사 암호화 라이브러리가 전혀 필요하지 않습니다.
건배, bzt