michalstankiewicz4-cell/PicMess
GitHub: michalstankiewicz4-cell/PicMess
一个基于 LSB 隐写术的图片加密信息隐藏工具,支持浏览器端和 Node.js 命令行两种使用方式。
Stars: 0 | Forks: 0
# picmess
在图片的像素中隐藏信息(LSB 隐写术,差分编码——每个通道的色阶最多改变 1/255),外加一个独立的通道,用于将密钥隐藏并追加在 PNG 文件的 EOF 之后。无需服务器。
两个版本,核心逻辑相同:
- **Web 应用** (`index.html`) —— 完全在浏览器中运行,只需打开即可。这是
该工具的预期使用方式。
- **Node.js CLI** (`bin/picmess.js`) —— 用于从终端进行自动化/脚本操作。
## Web 版本
只需在浏览器中打开 `index.html`(双击)——它在本地运行,无需安装,
也不需要服务器。你也可以将这 3 个文件(`index.html`、`app.js`、
`styles.css`)托管在任何静态托管服务上(GitHub Pages 等),这样任何人都可以通过
网络使用它。
**隐藏** 选项卡:选择图片源(磁盘文件 / 链接 / 随机图片),输入
信息和密钥,点击“Hide message in image”并下载生成的 PNG 图片。
页面还会显示最终图片的 data URL,你可以将其作为纯文本
复制并粘贴到任何地方。
**提取** 选项卡:上传文件(或提供链接,或粘贴 data URL),可选择性地
输入密钥——如果你将其留空,应用会尝试寻找追加在
文件 EOF 之后的密钥。
注意:通过链接获取图片只有在远程服务器允许 CORS 时才有效(这
适用于“提供链接”和“随机图片”)。如果链接失败,请将
图片下载到磁盘并作为文件上传——这总是有效的。
## CLI 版本
### 安装
```
npm install
```
### 在来自互联网的随机图片中隐藏信息
```
node bin/picmess.js hide --random --width 1024 --height 768 \
--message "secret content" --key "password" --output out/result.png
```
### 在指定链接(例如从 Google Images 复制)的图片中隐藏信息
```
node bin/picmess.js hide --link "https://example.com/image.jpg" \
--message "secret content" --key "password" --output out/result.png
```
### 提取信息
```
node bin/picmess.js reveal --file out/result.png --key "password"
```
如果你省略 `--key`,程序会尝试寻找追加在
文件 EOF 之后的密钥。
### 显示追加在 EOF 之后的密钥(不触碰像素)
```
node bin/picmess.js show-key --file out/result.png
```
## 工作原理
1. **通道 1 —— 像素(LSB):**信息经过加密(AES-256-CTR,密钥通过
密码派生:Web 版本使用 PBKDF2 / CLI 版本使用 scrypt),并
受到 HMAC-SHA256 标签保护。生成的比特被写入连续像素的
R/G/B 通道的最低有效位中——色差
肉眼是不可见的。结果始终保存为
PNG(无损格式),因为 JPEG 会破坏隐藏的比特。
2. **通道 2 —— EOF 之后的数据:**原始密钥被追加在 PNG 文件的
`IEND` 标记之后。浏览器和图像处理软件会忽略 `IEND` 之后的数据,因此图片
看起来和显示时依然正常。
## 关于 Google Images 搜索的说明
通过关键字自动从 Google Images 获取搜索结果需要
使用 Google Custom Search API(需要 API 密钥 + Search Engine ID,超出免费额度需付费)——直接抓取结果页面违反了 Google 的服务条款。
最简单且完全合法的变通方法是:在 Google Images 中找到图片,复制其
“图片地址”,并将其作为链接提供(在 Web 版本中,或者在 CLI 中使用 `--link`)。
标签:GNU通用公共许可证, MITM代理, Node.js, 信息隐藏, 图像隐写术, 多模态安全, 数据加密, 数据可视化, 浏览器应用, 自定义脚本