HideInfo


NameHideInfo JSON
Version 0.1.9 PyPI version JSON
download
home_pagehttps://github.com/guofei9987/cloakware
SummaryInfo Hiding Library,一些信息隐藏技术
upload_time2024-01-02 13:24:10
maintainer
docs_urlNone
authorGuo Fei
requires_python>=3.5
licenseMIT
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # HideInfo

Info Hiding Library  
一些小而美的信息隐藏方法  



[![PyPI](https://img.shields.io/pypi/v/HideInfo)](https://pypi.org/project/HideInfo/)
[![License](https://img.shields.io/pypi/l/HideInfo.svg)](https://github.com/guofei9987/HideInfo/blob/master/LICENSE)
![Python](https://img.shields.io/badge/python->=3.5-green.svg)
![Platform](https://img.shields.io/badge/platform-windows%20|%20linux%20|%20macos-green.svg)
[![stars](https://img.shields.io/github/stars/guofei9987/HideInfo.svg?style=social)](https://github.com/guofei9987/HideInfo/)
[![fork](https://img.shields.io/github/forks/guofei9987/HideInfo?style=social)](https://github.com/guofei9987/HideInfo/fork)
[![Downloads](https://pepy.tech/badge/HideInfo)](https://pepy.tech/project/HideInfo)




| 算法                                                                                         | 说明                |
|--------------------------------------------------------------------------------------------|-------------------|
| [幻影坦克](https://github.com/guofei9987/HideInfo/blob/main/example/example_mirage_tank.py)    | 使图片在不同的背景下显示不同的图片 |
| [化物为图](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_as_img.py)    | 把数据以图片形式存放        |
| [藏物于图](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_in_img.py)    | 把数据藏在一个图片中        |
| [图片隐水印](https://github.com/guofei9987/HideInfo/blob/main/example/example_img_watermark.py) | 图片空域上的隐水印         |
| [图种](https://github.com/guofei9987/HideInfo/blob/main/example/example_img_seed.py)         | 把图片和文件黏在一起,并存为图片  |
| [EXIF](https://github.com/guofei9987/HideInfo/blob/main/example/example_img_exif.py)       | 把一段信息放到图片的EXIF中   |
| [化物为音](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_as_music.py)  | 把数据以音频的形式存放       |
| [藏物于音](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_in_music.py)  | 把数据隐藏在一个音频中       |
| [回声水印](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_in_music.py)  | 以回声的形式,把二进制嵌入到音频中 |
| [化物为文](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_as_txt.py)    | 把数据以文本文件的形式存放     |
| [藏物于文](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_in_txt.py)    | 把数据隐藏在一段文本中       |




安装
```
pip install HideInfo
```


## 幻影坦克

功能:把两个图片合并,使其在黑色背景下显示图片A,在白色背景下显示图片B

说明
- 已支持彩色图片
- 一般情况下,手机/浏览器的预览和点击大图分别使黑色背景和白色背景,因此有"预览和点击是两张不通的图"的效果
- 短视频:[B站](https://www.bilibili.com/video/BV1DF41117c7/)
- 例子:[example/example_mirage_tank.py](example/example_mirage_tank.py)

```python
from hide_info import mirage_tank

mirage_tank.mirage_tank('图片.png', 'img2.jpeg', '幻影坦克.png')
```

## hide_as_img:化物为图

功能:把文件/文本/bytes 类数据,转换为图片  
原理:图片 1 个像素的 1 个通道可以存放 0-255 的数字,也就是一个字节。因此可以用来存放数据。
使用场景:
    - 信息隐藏、隐蔽传输
    - 在只能发送图片的场景下(例如社交软件),发送任意信息

说明
- RGB 3个通道都用来存放数据
- 使用前4个字节记录数据的大小,因此要求总的数据量小于 4G
- 可以存放文件、文本、bytes 类数据,把它转化为一张图片
- 代码:[example_hide_as_img.py](example/example_hide_as_img.py)

```python
from hide_info import hide_as_img

# 文件转为图片并存下来
hide_as_img.file_encode(filename='要隐藏的文件.zip', img_filename='化物为图.png')
# 把图片再转回文件
hide_as_img.file_decode(filename='化物为图-解出来的文件.zip', img_filename='化物为图.png')
```

## hide_in_img:藏物于图

功能:文件/文本/bytes 类数据,藏进一个 PNG 图片中,并且用肉眼无法看出区别
原理:(LSB算法)根据信息的二进制,改变像素数据的最低位,肉眼是无法察觉这种改变
使用场景:
    - 信息隐藏、隐蔽传输
    - 在只能发送图片的场景下(例如某社交软件),发送任意信息
    - 盲水印、图片溯源、版权保护


说明
- 解原始数据时,无需原图参与,只看最低位
- 使用前4个字节存放数据的大小
- 使用位运算,提高一定的性能
- LSB算法对压缩、转格式等攻击脆弱
- 例子:[example_hide_in_img.py](example/example_hide_in_img.py)

```python
from hide_info import hide_in_img

# 把文件隐藏到图片中
hide_in_img.file_encode(filename='要隐藏的文件.zip', img_filename='图片.png', img_filename_new='藏物于图.png')
# 从图片中提取文件
text_encode = hide_in_img.file_decode('藏物于图-解出的文件.zip', img_filename='藏物于图.png')
```

## img_watermark: 图片空域上的隐水印

说明:
- 同样使用 LSB 算法。 
- 水印是一个 **二值图**。
- 可对抗裁剪攻击
- 如果图片有大片纯色区域,对这些攻击有一定的鲁棒性:缩放、转格式、截图、裁剪。如果没有大片纯色区域,则不能对抗这些攻击。
- 例子:[example/example_img_watermark.py](https://github.com/guofei9987/HideInfo/blob/main/example/example_img_watermark.py)

代码 
```python
from hide_info import img_watermark

# 嵌入隐式水印
img_watermark.file_encode(img_filename="图片.png", watermark_filename="watermark.png", img_filename_new="图片_打入水印.png")

# 提取隐式水印
img_watermark.file_decode(img_filename="图片_打入水印.png", wm_extract="解出的水印.png")
```

## img_seed:图种

功能:把图片和文件连接起来,以图片的形式存下来(目前还不完善)

- 例子:[example/example_img_seed.py](example/example_img_seed.py)

## img_exif:把信息隐藏在图片的EXIF中

功能:把信息隐藏在图片的 EXIF 中,从而获得隐蔽信息、传输隐蔽信息的能力

- 例子:[example/example_img_exif.py](example/example_img_exif.py)

## hide_in_music: 藏物于音

功能:把一段信息(文件/文本/bytes),藏进一个音乐文件中

例子:
- [example_hide_in_music.py](example/example_hide_in_music.py)

```python
from hide_info import hide_in_music

# 把文件隐藏到某个音乐中
hide_in_music.file_encode(filename='要隐藏的文件.zip', music_filename="音乐.wav", music_filename_new="藏物于音.wav")
# 从音乐中提取文件
hide_in_music.file_decode(filename="藏物于音-解出的文件.zip", music_filename="藏物于音.wav")
```

## hide_as_music:化物为音

功能:把一段信息(文件/文本/bytes),转为声音
原理:用 16 种音可以表示一个四进制。如果每个音持续 0.05 秒,那么每秒声音可以存放 10 字节
使用场景:
    - 信息隐藏、隐蔽传输
    - 在只能发送图片的场景下(例如某社交软件),发送任意信息
    

说明
- 例子:[hide_as_music.py](example/example_hide_as_music.py)

```python
from hide_info import hide_as_music

# 文件转为声音并存下来
hide_as_music.file_encode(filename='要隐藏的文件2.zip', wav_filename='化物为音.wav')
# 把声音再转回文件
hide_as_music.file_decode(filename='化物为音-解出来的文件.zip', wav_filename='化物为音.wav')

```

## echo_watermark: 回声水印

回声水印(Echo Watermarking)是一种音频水印技术,通过在原始音频信号中添加回声来嵌入信息。这种技术利用了人耳的心理声学特性,即人耳对于短时间内的回声延迟是不敏感的,因此可以将信息隐藏在音频信号的回声中而不影响听感。

回声水印的实现通常有两个重要参数:回声延迟和回声幅度。延迟时间决定了回声在原始信号之后多久发生,而幅度则影响回声的强度。通过巧妙地调节这两个参数,可以将数字信息(如比特流)编码到音频信号中。

例如,可以用短的延迟时间表示比特'0',用长的延迟时间表示比特'1',或者通过调整回声的幅度来表示不同的数据位。

回声水印技术对于音质的影响相对较小,同时具有较好的鲁棒性,能够在一定程度上抵抗压缩、转换等处理过程。这使得它适用于版权保护、内容认证、隐秘通讯等领域。

```python
from hide_info.echo_watermark import EchoWatermark
from hide_info import utils, evaluate
from scipy.io import wavfile

ori_file = "./ori_file/sounds.wav"  # 载体
embedded_file = "./output/sounds_with_watermark.wav"  # 嵌入水印后的文件名
wm_str = "回声水印算法,欢迎 star!"  # 水印

wm_bits = utils.bytes2bin(wm_str.encode('utf-8'))
len_wm_bits = len(wm_bits)

# embed:
echo_wm = EchoWatermark(pwd=111001)
echo_wm.embed(origin_filename=ori_file, wm_bits=wm_bits, embed_filename=embedded_file)

# extract:
echo_wm = EchoWatermark(pwd=111001)
wm_extract = echo_wm.extract(embed_filename=embedded_file, len_wm_bits=len_wm_bits)

wm_str_extract = utils.bin2bytes(wm_extract).decode('utf-8', errors='replace')
print("extract watermark: ", wm_str_extract)
# error rate:
evaluate.get_error_rate(wm_extract, wm_bits)
```


## hide_in_text:藏物于文

功能:把一段信息(文件/文本/bytes),藏进一段文本中

说明
- 实测在苹果设备 Macbook、IOS 上,隐藏前后的文本看不出区别。但是 Windows 和某些安卓系统上,会有空格
- 例子:[hide_in_txt.py](example/example_hide_in_txt.py)

```python
from hide_info import hide_in_txt

# 把一个文件隐藏在一段已有的文本中
hide_in_txt.file_encode(filename='要隐藏的文件2.zip', text_filename='一段文本.txt', text_filename_new='藏物于文.txt')
# 从文本中提取文件
hide_in_txt.file_decode(filename='藏物于文-解出的文件.zip', text_filename='藏物于文.txt')
```

## hide_as_txt: 化物为文

功能:把一段信息(文件/文本/bytes),以文本的形式存放下来

说明
- 使用的是 base85 算法
- 例子:[hide_as_txt.py](example/example_hide_as_txt.py)

```python
from hide_info import hide_as_txt

# 把一个文件转化为一段文本,并存下走
hide_as_txt.file_encode(filename='要隐藏的文件.zip', txt_filename='化物为文.txt')
# 从文本中提取文件
hide_as_txt.file_decode(filename='化物为文-解出的文件.zip', txt_filename='化物为文.txt')
```

## 其他算法

缩放藏图:提前计算用近邻法缩放时使用的时哪些像素点,然后把这些像素点变成另一个图。

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/guofei9987/cloakware",
    "name": "HideInfo",
    "maintainer": "",
    "docs_url": null,
    "requires_python": ">=3.5",
    "maintainer_email": "",
    "keywords": "",
    "author": "Guo Fei",
    "author_email": "guofei9987@foxmail.com",
    "download_url": "https://files.pythonhosted.org/packages/5d/b2/41bfb12dabe9f13afe047c4891cf7dbf91af1890c2fef33ab23cfd4fdf1d/HideInfo-0.1.9.tar.gz",
    "platform": "linux",
    "description": "# HideInfo\n\nInfo Hiding Library  \n\u4e00\u4e9b\u5c0f\u800c\u7f8e\u7684\u4fe1\u606f\u9690\u85cf\u65b9\u6cd5  \n\n\n\n[![PyPI](https://img.shields.io/pypi/v/HideInfo)](https://pypi.org/project/HideInfo/)\n[![License](https://img.shields.io/pypi/l/HideInfo.svg)](https://github.com/guofei9987/HideInfo/blob/master/LICENSE)\n![Python](https://img.shields.io/badge/python->=3.5-green.svg)\n![Platform](https://img.shields.io/badge/platform-windows%20|%20linux%20|%20macos-green.svg)\n[![stars](https://img.shields.io/github/stars/guofei9987/HideInfo.svg?style=social)](https://github.com/guofei9987/HideInfo/)\n[![fork](https://img.shields.io/github/forks/guofei9987/HideInfo?style=social)](https://github.com/guofei9987/HideInfo/fork)\n[![Downloads](https://pepy.tech/badge/HideInfo)](https://pepy.tech/project/HideInfo)\n\n\n\n\n| \u7b97\u6cd5                                                                                         | \u8bf4\u660e                |\n|--------------------------------------------------------------------------------------------|-------------------|\n| [\u5e7b\u5f71\u5766\u514b](https://github.com/guofei9987/HideInfo/blob/main/example/example_mirage_tank.py)    | \u4f7f\u56fe\u7247\u5728\u4e0d\u540c\u7684\u80cc\u666f\u4e0b\u663e\u793a\u4e0d\u540c\u7684\u56fe\u7247 |\n| [\u5316\u7269\u4e3a\u56fe](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_as_img.py)    | \u628a\u6570\u636e\u4ee5\u56fe\u7247\u5f62\u5f0f\u5b58\u653e        |\n| [\u85cf\u7269\u4e8e\u56fe](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_in_img.py)    | \u628a\u6570\u636e\u85cf\u5728\u4e00\u4e2a\u56fe\u7247\u4e2d        |\n| [\u56fe\u7247\u9690\u6c34\u5370](https://github.com/guofei9987/HideInfo/blob/main/example/example_img_watermark.py) | \u56fe\u7247\u7a7a\u57df\u4e0a\u7684\u9690\u6c34\u5370         |\n| [\u56fe\u79cd](https://github.com/guofei9987/HideInfo/blob/main/example/example_img_seed.py)         | \u628a\u56fe\u7247\u548c\u6587\u4ef6\u9ecf\u5728\u4e00\u8d77\uff0c\u5e76\u5b58\u4e3a\u56fe\u7247  |\n| [EXIF](https://github.com/guofei9987/HideInfo/blob/main/example/example_img_exif.py)       | \u628a\u4e00\u6bb5\u4fe1\u606f\u653e\u5230\u56fe\u7247\u7684EXIF\u4e2d   |\n| [\u5316\u7269\u4e3a\u97f3](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_as_music.py)  | \u628a\u6570\u636e\u4ee5\u97f3\u9891\u7684\u5f62\u5f0f\u5b58\u653e       |\n| [\u85cf\u7269\u4e8e\u97f3](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_in_music.py)  | \u628a\u6570\u636e\u9690\u85cf\u5728\u4e00\u4e2a\u97f3\u9891\u4e2d       |\n| [\u56de\u58f0\u6c34\u5370](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_in_music.py)  | \u4ee5\u56de\u58f0\u7684\u5f62\u5f0f\uff0c\u628a\u4e8c\u8fdb\u5236\u5d4c\u5165\u5230\u97f3\u9891\u4e2d |\n| [\u5316\u7269\u4e3a\u6587](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_as_txt.py)    | \u628a\u6570\u636e\u4ee5\u6587\u672c\u6587\u4ef6\u7684\u5f62\u5f0f\u5b58\u653e     |\n| [\u85cf\u7269\u4e8e\u6587](https://github.com/guofei9987/HideInfo/blob/main/example/example_hide_in_txt.py)    | \u628a\u6570\u636e\u9690\u85cf\u5728\u4e00\u6bb5\u6587\u672c\u4e2d       |\n\n\n\n\n\u5b89\u88c5\n```\npip install HideInfo\n```\n\n\n## \u5e7b\u5f71\u5766\u514b\n\n\u529f\u80fd\uff1a\u628a\u4e24\u4e2a\u56fe\u7247\u5408\u5e76\uff0c\u4f7f\u5176\u5728\u9ed1\u8272\u80cc\u666f\u4e0b\u663e\u793a\u56fe\u7247A\uff0c\u5728\u767d\u8272\u80cc\u666f\u4e0b\u663e\u793a\u56fe\u7247B\n\n\u8bf4\u660e\n- \u5df2\u652f\u6301\u5f69\u8272\u56fe\u7247\n- \u4e00\u822c\u60c5\u51b5\u4e0b\uff0c\u624b\u673a/\u6d4f\u89c8\u5668\u7684\u9884\u89c8\u548c\u70b9\u51fb\u5927\u56fe\u5206\u522b\u4f7f\u9ed1\u8272\u80cc\u666f\u548c\u767d\u8272\u80cc\u666f\uff0c\u56e0\u6b64\u6709\"\u9884\u89c8\u548c\u70b9\u51fb\u662f\u4e24\u5f20\u4e0d\u901a\u7684\u56fe\"\u7684\u6548\u679c\n- \u77ed\u89c6\u9891\uff1a[B\u7ad9](https://www.bilibili.com/video/BV1DF41117c7/)\n- \u4f8b\u5b50\uff1a[example/example_mirage_tank.py](example/example_mirage_tank.py)\n\n```python\nfrom hide_info import mirage_tank\n\nmirage_tank.mirage_tank('\u56fe\u7247.png', 'img2.jpeg', '\u5e7b\u5f71\u5766\u514b.png')\n```\n\n## hide_as_img:\u5316\u7269\u4e3a\u56fe\n\n\u529f\u80fd\uff1a\u628a\u6587\u4ef6/\u6587\u672c/bytes \u7c7b\u6570\u636e\uff0c\u8f6c\u6362\u4e3a\u56fe\u7247  \n\u539f\u7406\uff1a\u56fe\u7247 1 \u4e2a\u50cf\u7d20\u7684 1 \u4e2a\u901a\u9053\u53ef\u4ee5\u5b58\u653e 0-255 \u7684\u6570\u5b57\uff0c\u4e5f\u5c31\u662f\u4e00\u4e2a\u5b57\u8282\u3002\u56e0\u6b64\u53ef\u4ee5\u7528\u6765\u5b58\u653e\u6570\u636e\u3002\n\u4f7f\u7528\u573a\u666f\uff1a\n    - \u4fe1\u606f\u9690\u85cf\u3001\u9690\u853d\u4f20\u8f93\n    - \u5728\u53ea\u80fd\u53d1\u9001\u56fe\u7247\u7684\u573a\u666f\u4e0b\uff08\u4f8b\u5982\u793e\u4ea4\u8f6f\u4ef6\uff09\uff0c\u53d1\u9001\u4efb\u610f\u4fe1\u606f\n\n\u8bf4\u660e\n- RGB 3\u4e2a\u901a\u9053\u90fd\u7528\u6765\u5b58\u653e\u6570\u636e\n- \u4f7f\u7528\u524d4\u4e2a\u5b57\u8282\u8bb0\u5f55\u6570\u636e\u7684\u5927\u5c0f\uff0c\u56e0\u6b64\u8981\u6c42\u603b\u7684\u6570\u636e\u91cf\u5c0f\u4e8e 4G\n- \u53ef\u4ee5\u5b58\u653e\u6587\u4ef6\u3001\u6587\u672c\u3001bytes \u7c7b\u6570\u636e\uff0c\u628a\u5b83\u8f6c\u5316\u4e3a\u4e00\u5f20\u56fe\u7247\n- \u4ee3\u7801\uff1a[example_hide_as_img.py](example/example_hide_as_img.py)\n\n```python\nfrom hide_info import hide_as_img\n\n# \u6587\u4ef6\u8f6c\u4e3a\u56fe\u7247\u5e76\u5b58\u4e0b\u6765\nhide_as_img.file_encode(filename='\u8981\u9690\u85cf\u7684\u6587\u4ef6.zip', img_filename='\u5316\u7269\u4e3a\u56fe.png')\n# \u628a\u56fe\u7247\u518d\u8f6c\u56de\u6587\u4ef6\nhide_as_img.file_decode(filename='\u5316\u7269\u4e3a\u56fe-\u89e3\u51fa\u6765\u7684\u6587\u4ef6.zip', img_filename='\u5316\u7269\u4e3a\u56fe.png')\n```\n\n## hide_in_img\uff1a\u85cf\u7269\u4e8e\u56fe\n\n\u529f\u80fd\uff1a\u6587\u4ef6/\u6587\u672c/bytes \u7c7b\u6570\u636e\uff0c\u85cf\u8fdb\u4e00\u4e2a PNG \u56fe\u7247\u4e2d\uff0c\u5e76\u4e14\u7528\u8089\u773c\u65e0\u6cd5\u770b\u51fa\u533a\u522b\n\u539f\u7406\uff1a\uff08LSB\u7b97\u6cd5\uff09\u6839\u636e\u4fe1\u606f\u7684\u4e8c\u8fdb\u5236\uff0c\u6539\u53d8\u50cf\u7d20\u6570\u636e\u7684\u6700\u4f4e\u4f4d\uff0c\u8089\u773c\u662f\u65e0\u6cd5\u5bdf\u89c9\u8fd9\u79cd\u6539\u53d8\n\u4f7f\u7528\u573a\u666f\uff1a\n    - \u4fe1\u606f\u9690\u85cf\u3001\u9690\u853d\u4f20\u8f93\n    - \u5728\u53ea\u80fd\u53d1\u9001\u56fe\u7247\u7684\u573a\u666f\u4e0b\uff08\u4f8b\u5982\u67d0\u793e\u4ea4\u8f6f\u4ef6\uff09\uff0c\u53d1\u9001\u4efb\u610f\u4fe1\u606f\n    - \u76f2\u6c34\u5370\u3001\u56fe\u7247\u6eaf\u6e90\u3001\u7248\u6743\u4fdd\u62a4\n\n\n\u8bf4\u660e\n- \u89e3\u539f\u59cb\u6570\u636e\u65f6\uff0c\u65e0\u9700\u539f\u56fe\u53c2\u4e0e\uff0c\u53ea\u770b\u6700\u4f4e\u4f4d\n- \u4f7f\u7528\u524d4\u4e2a\u5b57\u8282\u5b58\u653e\u6570\u636e\u7684\u5927\u5c0f\n- \u4f7f\u7528\u4f4d\u8fd0\u7b97\uff0c\u63d0\u9ad8\u4e00\u5b9a\u7684\u6027\u80fd\n- LSB\u7b97\u6cd5\u5bf9\u538b\u7f29\u3001\u8f6c\u683c\u5f0f\u7b49\u653b\u51fb\u8106\u5f31\n- \u4f8b\u5b50\uff1a[example_hide_in_img.py](example/example_hide_in_img.py)\n\n```python\nfrom hide_info import hide_in_img\n\n# \u628a\u6587\u4ef6\u9690\u85cf\u5230\u56fe\u7247\u4e2d\nhide_in_img.file_encode(filename='\u8981\u9690\u85cf\u7684\u6587\u4ef6.zip', img_filename='\u56fe\u7247.png', img_filename_new='\u85cf\u7269\u4e8e\u56fe.png')\n# \u4ece\u56fe\u7247\u4e2d\u63d0\u53d6\u6587\u4ef6\ntext_encode = hide_in_img.file_decode('\u85cf\u7269\u4e8e\u56fe-\u89e3\u51fa\u7684\u6587\u4ef6.zip', img_filename='\u85cf\u7269\u4e8e\u56fe.png')\n```\n\n## img_watermark: \u56fe\u7247\u7a7a\u57df\u4e0a\u7684\u9690\u6c34\u5370\n\n\u8bf4\u660e\uff1a\n- \u540c\u6837\u4f7f\u7528 LSB \u7b97\u6cd5\u3002 \n- \u6c34\u5370\u662f\u4e00\u4e2a **\u4e8c\u503c\u56fe**\u3002\n- \u53ef\u5bf9\u6297\u88c1\u526a\u653b\u51fb\n- \u5982\u679c\u56fe\u7247\u6709\u5927\u7247\u7eaf\u8272\u533a\u57df\uff0c\u5bf9\u8fd9\u4e9b\u653b\u51fb\u6709\u4e00\u5b9a\u7684\u9c81\u68d2\u6027\uff1a\u7f29\u653e\u3001\u8f6c\u683c\u5f0f\u3001\u622a\u56fe\u3001\u88c1\u526a\u3002\u5982\u679c\u6ca1\u6709\u5927\u7247\u7eaf\u8272\u533a\u57df\uff0c\u5219\u4e0d\u80fd\u5bf9\u6297\u8fd9\u4e9b\u653b\u51fb\u3002\n- \u4f8b\u5b50\uff1a[example/example_img_watermark.py](https://github.com/guofei9987/HideInfo/blob/main/example/example_img_watermark.py)\n\n\u4ee3\u7801 \n```python\nfrom hide_info import img_watermark\n\n# \u5d4c\u5165\u9690\u5f0f\u6c34\u5370\nimg_watermark.file_encode(img_filename=\"\u56fe\u7247.png\", watermark_filename=\"watermark.png\", img_filename_new=\"\u56fe\u7247_\u6253\u5165\u6c34\u5370.png\")\n\n# \u63d0\u53d6\u9690\u5f0f\u6c34\u5370\nimg_watermark.file_decode(img_filename=\"\u56fe\u7247_\u6253\u5165\u6c34\u5370.png\", wm_extract=\"\u89e3\u51fa\u7684\u6c34\u5370.png\")\n```\n\n## img_seed:\u56fe\u79cd\n\n\u529f\u80fd\uff1a\u628a\u56fe\u7247\u548c\u6587\u4ef6\u8fde\u63a5\u8d77\u6765\uff0c\u4ee5\u56fe\u7247\u7684\u5f62\u5f0f\u5b58\u4e0b\u6765\uff08\u76ee\u524d\u8fd8\u4e0d\u5b8c\u5584\uff09\n\n- \u4f8b\u5b50\uff1a[example/example_img_seed.py](example/example_img_seed.py)\n\n## img_exif:\u628a\u4fe1\u606f\u9690\u85cf\u5728\u56fe\u7247\u7684EXIF\u4e2d\n\n\u529f\u80fd\uff1a\u628a\u4fe1\u606f\u9690\u85cf\u5728\u56fe\u7247\u7684 EXIF \u4e2d\uff0c\u4ece\u800c\u83b7\u5f97\u9690\u853d\u4fe1\u606f\u3001\u4f20\u8f93\u9690\u853d\u4fe1\u606f\u7684\u80fd\u529b\n\n- \u4f8b\u5b50\uff1a[example/example_img_exif.py](example/example_img_exif.py)\n\n## hide_in_music: \u85cf\u7269\u4e8e\u97f3\n\n\u529f\u80fd\uff1a\u628a\u4e00\u6bb5\u4fe1\u606f\uff08\u6587\u4ef6/\u6587\u672c/bytes\uff09\uff0c\u85cf\u8fdb\u4e00\u4e2a\u97f3\u4e50\u6587\u4ef6\u4e2d\n\n\u4f8b\u5b50\uff1a\n- [example_hide_in_music.py](example/example_hide_in_music.py)\n\n```python\nfrom hide_info import hide_in_music\n\n# \u628a\u6587\u4ef6\u9690\u85cf\u5230\u67d0\u4e2a\u97f3\u4e50\u4e2d\nhide_in_music.file_encode(filename='\u8981\u9690\u85cf\u7684\u6587\u4ef6.zip', music_filename=\"\u97f3\u4e50.wav\", music_filename_new=\"\u85cf\u7269\u4e8e\u97f3.wav\")\n# \u4ece\u97f3\u4e50\u4e2d\u63d0\u53d6\u6587\u4ef6\nhide_in_music.file_decode(filename=\"\u85cf\u7269\u4e8e\u97f3-\u89e3\u51fa\u7684\u6587\u4ef6.zip\", music_filename=\"\u85cf\u7269\u4e8e\u97f3.wav\")\n```\n\n## hide_as_music\uff1a\u5316\u7269\u4e3a\u97f3\n\n\u529f\u80fd\uff1a\u628a\u4e00\u6bb5\u4fe1\u606f\uff08\u6587\u4ef6/\u6587\u672c/bytes\uff09\uff0c\u8f6c\u4e3a\u58f0\u97f3\n\u539f\u7406\uff1a\u7528 16 \u79cd\u97f3\u53ef\u4ee5\u8868\u793a\u4e00\u4e2a\u56db\u8fdb\u5236\u3002\u5982\u679c\u6bcf\u4e2a\u97f3\u6301\u7eed 0.05 \u79d2\uff0c\u90a3\u4e48\u6bcf\u79d2\u58f0\u97f3\u53ef\u4ee5\u5b58\u653e 10 \u5b57\u8282\n\u4f7f\u7528\u573a\u666f\uff1a\n    - \u4fe1\u606f\u9690\u85cf\u3001\u9690\u853d\u4f20\u8f93\n    - \u5728\u53ea\u80fd\u53d1\u9001\u56fe\u7247\u7684\u573a\u666f\u4e0b\uff08\u4f8b\u5982\u67d0\u793e\u4ea4\u8f6f\u4ef6\uff09\uff0c\u53d1\u9001\u4efb\u610f\u4fe1\u606f\n    \n\n\u8bf4\u660e\n- \u4f8b\u5b50\uff1a[hide_as_music.py](example/example_hide_as_music.py)\n\n```python\nfrom hide_info import hide_as_music\n\n# \u6587\u4ef6\u8f6c\u4e3a\u58f0\u97f3\u5e76\u5b58\u4e0b\u6765\nhide_as_music.file_encode(filename='\u8981\u9690\u85cf\u7684\u6587\u4ef62.zip', wav_filename='\u5316\u7269\u4e3a\u97f3.wav')\n# \u628a\u58f0\u97f3\u518d\u8f6c\u56de\u6587\u4ef6\nhide_as_music.file_decode(filename='\u5316\u7269\u4e3a\u97f3-\u89e3\u51fa\u6765\u7684\u6587\u4ef6.zip', wav_filename='\u5316\u7269\u4e3a\u97f3.wav')\n\n```\n\n## echo_watermark: \u56de\u58f0\u6c34\u5370\n\n\u56de\u58f0\u6c34\u5370\uff08Echo Watermarking\uff09\u662f\u4e00\u79cd\u97f3\u9891\u6c34\u5370\u6280\u672f\uff0c\u901a\u8fc7\u5728\u539f\u59cb\u97f3\u9891\u4fe1\u53f7\u4e2d\u6dfb\u52a0\u56de\u58f0\u6765\u5d4c\u5165\u4fe1\u606f\u3002\u8fd9\u79cd\u6280\u672f\u5229\u7528\u4e86\u4eba\u8033\u7684\u5fc3\u7406\u58f0\u5b66\u7279\u6027\uff0c\u5373\u4eba\u8033\u5bf9\u4e8e\u77ed\u65f6\u95f4\u5185\u7684\u56de\u58f0\u5ef6\u8fdf\u662f\u4e0d\u654f\u611f\u7684\uff0c\u56e0\u6b64\u53ef\u4ee5\u5c06\u4fe1\u606f\u9690\u85cf\u5728\u97f3\u9891\u4fe1\u53f7\u7684\u56de\u58f0\u4e2d\u800c\u4e0d\u5f71\u54cd\u542c\u611f\u3002\n\n\u56de\u58f0\u6c34\u5370\u7684\u5b9e\u73b0\u901a\u5e38\u6709\u4e24\u4e2a\u91cd\u8981\u53c2\u6570\uff1a\u56de\u58f0\u5ef6\u8fdf\u548c\u56de\u58f0\u5e45\u5ea6\u3002\u5ef6\u8fdf\u65f6\u95f4\u51b3\u5b9a\u4e86\u56de\u58f0\u5728\u539f\u59cb\u4fe1\u53f7\u4e4b\u540e\u591a\u4e45\u53d1\u751f\uff0c\u800c\u5e45\u5ea6\u5219\u5f71\u54cd\u56de\u58f0\u7684\u5f3a\u5ea6\u3002\u901a\u8fc7\u5de7\u5999\u5730\u8c03\u8282\u8fd9\u4e24\u4e2a\u53c2\u6570\uff0c\u53ef\u4ee5\u5c06\u6570\u5b57\u4fe1\u606f\uff08\u5982\u6bd4\u7279\u6d41\uff09\u7f16\u7801\u5230\u97f3\u9891\u4fe1\u53f7\u4e2d\u3002\n\n\u4f8b\u5982\uff0c\u53ef\u4ee5\u7528\u77ed\u7684\u5ef6\u8fdf\u65f6\u95f4\u8868\u793a\u6bd4\u7279'0'\uff0c\u7528\u957f\u7684\u5ef6\u8fdf\u65f6\u95f4\u8868\u793a\u6bd4\u7279'1'\uff0c\u6216\u8005\u901a\u8fc7\u8c03\u6574\u56de\u58f0\u7684\u5e45\u5ea6\u6765\u8868\u793a\u4e0d\u540c\u7684\u6570\u636e\u4f4d\u3002\n\n\u56de\u58f0\u6c34\u5370\u6280\u672f\u5bf9\u4e8e\u97f3\u8d28\u7684\u5f71\u54cd\u76f8\u5bf9\u8f83\u5c0f\uff0c\u540c\u65f6\u5177\u6709\u8f83\u597d\u7684\u9c81\u68d2\u6027\uff0c\u80fd\u591f\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u62b5\u6297\u538b\u7f29\u3001\u8f6c\u6362\u7b49\u5904\u7406\u8fc7\u7a0b\u3002\u8fd9\u4f7f\u5f97\u5b83\u9002\u7528\u4e8e\u7248\u6743\u4fdd\u62a4\u3001\u5185\u5bb9\u8ba4\u8bc1\u3001\u9690\u79d8\u901a\u8baf\u7b49\u9886\u57df\u3002\n\n```python\nfrom hide_info.echo_watermark import EchoWatermark\nfrom hide_info import utils, evaluate\nfrom scipy.io import wavfile\n\nori_file = \"./ori_file/sounds.wav\"  # \u8f7d\u4f53\nembedded_file = \"./output/sounds_with_watermark.wav\"  # \u5d4c\u5165\u6c34\u5370\u540e\u7684\u6587\u4ef6\u540d\nwm_str = \"\u56de\u58f0\u6c34\u5370\u7b97\u6cd5\uff0c\u6b22\u8fce star!\"  # \u6c34\u5370\n\nwm_bits = utils.bytes2bin(wm_str.encode('utf-8'))\nlen_wm_bits = len(wm_bits)\n\n# embed:\necho_wm = EchoWatermark(pwd=111001)\necho_wm.embed(origin_filename=ori_file, wm_bits=wm_bits, embed_filename=embedded_file)\n\n# extract\uff1a\necho_wm = EchoWatermark(pwd=111001)\nwm_extract = echo_wm.extract(embed_filename=embedded_file, len_wm_bits=len_wm_bits)\n\nwm_str_extract = utils.bin2bytes(wm_extract).decode('utf-8', errors='replace')\nprint(\"extract watermark: \", wm_str_extract)\n# error rate\uff1a\nevaluate.get_error_rate(wm_extract, wm_bits)\n```\n\n\n## hide_in_text\uff1a\u85cf\u7269\u4e8e\u6587\n\n\u529f\u80fd\uff1a\u628a\u4e00\u6bb5\u4fe1\u606f\uff08\u6587\u4ef6/\u6587\u672c/bytes\uff09\uff0c\u85cf\u8fdb\u4e00\u6bb5\u6587\u672c\u4e2d\n\n\u8bf4\u660e\n- \u5b9e\u6d4b\u5728\u82f9\u679c\u8bbe\u5907 Macbook\u3001IOS \u4e0a\uff0c\u9690\u85cf\u524d\u540e\u7684\u6587\u672c\u770b\u4e0d\u51fa\u533a\u522b\u3002\u4f46\u662f Windows \u548c\u67d0\u4e9b\u5b89\u5353\u7cfb\u7edf\u4e0a\uff0c\u4f1a\u6709\u7a7a\u683c\n- \u4f8b\u5b50\uff1a[hide_in_txt.py](example/example_hide_in_txt.py)\n\n```python\nfrom hide_info import hide_in_txt\n\n# \u628a\u4e00\u4e2a\u6587\u4ef6\u9690\u85cf\u5728\u4e00\u6bb5\u5df2\u6709\u7684\u6587\u672c\u4e2d\nhide_in_txt.file_encode(filename='\u8981\u9690\u85cf\u7684\u6587\u4ef62.zip', text_filename='\u4e00\u6bb5\u6587\u672c.txt', text_filename_new='\u85cf\u7269\u4e8e\u6587.txt')\n# \u4ece\u6587\u672c\u4e2d\u63d0\u53d6\u6587\u4ef6\nhide_in_txt.file_decode(filename='\u85cf\u7269\u4e8e\u6587-\u89e3\u51fa\u7684\u6587\u4ef6.zip', text_filename='\u85cf\u7269\u4e8e\u6587.txt')\n```\n\n## hide_as_txt: \u5316\u7269\u4e3a\u6587\n\n\u529f\u80fd\uff1a\u628a\u4e00\u6bb5\u4fe1\u606f\uff08\u6587\u4ef6/\u6587\u672c/bytes\uff09\uff0c\u4ee5\u6587\u672c\u7684\u5f62\u5f0f\u5b58\u653e\u4e0b\u6765\n\n\u8bf4\u660e\n- \u4f7f\u7528\u7684\u662f base85 \u7b97\u6cd5\n- \u4f8b\u5b50\uff1a[hide_as_txt.py](example/example_hide_as_txt.py)\n\n```python\nfrom hide_info import hide_as_txt\n\n# \u628a\u4e00\u4e2a\u6587\u4ef6\u8f6c\u5316\u4e3a\u4e00\u6bb5\u6587\u672c\uff0c\u5e76\u5b58\u4e0b\u8d70\nhide_as_txt.file_encode(filename='\u8981\u9690\u85cf\u7684\u6587\u4ef6.zip', txt_filename='\u5316\u7269\u4e3a\u6587.txt')\n# \u4ece\u6587\u672c\u4e2d\u63d0\u53d6\u6587\u4ef6\nhide_as_txt.file_decode(filename='\u5316\u7269\u4e3a\u6587-\u89e3\u51fa\u7684\u6587\u4ef6.zip', txt_filename='\u5316\u7269\u4e3a\u6587.txt')\n```\n\n## \u5176\u4ed6\u7b97\u6cd5\n\n\u7f29\u653e\u85cf\u56fe\uff1a\u63d0\u524d\u8ba1\u7b97\u7528\u8fd1\u90bb\u6cd5\u7f29\u653e\u65f6\u4f7f\u7528\u7684\u65f6\u54ea\u4e9b\u50cf\u7d20\u70b9\uff0c\u7136\u540e\u628a\u8fd9\u4e9b\u50cf\u7d20\u70b9\u53d8\u6210\u53e6\u4e00\u4e2a\u56fe\u3002\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Info Hiding Library\uff0c\u4e00\u4e9b\u4fe1\u606f\u9690\u85cf\u6280\u672f",
    "version": "0.1.9",
    "project_urls": {
        "Homepage": "https://github.com/guofei9987/cloakware"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "b8bfc9e0d6cb377e5119bca752ec9a4ae91e4ce08624b53162c1e247b3b3bce2",
                "md5": "ca0fa7906248c71a60ce164af2330a9b",
                "sha256": "6d084eb45cc1ba80fdd72602d27a336166e0ebbf424122b544c87ebdc03faf86"
            },
            "downloads": -1,
            "filename": "HideInfo-0.1.9-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "ca0fa7906248c71a60ce164af2330a9b",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.5",
            "size": 16167,
            "upload_time": "2024-01-02T13:24:07",
            "upload_time_iso_8601": "2024-01-02T13:24:07.580772Z",
            "url": "https://files.pythonhosted.org/packages/b8/bf/c9e0d6cb377e5119bca752ec9a4ae91e4ce08624b53162c1e247b3b3bce2/HideInfo-0.1.9-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "5db241bfb12dabe9f13afe047c4891cf7dbf91af1890c2fef33ab23cfd4fdf1d",
                "md5": "92b693f387d3626a284ba07dcaaee471",
                "sha256": "195935f8e034e541297aa3ae615c2e8b003d88df23e375cc78de23bbaa175d93"
            },
            "downloads": -1,
            "filename": "HideInfo-0.1.9.tar.gz",
            "has_sig": false,
            "md5_digest": "92b693f387d3626a284ba07dcaaee471",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.5",
            "size": 12688,
            "upload_time": "2024-01-02T13:24:10",
            "upload_time_iso_8601": "2024-01-02T13:24:10.206456Z",
            "url": "https://files.pythonhosted.org/packages/5d/b2/41bfb12dabe9f13afe047c4891cf7dbf91af1890c2fef33ab23cfd4fdf1d/HideInfo-0.1.9.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-01-02 13:24:10",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "guofei9987",
    "github_project": "cloakware",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "requirements": [],
    "lcname": "hideinfo"
}
        
Elapsed time: 0.16409s