文号
946352
阅读
1061057
回复
6
收藏
3
本文在AI协助下创作,作者声明AI的作用仅限于局部修饰性、辅助性工作,文章内容的严肃性由作者负责。
做一个加密聊天室
2025/08/14
IP:北京

在目前的网络上,因为懂得都懂的原因,大软件上的聊天内容都是公开的,能被想要看到你的聊天记录的人看到1f613

为了安全,简单写了一个基于python flask框架的web加密聊天室,可以供大家使用。


最初的想法是只基于aes和聊天室名的简单对称加密,后来觉得在大软件上商量密钥也会被发现(什么http加密难题),因此还做了一个非对称加密,具体过程很像https的握手(当然tls1.3现在已经不支持rsa了,只支持dh密钥交换了,有时间也做一个)。这样能做到即使中间人全程监听通信(只要不篡改信息),你的聊天内容都能保持加密。如果你真的怕微信会篡改你发给对方的rsa密钥的话可以在此加密聊天室内发,这样完全不会被篡改


之后又想到在社交媒体上直接用base64编码的公钥互相交流很奇怪,可能被发现(哪个正常人会在微信上发一堆奇奇怪怪的英文数字字符)。因此还加入了一个将密钥隐写入jpeg图片的功能。这部分很有意思,我研究了很久,具体的方式是基于jpeg压缩的原理(见下),在图片被压缩后的频率域上将数据的最低位比特改为你需要写入数据的比特。



下面是具体原理,如果你不想看可以跳过

jpeg压缩方式:对图像进行8*8分块,之后对每个块进行离散余弦变换(DCT变换,可以理解为对某个向量进行基展开),再经过量化(在这一步进行了有损压缩,去除了人眼不易察觉的高频分量)和熵编码(可以理解为无损压缩)之后得到文件。程序所做的就是挑选任意一个频率分量大于2(避免改低频分量被察觉到)并且量化后的系数大于某个值(如果这个值太小容易使图片产生肉眼可见的变化)的系数,并按照某个提前约定好的随机顺序(根据随机数种子提前约定好),将消息进行写入

image.png



具体的实现如下,能够发现两张图片几乎完全相同,但信息确实被写入进去了

隐写前:

ti.jpeg

隐写后:

0e4d4977-d6de-4a8e-a33b-8dfd972e3d69.jpg

(如果kc没有对图片进行压缩的话,你应该能使用相同的种子提取出和我下面放的相同的文字)

image.png


当然,隐写只是这个项目的附功能,主功能就是一个加密聊天室,大概长这样

image.png

image.png

image.png

image.png

image.png

服务器所有加解密操作均在本地进行,服务器端不会存储任何密钥和明文,因此大家大可放心自己的消息不会被泄露

就是这样,最后我还要吐槽一下python的jpegio库,这个库遇到某些特殊的jpeg就会直接崩溃,而且产生的错误比python更底层

导致python都无法捕获这个错误。因此我只能采用线程安全的执行方法来执行隐写模块。

提醒一下,如果在本地运行此项目,请一定要自己编译安装jpegio,不要直接用pip装(除非你的pip也是编译安装),不然似乎无法运行隐写相关模块

最后是这个项目的zip包,源码太大了就不放上来了

部分代码由ai生成,但现在真的会有老实人写程序不用ai吗

attachment iconnetchat_0.0.5.zip24.10KBZIP37次下载

[ 修改于1年2个月前 - 2025/08/14 21:42:20 ]
1年2个月前IP:北京
946364
1楼

有意思,用相同的种子提取后的字符串只相差了一个字符,kc你对我的图片干了什么

引用
评论
1年2个月前IP:北京
946398
5楼
引用量子隧道发表于4楼的内容
“程序所做的就是挑选任意一个频率分量大于2(避免改低频分量被察觉到)。。。”请问一下这里的“大于2”是指什么?具体的位置,是指DCT变换后的8*8矩阵的哪些点?

比如矩阵从(0,0)到(7,7)

则会选择除了(0,0) (0,1) (1,0) (1,1)这四个点以外的所有量化后系数绝对值大于某个数(比如3)的点

引用
评论(1)
2
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的