密文破译成功!《由0和1组成的密码,何解?》

        一个多月前某平台一位粉丝给我留言,和自己聊的很熟的异性发来一段密文,说这是她想对粉丝说的话,于是该粉丝求助我帮忙破译:

000000010011000010111000110000000011111011010111100011001110111110010001011101100111001000010100010010001010110000111111101110100010010001011101010100011001010100010011111011011100010011111110111110000000010101010101010101010000000111111111010100110000100011111111110100010111100110100010001110110000100100111110010000011100101000001011000011010010101100001001001101111110011001101010000101001011000010010111101001001100001111110011111100010101111000010100000100111010010011000001000010111000101111101110100101011000111011101011101011001100110101000001001011110100110100100001000000101100000010100110011000110110010010010001011111001101100110111010100101000010111111011110111101011000101000110101011100111010100010001100001101011100001110010101011010100100011100101110000000001000111001110001011101011100100001101100000001101111111110101000101001110011101110000000011010110010001011010100111011111010111000111000110011100010010001010111011111101110000001000010001011000001001101011100111100010001010001111101000110001111010011111011000001110000010100100001000000011110011010001001100010100

        这是一个长1089个数的由0和1组成的密文,本来以为是ANSI符,后来发现不是,也不是十进制译成二进制。历时一个月,我破解到密码是 “ 这个深夜里,特别想你!” 。

        粉丝老哥啊!你的爱情来了,快去追吧。

        后面说说我所如何破解的。走在学校的路上,我看到树上的一个活动宣传,有个二维码,然后我都灵感就来了:会不会是一个二维码,扫描得到信息呢,而恰好0可以代表二维码中的白色,而1表示黑色。然后这是一段一维的数据,差点我就放弃这个想法了,我发现长度1089恰好可以开根号,而开根号后恰好可以组成一个33✖33的矩阵,这不就成一个二维的数据了嘛!

import re
import numpy as np

with open(r"D:\临时\密文.txt") as fi:
    data = fi.read()

ls = re.findall('\d',data)          # 把密文每个数字变成列表的一个元素
arr = np.array(ls,dtype=int).reshape(33,33)   # 把一维列表转成二维数组/矩阵
print(arr)

        然后用热力图把二维码展现出来:

import seaborn as sns
sns.heatmap(arr,square=True,cbar=False,cmap='Greys')
plt.xticks([])
plt.yticks([])
plt.show()

        画出来后又感觉不太对,扫不出来!而且,二维码的左上角、右上角以及左下角不应该是完整的 “回” 字吗?怎么缺漏了。想破脑汁后终于想到,黑色和白色——反过来。。。反过来就刚好符合二维码的样子了。在上面的代码增加一行,把0换成1,把1换成0:

import seaborn as sns
arr = np.where(arr == 0,1,0)        # 关键
sns.heatmap(arr,square=True,cbar=False,cmap='Greys')
plt.xticks([])
plt.yticks([])
plt.show()

        这个二维码扫描出来——就是 “ 这个深夜里,特别想你!” 。老哥,赶紧找你爱情去吧。

逆推密文的由来

        关于这个密文的由来,我猜是由一段文字生成的二维码,然后再把黑白分隔,分别把黑色编译成1,白色编译成0(或者黑色编译成1,白色编译成0,然后再反向),最后把二维数组转成一维数组,再格式化成一条长长的由0和1组成的一串数字。

        首先去正规的二维码生成平台输入文字 “这个深夜里,特别想你!”,生成一个二维码。

import cv2
a = cv2.imread(r"D:\待编译图片.png")    # 读取二维码
b,c,d = cv2.QRCodeDetector().detectAndDecode(a)     # 获取每个像素点的0-255色彩范围
print(d)

        黑色编译成1,白色编译成0:

xs = np.where(d<128,0,1)           # 把<128的换成0即黑色,把>128的换成1即白色
print(xs)

        然后把二维数组转成一维数组,再格式化:

xs = xs.reshape(xs.shape[0]*xs.shape[1])
print(xs)
st = list(map(lambda x:str(x),xs))
print(''.join(st))

        一模一样!本文到此结束。不得不说,这位粉丝聊的是一个程序员啊!感兴趣的小伙伴也可以自己去弄一个,发给自己喜欢的人,让对方破译。说实话这个做起来不难,难的是如何去想,如何去破。

        提供本文用到的文件:链接:https://pan.baidu.com/s/1XEywzDMzmZLA0wuh8MhecA?pwd=uxq1 
提取码:uxq1

猜你喜欢

转载自blog.csdn.net/m0_71559726/article/details/130753957