#png #隐写术 #加密 #有效载荷 #隐私 #命令行工具

bin+lib stegano

终极隐写术瑞士军刀型命令行工具

8个版本

0.1.1 2023年12月7日
0.1.0 2023年12月6日
0.0.6 2023年12月5日

290密码学

Download history 1/week @ 2024-03-10 45/week @ 2024-03-24 8/week @ 2024-03-31

70 每月下载量

MIT 许可证

135KB
1.5K SLoC

🕵️‍♂️ Stegano

Crates.io Crates.io Downloads Rust License

🚀 stegano: Stegano是一款强大且多功能的隐写术工具,旨在通过提供广泛的图像处理和数据加密功能来赋予用户强大的能力。

📖 目录

🚀 安装

要安装 stegano,请使用以下Cargo命令

cargo install --locked stegano

🖼️ 功能

  • 轻松解析PNG和JPEG图像。
  • 使用十六进制转储视图深入了解PNG图像的内部结构。
  • IEND - 8字节位置标记中无缝注入有效载荷。
  • 安全地隐藏您的数据,而不会损害原始图像的完整性。
  • 使用AES-128算法进行安全的加密和解密隐藏数据。
  • 没有对可注入有效载荷长度的限制。

🛠️ 使用方法

stegano提供三个子命令

$ stegano -h

The ultimate steganography swiss knife army tool.

Usage: stegano [COMMAND]

Commands:
  encrypt    Subcommand for encryption
  decrypt    Subcommand for decryption
  show-meta  Subcommand for showing metadata
  help       Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

$ stegano encrypt -h

Subcommand for encryption

Usage: stegano encrypt [OPTIONS] --input <INPUT>

Options:
  -i, --input <INPUT>      Sets the input file for injecting the payload
  -o, --output <OUTPUT>    Sets the output file for generating a new file with the injected payload [default: output.png]
  -k, --key <KEY>          Sets the key for payload encryption [default: key]
  -s, --suppress           Suppresses output messages
  -f, --offset <OFFSET>    Sets the offset [default: 10]
  -p, --payload <PAYLOAD>  Sets the payload [default: hello]
  -t, --type <TYPE>        Sets the type [default: PNG]
  -h, --help               Print help
  -V, --version            Print version

$ stegano decrypt -h
Subcommand for decryption

Usage: stegano decrypt [OPTIONS] --input <INPUT>

Options:
  -i, --input <INPUT>      Sets the input file for decrypting and extracting the payload
  -o, --output <OUTPUT>    Sets the output file for generating a new file with no payload, aka restoring the original file [default: output.png]
  -k, --key <KEY>          Sets the key for payload encryption [default: key]
  -s, --suppress           Suppresses output messages
  -f, --offset <OFFSET>    Sets the offset [default: 10]
  -p, --payload <PAYLOAD>  Sets the payload [default: hello]
  -t, --type <TYPE>        Sets the type [default: PNG]
  -h, --help               Print help
  -V, --version            Print version
$ stegano show-meta -h

Subcommand for showing metadata

Usage: stegano show-meta [OPTIONS] --input <INPUT>

Options:
  -i, --input <INPUT>          Sets the image input file
  -n, --nb-chunks <NB_CHUNKS>  Read number of chunks [default: 100]
  -s, --start <START_CHUNK>    The index of the start chunk to read from [default: 0]
  -e, --end <END_CHUNK>        The index of the end chunk to stop reading at [default: 100]
  -r, --suppress               Suppresses output messages
  -t, --type <TYPE>            Sets the type [default: PNG]
  -h, --help                   Print help
  -V, --version                Print version

使用这些子命令来处理和操作png和jpeg图像。以下是一些示例

  1. 从png图像中读取并处理10个块

    $ stegano show-meta -i image_file_name -n 10
    It is a valid PNG file. Let's process it! 
    
    ---- Header ----
    00000000 | 89 50 4E 47 0D 0A 1A 0A | .PNG....
    ----- End ------
    
    ---- Chunk #0 ----
    Offset: 8
    Size: 71
    CRC: 48142467
    00000008 | 00 00 00 0D 49 48 44 52 00 00 05 A0 00 00 03 D0 08 06 00 00 | ....IHDR............
    00000028 | 00 C0 52 DC 33 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00 | ..R.3....sRGB.......
    00000048 | 20 00 49 44 41 54 78 5E EC 9D 07 98 24 45 D9 80 BF DD 0B 5C | ..IDATx^....$E.....\
    00000068 | E2 8E 8C 24 C9 41 50 09 82 A8 80 | ...$.AP....
    ------- End -------
    
    ---- Chunk #1 ----
    Offset: 83
    Size: 17
    CRC: 241924a7
    00000083 | A2 64 38 B2 81 20 19 91 24 0A 28 48 D2 9F AC 92 91 | .d8.....$.(H.....
    ------- End -------
    
    ---- Chunk #2 ----
    Offset: 112
    Size: 3
    CRC: 9e0e55d5
    00000112 | ED D9 EE | ...
    ------- End -------
    
    ---- Chunk #3 ----
    Offset: 127
    Size: 51
    CRC: 400002d6
    00000127 | B2 53 5D F5 D5 5B D5 7D C7 3B DF 7E D5 F5 C7 DB EF EF 15 AE | .S]..[.}.;.~........
    00000147 | 52 08 F4 F6 82 36 0A 16 1E A5 6C 34 3A 85 00 04 20 00 01 08 | R....6....l4:.......
    00000167 | 40 00 02 10 80 00 04 20 00 01 08 | @..........
    ------- End -------
    
    ---- Chunk #4 ----
    Offset: 190
    Size: 4
    CRC: fa7621a0
    00000190 | BA E0 51 D6 | ..Q.
    ------- End -------
    
    ---- Chunk #5 ----
    Offset: 206
    Size: 60
    CRC: 1084000
    00000206 | FD EF 30 7A 84 00 04 20 00 01 08 40 00 02 10 80 00 04 20 00 | ..0z.......@........
    00000226 | 01 08 40 00 02 3E 09 20 5F 03 9A 88 68 9F FB AA D6 17 02 DA | ..@..>.._...h.......
    00000246 | 33 53 E4 33 C2 D9 F3 96 A2 3B 08 40 00 02 10 80 00 04 20 00 | 3S.3.....;.@........
    ------- End -------
    
    ---- Chunk #6 ----
    Offset: 278
    Size: 2
    CRC: 5b4823a1
    00000278 | 02 03 | ..
    ------- End -------
    
    ---- Chunk #7 ----
    Offset: 292
    Size: 4
    CRC: 3d6e1dba
    00000292 | 4B 3E 23 9A | K>#.
    ------- End -------
    
    ---- Chunk #8 ----
    Offset: 308
    Size: 4
    CRC: 42000
    00000308 | 00 02 10 80 | ....
    ------- End -------
    
    ---- Chunk #9 ----
    Offset: 324
    Size: 1
    CRC: 886924b4
    00000324 | E0 | .
    ------- End -------
    
  2. 以静默模式处理png图像

    $ stegano show-meta -i image_file_name -r
    
  3. 读取并处理jpeg图像。

    $ stegano show-meta -i image_file_name -t jpeg
    JFIF Header: JfifHeader { version: 18758 }
    SOF Header for Chunk#67: SofHeader { jpeg_obj: JpegObj { precision: 8, image_height: 243, image_width: 207, number_of_components: 3, comp_id: [1, 2, 3], hsamp_factor: [2, 1, 1], vsamp_factor: [2, 1, 1], qtable_number: [0, 1, 1], dctable_number: [1, 2, 3], actable_number: [11, 12, 13, 14], ss: 0, se: 63, ah: 0, al: 0 } }
    Processing DHT Header for Chunk#68: 
    Processing DHT Header for Chunk#69: 
    Processing DHT Header for Chunk#70: 
    Processing DHT Header for Chunk#71: 
    SOS Header for Chunk#72: SosHeader { jpeg_obj: JpegObj { precision: 3, image_height: 243, image_width: 207, number_of_components: 3, comp_id: [17], hsamp_factor: [3], vsamp_factor: [15], qtable_number: [0], dctable_number: [0], actable_number: [0], ss: 0, se: 0, ah: 0, al: 0 } }
    

    有时JFIF头不存在,但它仍然是一个有效的jpeg文件

    $ stegano show-meta -i image_file_name -t jpeg
    DQT Header for Chunk#1: DqtHeader { dct: DctStruct { quantum: [[8, 2054, 1542, 1543, 1798, 1541, 1288, 2055, 1799, 1799, 1801, 2313, 2312, 2058, 2572, 3092, 5133, 3340, 3083, 2827, 2828, 3097, 6418, 4627, 4879, 3860, 5149, 7450, 6687, 7966, 7709, 7450, 6684, 7196, 7200, 8228, 9262, 11815, 10016, 8226, 8748, 11299, 8988, 7196, 7208, 10295, 14121, 10540, 11312, 12337, 12596, 13364, 13364, 13343, 7975, 10041, 14653, 15672, 14386, 12860, 15406, 11827, 13108, 13362], [12801, 265, 2313, 2313, 2316, 3083, 2828, 3096, 6157, 3341, 3352, 6194, 12833, 8476, 7201, 8498, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 12850, 0]] } }
    SOF Header for Chunk#3: SofHeader { jpeg_obj: JpegObj { precision: 8, image_height: 460, image_width: 460, number_of_components: 3, comp_id: [1, 2, 3], hsamp_factor: [2, 1, 1], vsamp_factor: [2, 1, 1], qtable_number: [0, 1, 1], dctable_number: [1, 2, 3], actable_number: [11, 12, 13, 14], ss: 0, se: 63, ah: 0, al: 0 } }
    Processing DHT Header for Chunk#4: 
    SOS Header for Chunk#5: SosHeader { jpeg_obj: JpegObj { precision: 3, image_height: 460, image_width: 460, number_of_components: 3, comp_id: [17], hsamp_factor: [3], vsamp_factor: [15], qtable_number: [0], dctable_number: [0], actable_number: [0], ss: 0, se: 0, ah: 0, al: 0 } }
    
  4. 在不同的位置读取块

    # Read 1 chunk starting from position 0
    $ stegano show-meta -i image_file_name -s 0 -e 10 -n 1
    It is a valid PNG file. Let's process it! 
    
    ---- Header ----
    00000000 | 89 50 4E 47 0D 0A 1A 0A | .PNG....
    ----- End ------
    
    ---- Chunk #0 ----
    Offset: 8
    Size: 71
    CRC: 48142467
    00000008 | 00 00 00 0D 49 48 44 52 00 00 05 A0 00 00 03 D0 08 06 00 00 | ....IHDR............
    00000028 | 00 C0 52 DC 33 00 00 00 01 73 52 47 42 00 AE CE 1C E9 00 00 | ..R.3....sRGB.......
    00000048 | 20 00 49 44 41 54 78 5E EC 9D 07 98 24 45 D9 80 BF DD 0B 5C | ..IDATx^....$E.....\
    00000068 | E2 8E 8C 24 C9 41 50 09 82 A8 80 | ...$.AP....
    ------- End -------
    
    # Read 3 chunks starting from position 40000
    $ stegano show-meta -i image_file_name -s 40000 -e 200000 -n 3
    It is a valid PNG file. Let's process it! 
    
    ---- Header ----
    00000000 | 89 50 4E 47 0D 0A 1A 0A | .PNG....
    ----- End ------
    
    ---- Chunk #40000 ----
    Offset: 40000
    Size: 49
    CRC: e3a1975e
    00040000 | 16 03 F2 3B 23 05 BD 79 7E AE 37 2D 90 1C E8 B8 4F E7 2E 34 | ...;#..y~.7-....O..4
    00040020 | 42 9E 43 55 01 1D 6E 01 6D AD 7E 76 5A 40 CB 6A 6A 6B 2C 87 | [email protected],.
    00040040 | 87 06 84 5C 1D 8B 60 67 11 | ...\..`g.
    ------- End -------
    
    ---- Chunk #40001 ----
    Offset: 40061
    Size: 28
    CRC: 2200002
    00040061 | E3 40 40 07 F1 F6 C2 A1 20 00 02 20 00 02 20 00 02 20 00 02 | .@@.................
    00040081 | 20 00 02 20 00 02 20 00 | ........
    ------- End -------
    
    ---- Chunk #40002 ----
    Offset: 40101
    Size: 17
    CRC: 4f13b5a6
    00040101 | 11 B1 EC B9 11 A1 9E 89 AC 4A 58 4B D6 32 DB C7 D8 | .........JXK.2...
    ------- End -------
    
  5. 在图像中加密和注入数据

[!注意] Stegano自动识别PNG图像中IEND标记的位置,并默认将其注入到IEND标记前8个字节的位置。这样做是为了防止对原始图像造成任何损坏。

$ stegano encrypt -i input_image_file_name -k 'pass' -p 'hello' -o output_image_file_name
It is a valid PNG file. Let's process it! 

---- Header ----
00000000 | 89 50 4E 47 0D 0A 1A 0A | .PNG....
----- End ------

------- Chunk -------
Offset: 159028
Size: 48
CRC: 13a29bcc
00159028 | 03 AE 73 9D 60 28 1A F1 20 A0 EB 10 39 11 28 9D FC 85 5E DB | ..s.`(......9.(...^.
00159048 | D2 D3 7A 45 B1 71 EE 4F 4C 66 0C E8 FC 85 5E DB D2 D3 7A 45 | ..zE.q.OLf....^...zE
00159068 | B1 71 EE 4F 4C 66 0C E8 | .q.OLf..
-------- End --------

Your payload has been encrypted and written at offset 159028 successfully!

[!注意] 默认情况下,最大密钥长度限制为16个字符。

  1. 使用之前获得的偏移量,您可以从图像中解密和提取秘密信息,以及从图像中移除秘密内容

    $ stegano decrypt -i input_image_file_name -k 'pass' -f 159028 -o output_image_file_name -s
    Your decrypted secret is: "hello"
    
  2. 如果提供错误的密钥

    $ stegano decrypt -i input_image_file_name -k 'invalid' -f 159028 -o output_image_file_name
    Your decrypted secret is: "qji~s"
    
  3. 如果提供了错误的密钥和错误的偏移量

    $ stegano decrypt -i input_image_file_name -k 'invalid' -f 159024 -o output_image_file_name
    It is a valid PNG file. Let's process it! 
    
    ---- Header ----
    00000000 | 89 50 4E 47 0D 0A 1A 0A | .PNG....
    ----- End ------
    
    ------- Chunk -------
    Offset: 159021
    Size: 36
    CRC: 1348f762
    00159024 | F1 B0 E8 48 9E AD 1E 56 A5 82 7C 3B 14 D4 8C 1D E7 1A 90 47 | ...H...V..|;.......G
    00159044 | A0 1D D2 90 04 71 2F 01 AA 91 86 6D | .....q/....m
    -------- End --------
    
    Your decrypted secret is: "��H��\u{1e}V��|;\u{14}Ԍ\u{1d}�\u{1a}�G�\u{1d}Ґ\u{4}q/\u{1}���m"
    
  4. 如果提供了正确的密钥和错误的偏移量

    $ stegano decrypt -i input_image_file_name -k 'pass' -f 159024 -o output_image_file_name
    It is a valid PNG file. Let's process it! 
    
    ---- Header ----
    00000000 | 89 50 4E 47 0D 0A 1A 0A | .PNG....
    ----- End ------
    
    ------- Chunk -------
    Offset: 159021
    Size: 36
    CRC: fc855edb
    00159024 | 67 47 07 E6 DC 5D 27 34 CB 51 A4 63 66 C1 C5 F4 5A A2 6B 5C | gG...]'4.Q.cf...Z.k\
    00159044 | 28 24 BF 53 BC 21 59 04 1B F6 FC 21 | ($.S.!Y....!
    -------- End --------
    
    Your decrypted secret is: "gG\u{7}��]'4�Q�cf���Z�k\\($�S�!Y\u{4}\u{1b}��!"
    

[!注意] 默认情况下,Stegano 使用 AES-128 加密算法。支持的密钥最大长度为16个字符。如果您提供更长的密钥,它将自动填充或截断以适应所需长度。

🎨 选项

选项 描述
加密选项
-a--algo 设置加密算法(默认为 "aes")。
-i--input 设置加密的输入文件。
-o--output 设置加密负载的输出文件(默认为 "output.png")。
-k--key 设置负载加密的密钥(默认为 "key")。
-s--suppress 抑制输出消息。
-f--offset 设置偏移量(默认为 9999999999 以自动注入:IEND - 8 字节)。
-p--payload 设置负载(默认为 "hello")。
-t--type 设置类型(默认为 "PNG")。
解密选项
-a--algo 设置解密算法(默认为 "aes")。
-i--input 设置解密输入文件。
-o--output 设置解密负载的输出文件(默认为 "output.png")。
-k--key 设置负载解密密钥(默认为 "key")。
-s--suppress 抑制输出消息。
-f--offset 设置自动解密的偏移量(默认为 9999999999):IEND - 8 字节)。
-p--payload 设置负载(默认为 "hello")。
-t--type 设置类型(默认为 "PNG")。
元数据选项
-i--input 设置元数据提取的输入图像文件。
-n--nb-chunks 读取特定数量的块(默认为 100)。
-s--start 设置要读取的起始块索引(默认为 0)。
-e--end 设置停止读取的结束块索引(默认为 100)。
-r--suppress 抑制输出消息。
-z--read-end 从文件开始或结束读取(默认为从图像开始读取)。

🤝 贡献

欢迎贡献和反馈!如果您想贡献、报告问题或建议增强功能,请与项目在 GitHub 上互动。您的贡献有助于改进此 crate 以供社区使用。

📄 许可证

本项目受 MIT 许可证 许可。

依赖关系

~1.8–2.4MB
~48K SLoC