设为首页收藏本站找回账号

未完全侦探推理论坛

 找回密码
 加盟为IC探员
查看: 387|回复: 2

[侦探手册] 【原创】《月月的侦探小技巧手册》——第一期:如何在被监控状况下建立秘密对话

[复制链接]

83

主题

2928

帖子

180

积分

IC威挨劈

完美主义强迫症患者

Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

IC币
181251
威望
15 点
推理积分
58 点
推游积分
69 点
侦探阅历
12 点
魅力值
8 点
IC推侣
銀い鏡の音

推理谜题勋章职业杀手勋章杰出贡献勋章活跃分子勋章不可能犯罪推理大赛冠军勋章不可能犯罪推理大赛季军勋章IC坛庆勋章

发表于 2019-9-22 17:56 | 显示全部楼层 |阅读模式
本帖最后由 月影星光 于 2019-9-22 18:26 编辑

《月月的侦探小技巧手册》——第一期:如何在被监控状况下建立秘密对话

0w0本系列更新不定时,模式先试试剧情故事加解析~

剧情故事:
侦探萧乐缓缓从昏迷中醒来,睁开眼发现身处一个封闭的大房间,房间内空空荡荡,或站或躺着几个人。萧乐检查了一下自己身上,发现随身物品都在,回忆了一下记起了自己似乎是在路上突然被人从后面捂住嘴弄晕的。

判断暂时安全的萧乐仔细观察了下那几个人,发现大部分并不认识,只认出了一个站着的人,是他在未完全侦探社的好基友银鹰。萧乐考虑了一下要不要打声招呼,或是询问是否知道目前的状况,而根据他总结的信息量原则,他现在处于低信息量状态,在确认银鹰也发现了自己后,决定不进行干涉。

“这里是什么地方,你们是什么人?”几个人中有人忍不住出声询问,是一个健壮的中年男人,而其他人只是看了看他,并不出声回应。

正在这时广播响了起来:“诸位侦探,欢迎光临名侦探选拔赛,我是这里的主持人,非常遗憾用了一些不文雅的手段邀请诸位过来,等你们通过选拔后请务必接受我们的致歉。好了,进入正题吧,这次的任务非常简单,诸位所在的房间里布满了监视器和窃听器,诸位的一举一动都在我们的全方位监控之下,请在这种情况下建立秘密对话,只要能成功和任意一人建立秘密对话,让我们一时间不能得知诸位传递的信息,对话的参与方都将通过选拔。而一旦尝试建立秘密对话失败,被我们得知了传递的秘密信息,就会立即被淘汰。只要明确申明或是表现出认为能瞒过我们的信息传递都会被判定为尝试建立秘密对话。我知道诸位有很多问题,但只有通过选拔的人才有资格提问,那么请诸位开始吧。”

……

现场一片安静。

“等一下,你突然说这么一大堆,我也记不住啊。不如你出来或者找人来和我打一场,我肯定能获胜,当初要不是被你们射中了三发麻醉弹我也不会晕啊。”那个健壮的中年男人抱怨道。

广播再次响起:“随时准备获取理解信息可是侦探的基本,虽然这位先生看起来是硬汉派的,参与这次的任务确实有些吃亏,但也不是毫无办法,而且侦探的综合素质也是我们考核的一环。”

萧乐暗中思考着,比如把想出建立秘密对话手段的人以外的人全部打晕过去,让对方只能选择和自己一起通过。

……

“让我们讨论一下吧,这可真是不容易,一般要传递秘密信息,都是事先约定一个暗号或者加密方式,可是我们之前都不认识,现在约定暗号和加密方式的话主办方也都能监控到,如果说用主办方不能监控的方式约定暗号,就又要面对怎么传递秘密信息的问题,真是钥匙锁在箱子里,无从入手啊。”一个大约是小学生的小男孩愁眉不展的自言自语。

“其实就是共同秘密的问题,如果我们之前认识的话,就可能会有主持人不知道的共同秘密,那就可以用来传递信息了。”另一个绑着辫子的高中男生接话道。

听到这里萧乐看了好基友银鹰一眼,他们的存在是主办方的疏忽吗,这样想着萧乐用默认登录着的未完全侦探社的帐号给银鹰发了信息,他并不认为这能瞒过主办方,而是想通过以前的共同秘密来约定暗号,然而银鹰并不回复他,看着银鹰眼里透露出跃跃欲试的样子,好像对这个所谓的选拔很感兴趣,并不打算利用互相认识的优势,萧乐发现他也只能通过公开的方式来建立秘密对话了。

“哈哈哈,这有什么难的,我名侦探毛利已经想到了,大家都是侦探肯定对各种语言都有涉猎,日本語で話しましょう(用日语交流吧)。”一个穿着西装的大叔哈哈笑着自信的说道。

萧乐虽然也懂日语,但是并不想去回应这个毛利大叔,他觉得事情不可能这么简单,而其他人也都沉默不语。

果然,一会儿之后,广播响起:“真遗憾,毛利先生被淘汰了,确实语言也可以是一种共同秘密,可是这实在是太普遍了,我们当然不会不做准备,世界上主要的语言我们都有专人负责监听,甚至侦探的共同知识,比如摩斯电码,诸位如果直接尝试拍发的话也只会遭到淘汰,当然,如果诸位中恰巧有两人拥有我们不了解的共同知识或是生僻语言,那也可以尽管试试。”

接着萧乐看到一群全副武装的人走进来带走了那个自称毛利的大叔,不禁让人为他的未来担忧。

“看来对方相当专业,利用共同知识这条路也是行不通的,除非是自己秘而不宣的原创,否则主办方也很可能知道,而如果秘而不宣,我们中也不会有两人知道。”绑着辫子的高中男生继续说道,“看来只能躲过监视,现场建立共同秘密了,我有了一个想法。”

说着这个男生走到那个小学生模样的男孩子面前,突然九十度弯下腰,两手成掌并拢做接水状,然后向上握拢,把拇指藏在中间,只露出一个特定的角度在小男孩眼前,然后对他说:”看好我的拇指,两个拇指第一指节伸直代表字间隔,左手拇指伸一次代表长,右手拇指伸一次代表短,两个拇指伸直三秒代表词间隔。”

然后不知道他做了什么操作,小男孩看完后眼睛发亮,伸手握住他的手腕,用另一只手遮住,想来应该是在上面有规律的按动。

萧乐知道他们这是在用摩斯电码通讯,高中男生用身体和手掌保护住拇指,手掌保护住了下方和四周,上方对着小男孩的眼睛,有小男孩的头和高中男生的身体保护。之后小男孩也是完全挡住手用轻轻按压手腕来传递摩斯电码,如果是一般的监视应该是很安全的了,不过萧乐总感觉有些担心,不知道主办方使用了什么监控手段。

这时广播响起:“真是太遗憾了,工藤先生和金田一先生也不幸被淘汰了,不过两位已经相当优秀了,如果只凭可见光监视器恐怕我们也不能发现你们的秘密信息,准备参加复活赛吧。”

“什么!”叫工藤的小男孩和高中生金田一不禁惊呼,然后就被带走了。

“这下麻烦了,主办方说的全方位监控竟然这么彻底,恐怕虽然我们的电子设备还能使用,但通讯网络也是被监控了的吧,虽然我以前准备的GPG系统应该不受影响,但是……”一个穿着淡黄色西装的年轻银发男子第一次皱起了眉头。

“GPG?虽然非对称加密确实可以防范网络层面的监控,但是这可是被全方位监控了,相当于本机就中了木马,借助电子设备的加密,传输过程再安全,打开屏幕看的时候还是会被发现吧。”萧乐不由得有些惊讶。

“我不需要打开屏幕看,主办方只说了秘密传递让他们一时间不能得知的信息,并未要求我知道信息内容,也许只要对方随机生成密钥文件加密传输给我,我可以解密而主办方不能获取就行了,但我怀疑主办方也许不认可这点,如果这样我也有设备可以把文件信息转为电击脉冲或耳机的电子声,只是看了刚才的那一幕我对这样能否瞒过主办方信心不大。”年轻男子接着说道。

这时广播声响起:“让诸位产生了误解真是遗憾,这里的秘密对话需要诸位能理解信息内容,至于电击和耳机的电子声我们能否监控,就要请诸位尝试了。”

萧乐思考着,也许主办方不能监控的只有各人的大脑了,如果连脑中的想法也能获取,这就是不可能的任务了。

接着萧乐出声说道:“虽然用人脑加密太过简单有被破解的风险,但还是能争取一些时间吧,我使用迪菲-赫尔曼密钥交换,公共质数为263,生成元为5。”

“你说这些谁懂啊!”健壮的中年男人忍不住了。

而萧乐只是看着银鹰,银鹰邪魅一笑,开口道:“我的公钥是……”

“等一下!”这时广播声急促的响起,“还请两位去我们为两位准备的各自的房间内通过通话器联系。”

“为什么?”萧乐不由得皱眉。

“虽然是我们的疏忽,但是两位之前就认识是事实,为了公平起见必须得增加一些难度。”主持人说道。

萧乐只好同意了。

在去房间的路上,萧乐想着,迪菲-赫尔曼密钥交换就是数学上的离散对数问题,通过公开约定一个公共质数p和生成元g,然后甲方选择一个随机自然数a作为不公开的私钥,并且计算出公钥A=g^a mod p告诉乙方,乙方同样选择一个随机自然数b作为不公开的私钥,并且计算出公钥B=g^b mod p告诉甲方,然后甲方计算共同秘密K=B^a mod p,乙方计算共同秘密K=A^b mod p,因为乘法交换,两个K的结果是一样的。而监控者只能知道p,g,A,B,只能尝试实验所有g^ab mod p的可能取值来计算,所以p,a,b要足够大才好,g倒是一般只要2或5就行了,虽然人脑能计算的太简单了,但应该也能争取一些时间,只是还有另一个风险……

“我的公钥是5……”通话器里传来电子声。

萧乐开口道:“不,你不是银鹰,你应该是主持人,想通过替换提供的公钥,让我们以为建立了共同秘密,而实际上是和你建立的吧,这就是迪菲-赫尔曼密钥交换的风险,中间人攻击。但是我们正好有可以认证身份的方式,不管是用未完全侦探社的帐号还是用GPG都可以实现。”

接着萧乐告知了真正的银鹰他的公钥123,获得了银鹰的公钥25,接下来就很简单了,建立了共同秘密后可以利用的秘密对话方式就太多了。

电子声响起:“两位这是用了先前认识时就建立的认证机制,不好办啊……”

“你们不也不只监控,还进行了替换吗,我们也不算利用优势,原本面对面的话不就可以知道对方是谁吗,使用的手段也不需要事先认识。”萧乐说道。

“好吧,恭喜两位通过第一轮选拔。”主持人想了想说道。

“什么!第一轮!”萧乐虽然有所预感,但还是忍不住质问道。

“当然啦,我们的要求可是很高的,刚刚另一边那位明智先生和五郎先生虽然表现的也很优秀,可以参加复活赛,但还是很遗憾的被淘汰了。”主持人理所当然的说道。
萧乐揉了揉额头,不知道这所谓的选拔还要持续多久。

……

“原来是做梦吗?”揉着揉着,萧乐睁开了眼睛。

剧情完


解析:
在被监控状况下建立秘密对话的方式大概有:利用过去已有的共同秘密、知识,躲过监控建立共同秘密,利用非对称加密,利用密钥交换算法。

利用过去已有的共同秘密、知识:
这个相信是很好理解的,例如拉领口等于上天台的暗号,江湖黑话,只有两人知道的特别数字,已经约定好的加密方式,都是在被监控状态前已经获取了可以用来加解密的密钥。

躲过监控建立共同秘密:
这个就是利用监控系统的死角,甚至人为创造出死角,然后在监控不到的时候建立共同秘密,例如文中出现的留出特定视野而封杀其他方向监控的方式,或是在握手时递纸条,利用温度躲避视觉监视,都属于这类。

利用非对称加密:
这个就是利用非对称加密算法建立两把钥匙,一把公开的公钥用来加密,一把不公开的私钥用来解密。对称加密是把秘密用一把钥匙锁在箱子里,又用同一把打开箱子来查看秘密,为了把秘密锁进箱子必须把钥匙告诉对方,而如果告知方式不安全,监控者也就能得到钥匙来打开箱子,从而获取秘密。而非对称加密就好比信箱,任何人都可以通过公钥——信箱上的开口,把信件投递进去,而取出信件就只能用信箱主人的钥匙,这把钥匙不需要告诉投递方,监控者也就不能获取,要注意的只是不要投错了信箱,投进了监控者伪造的他有钥匙的信箱,这点可以用CA证书或公钥指纹等来保证。至于用公钥加密的内容能被私钥解密,并且从公钥不能推导出私钥,则由非对称加密算法,例如RSA来保证。这方面的系统和软件有很多,例如PGP,GPG,UEncrypt,有兴趣的可以去了解下。

利用密钥交换算法:
例如文中出现的迪菲-赫尔曼密钥交换就是密钥交换算法,即使交换过程被监控,监控者也不能得知交换的密钥是什么。像文中说明过的那样,通过公开约定一个公共质数p和生成元g,然后甲方选择一个随机自然数a作为不公开的私钥,并且计算出公钥A=g^a mod p告诉乙方,乙方同样选择一个随机自然数b作为不公开的私钥,并且计算出公钥B=g^b mod p告诉甲方,然后甲方计算共同秘密K=B^a mod p,乙方计算共同秘密K=A^b mod p,因为乘法交换,两个K的结果是一样的。例如约定p=23,g=5,甲方想了一个a不告诉乙方,其实a是6,甲方算出A=5^6 mod 23是8告诉乙方,乙方想了一个b不告诉甲方,其实b是15,乙方算出B=5^15 mod 23是19告诉甲方。甲方暗中计算K=19^6 mod 23是2,乙方暗中计算K=8^15 mod 23也是2,这一点在数学上被保证,于是双方都2了,而监控者不知道a和b也不知道他们的共同秘密是2。在网络安全的实际操作中为了安全性,p,a,b要足够大,g则不需要,例如p超过300位a和b超过100位则目前全人类的计算资源也不能破解。这显然不是人脑可以做到的,人脑能计算的不够安全,但在遭受现实监控,而监控者也不拥有计算资源的情况下,这依然是一个不错的建立秘密对话的侦探小技巧。在不遭受本地监控的情况下,例如对网络传输层面来说,就可以利用计算资源做到足够的安全性,而且GPG等非对称加密系统也相对更好用,但如果遭受本地监控,传输过程再安全也毫无意义,例如本机被植入木马或是现实监视,只能使用不受监控的大脑。
对于迪菲-赫尔曼密钥交换感兴趣的话可以去了解下更多内容。


本期小技巧的使用场景示例:

高大上版本:
你恰巧和另一个侦探一起追踪一个罪犯,结果追踪到后双方陷入对峙,你发现了一个能制服罪犯的秘密,但需要另一个侦探配合,并且不能被罪犯发现。但现在你们不能离开对方视线,互相之间完全透明,但是罪犯也并不能阻止你们说话或做一些事。你使用了本期的一些小技巧,成功制服了罪犯。


普通版本:
你希望在QQ等公共平台和某些人说一些不想被其他成员或特定第三方知道的秘密,例如说群主的坏话,但是你不能私聊,说的话所有人都能看到,被群主发现你就会被禁言关小黑屋。你使用了本期的一些小技巧,成功向某些人揭露了群主的真面目。


邪道版本:
好孩子不要学。
未完全侦探论坛打算举办一期版杀。
法官:“本版杀禁止所有参加者私下联系。”
秩序邪恶者:“可以,那我们就在版面上公开秘密联系吧。”
法官:“……”
秩序邪恶者:“这并不违反现有的版杀规定。”
法官:“……”


附录:
关于迪菲-赫尔曼密钥交换,月月用初学加快忘光的python写了一个模拟程序,可以用来辅助建立密钥交换,但是数字太大要注意计算资源不够会很慢,有python运行环境的可以试试,或者可以用网页在线运行试试简化版本,需要人工更改代码中的数字。

代码如下:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import os, sys
  4.                
  5. def inp(n):#输入检测
  6.         if n == p:
  7.                 try:
  8.                         int(n)
  9.                 except:
  10.                         print "请以数值输入公共质数"
  11.                         exit()
  12.         elif n == g:
  13.                 try:
  14.                         int(n)
  15.                 except:
  16.                         print "请以数值输入生成元"
  17.                         exit()
  18.         else:
  19.                 try:
  20.                         int(n)
  21.                 except:
  22.                         if n:#留空判断
  23.                                 print "请以数值输入"#此处月月偷懒了
  24.                                 exit()
  25.                         else:
  26.                                 pass
  27. p = raw_input("请输入公共质数:")#输入数值
  28. inp(p)
  29. g = raw_input("请输入生成元:")
  30. inp(g)
  31. a = raw_input("请输入甲方私钥或留空:")
  32. inp(a)
  33. if a:#留空判断,暂时只想到单独写
  34.         A = (int(g)**int(a))%int(p)#只能转成整数
  35.         print "甲方公钥为:",A
  36. else:
  37.         pass
  38. b = raw_input("请输入乙方私钥或留空:")
  39. inp(b)
  40. if b:
  41.         B = (int(g)**int(b))%int(p)
  42.         print "乙方公钥为:",B
  43. else:
  44.         pass
  45. if a and b:
  46.         A = (int(g)**int(a))%int(p)#其实可以删
  47.         B = (int(g)**int(b))%int(p)
  48.         k = ((int(B)**int(a))%int(p))
  49.         K = ((int(A)**int(b))%int(p))
  50.         if k == K:#以防万一的一致性确认
  51.                 print "key=",k
  52.         else:
  53.                 print "error",k,K

  54. else:
  55.         if a:
  56.                 A = (int(g)**int(a))%int(p)
  57.                 B = raw_input("请输入乙方公钥:")
  58.                 inp(B)
  59.                 if B:
  60.                         k = ((int(B)**int(a))%int(p))#通过公钥计算
  61.                         print "key=",k
  62.                 else:
  63.                         print "error"
  64.         else:
  65.                 if b:
  66.                         B = (int(g)**int(b))%int(p)
  67.                         A = raw_input("请输入甲方公钥:")
  68.                         inp(A)
  69.                         if A:
  70.                                 K = ((int(A)**int(b))%int(p))
  71.                                 print "key=",K
  72.                         else:
  73.                                 print "error"
  74.                 else:
  75.                         print "error"
复制代码


简化版代码:
  1. p = 23
  2. g = 5
  3. a = 6
  4. b = 15
  5. A = (int(g)**int(a))%int(p)
  6. B = (int(g)**int(b))%int(p)
  7. k = ((int(B)**int(a))%int(p))
  8. K = ((int(A)**int(b))%int(p))
  9. if k == K:
  10.         print "key=",k
  11. else:
  12.         print "error",k,K
复制代码


相关网站资源:

网页在线运行python代码:
https://c.runoob.com/compile/6

维基百科:
https://en.wikipedia.org/wiki/Diffie-Hellman_key_exchange
https://zh.wikipedia.org/wiki/迪菲-赫尔曼密钥交换

知乎:
https://www.zhihu.com/topic/20030277

基于经验的逻辑推理是一个缺乏想象力的世界,而经验素材却是推理小说合理性的标准。

6

主题

225

帖子

2

积分

侦探助理

Rank: 1

IC币
8412
威望
0 点
推理积分
0 点
推游积分
0 点
侦探阅历
1 点
魅力值
1 点
IC推侣
尘埃
QQ
发表于 2019-9-22 20:07 | 显示全部楼层
非对称加密算法什么的还是很专业啊,普通人若是不深入研究,估计也只能“不明觉厉”了哈哈哈哈。不过抛开这个专业知识,其他的还是很清晰有趣的,特别还以故事的方式展开。

76

主题

2228

帖子

128

积分

IC鹳狸猿

慕容家九姑娘森森~●u●

Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8Rank: 8

IC币
11389
威望
9 点
推理积分
28 点
推游积分
59 点
侦探阅历
14 点
魅力值
9 点
IC推侣
小若。
发表于 2019-9-22 20:53 | 显示全部楼层
这是什么神仙对话(望天)
您需要登录后才可以回帖 登录 | 加盟为IC探员

本版积分规则

关闭

活动进行时上一条 /1 下一条

QQ|小黑屋|未完全侦探推理论坛 ( 沪ICP备16051875号 )  

GMT+8, 2019-12-8 16:09

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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