RSA的傻瓜原理
2015-10-28 15:46
232 查看
设想一下,这种场景,你处在一个狭小的房间里,房间之中有一共有三个人,你是其中一个,你们之间被玻璃隔开,两两对视,现在给另外两个人起个名字叫小红、小明。你和他们通讯只能用写字板来展示给对方(简单起见,只能写数字),也就是说每个人在写字板上所写的信息,另外两个人都会完完全全的看到,这是前提。
现在问题来了:如果你有些话只想写给小红,而不想让小明知道,可不可能?
这个问题看起来是不可能的!因为你所写的每一个字都他们都可以看到,但是现在有一个办法,可以完成貌似完不成的任务,办法如下:
但是!这个方法有很大的局限性,比如说小红跟你之前不认识呢?既然不认识,你们之间压根就没有什么别人不知道的约定,你再想传给小红就“密文”,她就看不懂了,你看,事情没那么简单了吧?当然你也可以再次和小红在小屋里通过写字板商量另一个约定,但是你们商量的任何约定,小明也会同样看到,现在你就陷入了一个窘迫的处境,你无法完成和小红的单独对话了!但是,神奇的是,你仍然有办法实现与小红的单独对话,神奇的办法如下,强烈建议读者到此自己想一想有何办法,再往下看:
以上提供一个看起来很巧妙的方法来解决这种场景下的加密通话方案,但别高兴太早,这要放在现实中,还好理解,可是我们是在用计算机,谁家的计算机可以传送大铁锁啊!所以,还是得想个办法,让计算机间接实现这种方法,以便我们和小红可以愉快的通话啊(--小明:为什么要针对我!!),下面就引入计算机中的"锁"和"钥匙"——算法,(--啥算法? --不知道么?自己先想想怎么做!反正是算法。)
现在问题来了:如果你有些话只想写给小红,而不想让小明知道,可不可能?
这个问题看起来是不可能的!因为你所写的每一个字都他们都可以看到,但是现在有一个办法,可以完成貌似完不成的任务,办法如下:
首先,你和小红之前认识,接触过,你们俩之间有一个别人不知道的的约定,当我想给小红写一串数字的时候,我自己先在草稿纸上写一遍,然后每个数字都加上4,构成“密文”,再把密文传给小红。比如我想给小红传“123”,那我就先在草稿纸上写上“123”,然后把每一位数字加4,就变成“567”,然后我就把567发给小红,小红收到后,再把每一位数字减去4,就会得出我想要给她发的真实信息,这样,即使别人偷窥到了我们之间传输的“567”,也不会明白什么意思。回到小屋里来,虽然我写给小红的信息,小明也会看到,但是我对我所写的信息进行了“加密”,而且只有小红会“解密”,这样,我就完成了和小红之间的单独对话,很巧妙,不是么?
但是!这个方法有很大的局限性,比如说小红跟你之前不认识呢?既然不认识,你们之间压根就没有什么别人不知道的约定,你再想传给小红就“密文”,她就看不懂了,你看,事情没那么简单了吧?当然你也可以再次和小红在小屋里通过写字板商量另一个约定,但是你们商量的任何约定,小明也会同样看到,现在你就陷入了一个窘迫的处境,你无法完成和小红的单独对话了!但是,神奇的是,你仍然有办法实现与小红的单独对话,神奇的办法如下,强烈建议读者到此自己想一想有何办法,再往下看:
首先,先给大家介绍一样东西——锁!明白了吧?(什么?不明白?那就继续往下看)。我现在有一把锁和钥匙,我把自己的锁发送出去,这样小明和小红都能收到,然后我让小红自己规定一下我们之间的加密协议,写在纸上,用锁锁起来,再给我发出来,虽然小红发出的加锁的信息小明同样能收到,但是小明没有锁的钥匙,就算得到小红的信息,也无法打开锁偷看小红的真实信息,但是我收到后我有钥匙啊,我就能打开,查看小红的加密规则,然后,我就可以光明正大的和小红的用我们的加密规则进行通信,小明只能咬牙切齿干瞪眼了~0~,但是我们之前说只能通过屏幕传递信息,通过锁算是作弊,所以此法还是不通(小明暗喜)。可是还是有方法...
以上提供一个看起来很巧妙的方法来解决这种场景下的加密通话方案,但别高兴太早,这要放在现实中,还好理解,可是我们是在用计算机,谁家的计算机可以传送大铁锁啊!所以,还是得想个办法,让计算机间接实现这种方法,以便我们和小红可以愉快的通话啊(--小明:为什么要针对我!!),下面就引入计算机中的"锁"和"钥匙"——算法,(--啥算法? --不知道么?自己先想想怎么做!反正是算法。)
18世纪,有个牛(bian)人(tai),叫欧拉,发现了一个定理,名叫欧拉定理(是不是很熟悉?没错,你们在高数中有过邂逅),而我们今天说的算法,就是以它为核心(看,就算是欧兄去了天堂,但他的研究依然造福几百年后的人们,可见之伟大啊)。
相关文章推荐
- C#3.0新特性之扩展方法介绍
- BZOJ 1853 [Scoi2010]幸运数字 (容斥原理)
- Win7上安装32位Oracle客户端错误解决方法:[INS-30131] 执行安装程序验证所需的初始设置失败
- Android小记:EditText的两个常用属性
- leetcode 260 : Single Number III
- Python的表达式与运算符19
- android或 java内存泄漏需要注意的地方
- 部署LyncServer2013之二 扩展架构
- canvas绘图基础
- 百度地图查询两地里程
- Result Maps collection already contains value for com.acmed.ecg.common.dao.WorkloadMapper.ReportResu
- yii CActiveForm CHtml组件使用总结
- 向mysql数据库中写入中文,报错问题解决
- swift开发记录 - DEBUG关键字及自定义日志输出
- 动态内存分配
- python基础练习2
- [傅里叶变换及其应用学习笔记] 二. 周期性,三角函数表示复杂函数
- 为数据库表和列取好名字(转)
- Jquery 禁止客户端缓存
- window下memcached安装步骤及使用