这是密码学的老本行。
这个问题用密码学的方式表达就是:“在不透露关于A的任何信息的前提下,让人能识别出A;然后采取措施(比如‘不传播’)”。
这个东西在计算机上应用极为广泛。
比如说,你的计算机似乎应该存有你的密码,这样下次你登录时,它才知道你的密码是正确的,对吧?
但如果你的密码在计算机某处储存着的话,那么得到你的计算机的人显然就有可能把它找出来。藏再好也没用。
因此,正确设计的计算机系统是不允许保存密码的(千万别像CSDN那样外行!)——甚至连加密后存起来都不允许:毕竟鸡生蛋蛋生鸡,解密这个密码的密码你打算存到哪?
怎么办呢?
其实说破了也很简单:猜谜。
比如:一字九横六直,天下文人不知。子路问于孔子,孔子想了三日。
你看,这个谜语并没有提谜底是哪个字;但我们都知道这个字是“晶”。
当然,这个谜语太浅,或者说它的设计目的就是让人猜到;而我们需要一个更隐秘、让人不可能猜到也不可能冒充的。
比如,上面那个字谜的笔画数列出来是1 6 2 15 4……,我们可求出这列数字的积、然后截取其中16个数字存于硬盘。那么当有人声称自己知道密码时,我们就可以要求来人给出自己的密码——如果他给出的那句话的笔画数经过同样的计算处理后、能和硬盘上存的数字相等,我们就可以相信他的确知道密码了。
当然,在这个原理性演示里,虽然人力寻找已经不太可能;但我们只要利用程序凑一凑,还是很容易就能凑出一句满足要求的“密码”(术语叫碰撞),从而蒙混过关;而业界使用的算法是由数学家提出、并经过大量专业人士挑战验证的,不会像这个原理性演示一样粗糙。
换句话说,我们需要的“数字摘要算法”必须满足“只能由信息A计算得到、没有办法找到碰撞信息、也不可能由数字指纹本身反向推断出信息A”的苛刻条件才够用。
比如,过去使用的标准数字摘要算法是MD5;而这个算法已经被我国数学家王小云找出了漏洞,可以较为容易的构造出碰撞数据,因此已经不再安全。现在业界已经着手更换更好的算法了。
数字摘要算法是信息安全的基础。
我们现在搞的用户登录乃至互联网认证、交易、银行、签名(防篡改、防抵赖)等等,全都需要依靠这个东西(以及各种加解密算法)才能成为现实;你的银行U盾也是基于相关原理,才完成了保护你的资金安全的重任。
总之,通过这种“数字摘要算法”,我们就可以只传输和存储“信息A的数字摘要”,然后就可以在不知道关于A的其它任何信息的前提下准确识别A与非A。
更进一步的,我们甚至可以利用数字摘要,在双方都不透露关于A的信息前提下,确认我们的确都知道A——你每天都会用到的“扫码付款”就是基于这个原理实现的。
具体做法是:把你的密码的数字摘要拼上当前时间(精确到分)再计算一次数字摘要,然后把算出来的数字摘要转换成条码或者二维码;当服务器收到交易信息时,它也用自己存储的、你的密码的数字摘要拼上当前时间算一算数字摘要,当两个数字摘要相同时,就说明你和服务器的确都知道你的密钥。
你可能注意到,这个计算还会“拼上当前时间(精确到分)”。这就是你的付款码每分钟自动失效背后的原理——这个细节使得哪怕有人拍下了你的付款码,他也只有不到一分钟的作案时间(于是我们马上就会收到提示信息),稍一耽误这个付款码就永久失效了。
当然,具体实现上“扫码付款”还有很多很多的细节。比如如果用“你的密码的数字摘要”生成付款码,那么这个数字摘要就不能保存在手机里了,不然手机丢了就可能被人搞出来。因此这里可能需要特殊的加密硬件支持,这个硬件本身就可以做出相关的摘要计算/验证等工作、从而可以从物理上阻止对芯片存储内容的读取操作;或者,不使用这种硬件的话,就需要用强加密算法加密你的数字证书,确保没人能破解;然后在你支付时输入密码临时解密证书、完成计算,之后要马上清除内存中的明文信息;又或者通过和服务器的频繁交互每天甚至每小时更新验证凭据,之后利用这个临时的验证凭据而不是“密码的数字摘要”完成计算(熟悉这个领域的大概已经闻到了OAuth的味道)。总之每个环节都有很多细节需要注意。
此题目发布时问的是“如何在不传播信息不A的条件下传播‘不传播信息A’这个信息”,
而不是常见的“如何在不传播信息A的条件下传播以下略”。
可以传播“你有相信信息A的权利,也有不相信信息A的权利。只能在指定场所传播信息A”。
那之后你可以不指定场所。
例如:
你可以在法律里规定人们有宗教信仰自由,同时任何组织和个人不得强制人们信仰或不信仰宗教,不得歧视信仰或不信仰宗教的人,只能在指定的宗教场所传教。
然后你可以不指定宗教场所。
在这种情况下,你并没有传播“宗教不可信”或“世上没有神”,但你传播了“不要传播宗教可信”或“不要传播世上有神”。
对个人来说,你可以在你管理的论坛之类场所使用同样的方法。
倒退回“不传播信息A”就没什么意思了。