用python写的文本水印隐藏工具

news2025/1/11 17:11:58

看见一个文本水印项目:text_blind_watermark
https://github.com/guofei9987/text_blind_watermark

假设这种场景是不是合适使用:
小米su7发布之前一周,各大博主已经已经拿到参数配置和价格表了,保密政策不允许博主提前发布,但是万一有头铁的提前发布了,就可以用这个工具揪出内鬼。

1、小米计划给A,B,C,D四位博主发信息,信息如下:

XXX产品就是好,XXX产品呱呱叫。用上XXX产品,走上人生巅峰不是梦。XXX产品详细参数如下:
能源类型 纯电动
外观颜色 ● 海湾蓝、雅灰、橄榄绿    
○ 珍珠白、钻石黑、流星蓝、霞光紫、熔岩橙、寒武岩灰
内饰颜色 ● 银河灰、曜石黑、暮光红、迷雾紫
基本参数
车长 × 车宽 × 车高(mm) 4997 × 1963 × 1455 4997 × 1963 × 1440
轴距(mm) 3000
最小转弯半径(m) 5.7
前备箱容积(L) 105
后备厢容积(L) 517 493
风阻系数 0.195
整车性能
0-100km/h加速时间(s) 5.28 5.7 2.78



此条信息只能XX日晚上8点之后发!各位一定要保密,不到时候不准发送,如果提前泄露,我们将会追责。请各位一定要注意!切记切记!

2、发之前,给A、B、C、D四个人的消息分别加上密文。

2.1 给A的:
密文是博主A,密码是123

from text_blind_watermark import TextBlindWatermark

watermark = "博主A" #这就是打入的密文
password = "123"#为了防止谁都能解密,就设置一个密码。A的密码是123

text = """
XXX产品就是好,XXX产品呱呱叫。用上XXX产品,走上人生巅峰不是梦。XXX产品详细参数如下:
能源类型 纯电动
外观颜色 ● 海湾蓝、雅灰、橄榄绿    
○ 珍珠白、钻石黑、流星蓝、霞光紫、熔岩橙、寒武岩灰
内饰颜色 ● 银河灰、曜石黑、暮光红、迷雾紫
基本参数
车长 × 车宽 × 车高(mm) 4997 × 1963 × 1455 4997 × 1963 × 1440
轴距(mm) 3000
最小转弯半径(m) 5.7
前备箱容积(L) 105
后备厢容积(L) 517 493
风阻系数 0.195
整车性能
0-100km/h加速时间(s) 5.28 5.7 2.78



此条信息只能XX日晚上8点之后发!各位一定要保密,不到时候不准发送,如果提前泄露,我们将会追责。请各位一定要注意!切记切记!
"""

twm = TextBlindWatermark(password=password)
twm.read_wm(watermark=watermark)
twm.read_text(text=text)
text_embed = twm.embed()
print('加密完成,内容已写入文件text_embed.txt')
with open('text_embed.txt', 'w', encoding='utf-8') as f:
    f.write(text_embed)

2.2 给B的:
密文是博主B,密码是1234

```python
from text_blind_watermark import TextBlindWatermark

watermark = "博主B" #这就是打入的密文
password = "1234"#为了防止谁都能解密,就设置一个密码。A的密码是123

text = """
XXX产品就是好,XXX产品呱呱叫。用上XXX产品,走上人生巅峰不是梦。XXX产品详细参数如下:
能源类型 纯电动
外观颜色 ● 海湾蓝、雅灰、橄榄绿    
○ 珍珠白、钻石黑、流星蓝、霞光紫、熔岩橙、寒武岩灰
内饰颜色 ● 银河灰、曜石黑、暮光红、迷雾紫
基本参数
车长 × 车宽 × 车高(mm) 4997 × 1963 × 1455 4997 × 1963 × 1440
轴距(mm) 3000
最小转弯半径(m) 5.7
前备箱容积(L) 105
后备厢容积(L) 517 493
风阻系数 0.195
整车性能
0-100km/h加速时间(s) 5.28 5.7 2.78



此条信息只能XX日晚上8点之后发!各位一定要保密,不到时候不准发送,如果提前泄露,我们将会追责。请各位一定要注意!切记切记!
"""

twm = TextBlindWatermark(password=password)
twm.read_wm(watermark=watermark)
twm.read_text(text=text)
text_embed = twm.embed()
print('加密完成,内容已写入文件text_embed.txt')
with open('text_embed.txt', 'w', encoding='utf-8') as f:
    f.write(text_embed)

2.3 给C的:
密文是博主C,密码是12345
代码跟之前一样,改密文和密码参数即可

2.4 给D的:
密文是博主D,密码是123456
代码跟之前一样,改密文和密码参数即可

在这里插入图片描述

3、得出密文文件,将文件发给ABCD四个博主

4、如果出现泄密情况,将网络上泄密的文字复制到文件里,然后将文件一个一个匹配博主的密码进行解密

4.1、解密:
遍历所有博主,将加密的文字循环调用解密方法,最终得出是这段密文是谁的。

from text_blind_watermark import TextBlindWatermark

dic = {'博主A':'123','博主B':'1234','博主C':'12345','博主D':'123456'}


with open('text_embed.txt', 'r', encoding='utf-8') as f:
    txt_new = f.read()

# 循环从dic里提取密码,并且代入到TextBlindWatermark中,遇见异常捕获之后直接跳过,最终得到盲水印
for key, value in dic.items():
    try:
        twm = TextBlindWatermark(password=value)
        wm_extract = twm.extract(txt_new)
        print("解密出的水印:")
        print(wm_extract)
        break
    except:
        continue
    

在这里插入图片描述

最终得出B博主泄密

PS,控制台打印输出的加密后文字,直接复制出来是解密不了的,所以写文件里了。
END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1589365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础入门--第十一章--JDBC(Java Database Connection)Java数据库连接

JDBC 11.1 什么是JDBC11.1.1 JDBC概述11.1.2 JDBC驱动程序 11.2 JDBC的常用API11.3 JDBC编程11.3.1 JDBC 编程步骤11.3.2 实现第一个JDBC程序 我的MySQL的root密码: root 11.1 什么是JDBC 11.1.1 JDBC概述 JDBC的全称是Java数据库连接(Java Database Connectivit…

Python爬虫与API交互:如何爬取并解析JSON数据

目录 前言 一、什么是API和JSON数据 二、准备环境 三、发送API请求并获取数据 四、解析JSON数据 五、完整代码示例 六、总结 前言 随着互联网的发展,越来越多的网站提供了API接口,供开发者获取实时数据。在爬虫领域中,与API交互并解析…

科技云报道:从“奇点”到“大爆炸”,生成式AI开启“十年周期”

科技云报道原创。 世界是复杂的,没有人知道未来会怎样,但如果单纯从技术的角度,我们总是能够沿着技术发展的路径,找到一些主导未来趋势的脉络。 从Sora到Suno,从OpenAI到Copilot、Blackwell,这些热词在大…

【动态规划】【01背包】Leetcode 1049. 最后一块石头的重量 II

【动态规划】【01背包】Leetcode 1049. 最后一块石头的重量 II 解法 ---------------🎈🎈题目链接🎈🎈------------------- 解法 😒: 我的代码实现> 动规五部曲 ✒️确定dp数组以及下标的含义 dp[j]表示容量为…

【Django开发】前后端分离美多商城项目第7篇:登录,使用登录的流程【附代码文档】

美多商城项目4.0文档完整教程(附代码资料)主要内容讲述:美多商城,项目准备1.B2B--企业对企业,2.C2C--个人对个人,3.B2C--企业对个人,4.C2B--个人对企业,5.O2O--线上到线下,6.F2C--工厂到个人。项目准备,配置1. 修改set…

异地两分部子网重复,如何远程更改其中一个分部子网信息

环境: 分部1:子网192.168.1.0/24 分部2:子网192.168.1.0/24 问题描述: 异地两分部子网重复,如何远程更改其中一个分部子网,原本没有问题目前要与总部建ipsec提示冲突无法都建立隧道 解决方案: 先G一下,看看有啥建议 在两个异地分部网络中,如果发现有子网地址出现…

【C++】哈希一

这篇博客要说的是哈希算法,哈希又称为散列,它是将存储的值和存储的位置建立起关联关系的一种算法,或者说是一种将任意长度的数据映射为固定长度的输出的算法。 什么意思呢?我们来看一个例子:比如说我们要存储1&#xf…

[RK3399 Linux] 使用busybox 1.36.1制作rootfs

一、 编译、安装、配置 busybox 1.1 下载源码 根文件系统是根据busybox来制作的。 下载地址:https://busybox.net/downloads/。 这里就以1.36.1版本为例进行编译安装介绍: 注意:编译linux内核与文件系统中的所有程序要使用相同的交叉编译器。 下载完成后解压: mkdir …

三大能力升级!大模型开启智能客服新篇章

当前智能化已成为各行各业加速转型发展的关键词,客户服务领域也不例外,将大语言模型与文档问答结合,不仅能够有效提升知识构建效率,重塑智能客服模式,还将成为企业营销、运营智能化进程中的重要助推力! 接…

C语言基础:回顾判断素数

什么是素数(也称质数)?和合数相对。 其特点是只能被 1 和它本身 整除,无法被其他整数整除。或者公因数只有它自己和1两个数的数 怎么求解素数呢?对于求解质数的方法很多,但是有一种专门求解素数的功能&am…

Pytest接口自动化测试进阶

背景 随着Web应用的发展,越来越多的功能需要用户登录才能使用。而在接口测试中,往往需要模拟用户的登录状态来进行测试。一种常见的做法是通过Cookie来维持用户的登录状态。然而,由于Cookie的有效期限制以及网站的安全策略,如何在…

leetcode每日一题第四十六天

递归解法 class Solution { public:int search(vector<int>& nums, int target) {return midsearch(nums,target,0,nums.size()-1);}int midsearch(vector<int>& nums, int target, int low,int high){if(low < high){int mid (lowhigh) / 2;if(nums[…

别让这6个UI设计雷区毁了你的APP!

一款成功的APP不仅仅取决于其功能性&#xff0c;更取决于用户体验&#xff0c;这其中&#xff0c;UI设计又至关重要。优秀的UI设计能够为用户带来直观、愉悦的交互体验&#xff0c;甚至让用户“一见钟情”&#xff0c;从而大大提高产品吸引力。 然而&#xff0c;有很多设计师在…

.NET Framework安装失败的原因及解决方法

.NET Framework安装失败的原因及解决方法 大家好我是艾西&#xff0c;一个做服务器租用的游戏爱好者兼网络架构系统环境问题网络工具人。在我们平时使用PC安装某些程序会出现.NET Framework缺失的提示&#xff0c;那么也会有很多的小伙伴搞不懂什么原因导致的&#xff0c;这个问…

【C++】unordered 系列关联式容器

文章目录 1. unordered 系列关联式容器2. unordered_map2.1 unordered_map 的文档介绍2.2 unordered_map 的接口说明 3. unordered_set4. 在线 OJ 1. unordered 系列关联式容器 在 C 98 中&#xff0c;STL 提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可…

C/C++进阶/架构师(后端/音视频/游戏/嵌入式/高性能网络/存储/基础架构/安全)开发学习路线、系统性学习教程

C学习可以划分为几个主要阶段&#xff0c;每个阶段的学习目标和推荐资源都有所不同。下面是一个详细的分阶段学习指南&#xff1a; 入门阶段 学习目标 理解C的基本语法和结构。学习基本数据类型&#xff0c;条件判断&#xff0c;循环等控制结构。掌握函数的使用方法。初步了…

MongoDB副本集部署(windows)

环境准备 本教程演示mongodb4.4 副本集部署&#xff08;一主两从&#xff0c;伪分布式&#xff09; 节点配置主节点localhost:27017从节点1localhost:27018从节点2localhost:27019 每一个节点&#xff08;实例&#xff09;都创建对应的数据文件&#xff08;data&#xff09;…

从零自制docker-9-【管道实现run进程和init进程传参】

文章目录 命令行中输入参数长度过长匿名管道从父进程到子进程传参[]*os.File{}os.NewFile和io.ReadAllexe.LookPathsyscall.Execstrings.Split(msgStr, " ")/bin/ls: cannot access : No such file or directory代码 命令行中输入参数长度过长 用户输入参数过长或包…

acwing2060. 奶牛选美

题目&#xff1a; 代码&#xff1a; //acwing2060. 奶牛选美 #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N55; const int dx[]{-1,0,1,0},dy[]{0,-1,0,1}; bool st[N][N]; int point[N][N]; char map[N][…

微信小程序中调取小程序实现报错:提示 开发版小程序已过期,请在开发者工具中重新扫码的 解决方案

出现的问题&#xff1a; 解决方法&#xff1a; 将envVersion: develop,开发版切换为正式版 envVersion: release,wx.navigateToMiniProgram({appId:res.data.appId,path: res.data.prePayTn,extraData: {foo: bar,miniProgramOrgId:res.data.miniProgramOrgId,orderId: res.d…