鱼C论坛

 找回密码
 立即注册
查看: 3644|回复: 9

[技术交流] python小练习(038):把文本信息加密进图片里

[复制链接]
发表于 2016-12-5 13:02:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python小练习(037),传送门

再来看一个加密的小技巧:把文本信息加密进图片信息里

这个技巧的原理在于图片信息(通常是RGB数值,也有灰度数值)通常对于我们肉眼来说,细微的差别是无法识别,尤其是RGB色。

PS:我在本例中,为了方便,只用了灰度图像,但是原理是相同的。

这样就可以把需要加密的文本信息转换成asc码,利用每个像素的最后1位值进行加密,再还原成图像文件。

下图是加密前的图像:
encode.png

这副是把圣经的前4章节加密进去后的图像:
encoded.png

几乎用肉眼是很难分辨出不同的,如果用RGB三色的话,就会更难分辨,也绝对想不到,这样一张小小的图片中竟然包含着上万个文本信息。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-5 13:05:52 | 显示全部楼层
解密的过程其实就是加密过程的逆过程,非常便捷。

这样加密的好处在于,就是加密的图片落入其他人的手中,对他也是毫无用处的。

因为其他人在没有原始图像的情况下是不可能解密的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-5 13:09:05 | 显示全部楼层
源代码如下:
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Dec  5 11:19:11 2016

  4. @author: Administrator
  5. """

  6. from PIL import Image
  7. with open('encode.ini') as f:
  8.     data = eval(f.read())
  9. with open('bible.txt') as b:
  10.     string = b.read()

  11. def encode(string,data):
  12.     L = '0'*(6-len(str(len(string)))) + str(len(string))
  13.     encode = []
  14.     for l in L:
  15.         encode.append(int(l))
  16.     for s in string:
  17.         ask = str(ord(s))
  18.         enask = '0'*(3-len(ask))+ask
  19.         for e in enask:
  20.             encode.append(int(e))
  21.     newdata = data[:]
  22.     for e in range(len(encode)):
  23.         newdata[e] += encode[e]
  24.     en = Image.new('L',(400,700))
  25.     index = 0
  26.     for x in range(400):
  27.         for y in range(700):
  28.             en.putpixel((x,y),newdata[index])
  29.             index += 1
  30.     en.save('encoded.png')

  31. encode(string,data)


  32. def decode(img,data):
  33.     endatas = []
  34.     for x in range(400):
  35.         for y in range(700):
  36.             endatas.append(img.getpixel((x,y)))
  37.     L = endatas[:6]
  38.     l = 0
  39.     for i in range(6):
  40.         l += L[i]
  41.         l *= 10
  42.     l //= 10
  43.     endata = []
  44.     for i in range(l*3+6):
  45.         endata.append(endatas[i]-data[i])
  46.     deask = ''
  47.     for i in range(6,l*3+5,3):
  48.         deask += chr(endata[i]*100+endata[i+1]*10+endata[i+2])
  49.     return deask

  50. img = Image.open('encoded.png')
  51. with open('output.txt','w') as op:
  52.     op.write(decode(img,data))
复制代码

encodejpg.rar (406 KB, 下载次数: 20, 售价: 1 鱼币)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-5 14:25:26 | 显示全部楼层
另外一种改进的方法,就是直接覆盖原始图像的像素值的最后一位,这样加密或者解密的时候连原始图像都可以省略了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-12-5 16:29:47 | 显示全部楼层
学写了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-31 13:19:24 | 显示全部楼层
学习一下!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-22 02:22:47 | 显示全部楼层
问题是,encode后,如何decode??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-23 10:00:51 | 显示全部楼层
jerryxjr1220 发表于 2016-12-5 13:05
解密的过程其实就是加密过程的逆过程,非常便捷。

这样加密的好处在于,就是加密的图片落入其他人的手中 ...

问题是有了原始图像,要怎么解密?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-24 11:59:19 | 显示全部楼层
会加密了,关键是怎么解密,怎么解密,怎么解密啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-4-25 11:02:20 | 显示全部楼层
ABC23 发表于 2018-4-24 11:59
会加密了,关键是怎么解密,怎么解密,怎么解密啊?

解密不就是加密的逆过程么?
你怎么加密的,就怎么倒回去解密。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 00:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表