如果你的朋友给你发送了一封邮件,老朋友多日未见说了些寒暄的话,最后你的朋友又来了一句,今天晚上六点我请你到北京饭店吃饭吧,怎么样?你可能对这句话比较怀疑,这小子今天头脑是不是有问题?在看看这封邮件的地址,还真是他的邮件地址,但认识这小子很多年了,从来没请我吃过饭。今天???一连串的问号在你的头脑中。如果你对这样的问题比较感兴趣,那么让我帮你慢慢的解开谜底吧?
    实际上产生这样的问题,原因很简单,你朋友发的邮件信息是很容易被人窃取到的,窃取人窃取到邮件信息后做适当的修改,然后再发送给你。你看到的邮件实际上已经是被其他人修改过的邮件了,他可能只是给了你一个小的恶作剧而已,更大的问题可能在你的生活中就会遇到了。如果是这样的话,那么不是太可怕了吗?其实解决这样的问题也不难,请跟我看消息摘要是如何解决以上问题的?
一、消息摘要
  我们可以将我们要发送的消息,通过某种数学上的安全散列算法计算出一个值(这个值后面我们就称之为消息摘要)。消息摘要我们可以把它比喻成指纹,指纹大家都知道每个人都不一样,甚至一个人的不同手指也不一样。这就是说只要我们的消息不同,那么通过这种安全散列算法计算出的消息摘要肯定是不同的,相同的概率是非常低的,到底有多低呢?根据James Walsh的叙述,一个人死于雷击的概率为三万分之一,现在你选出9个人,比如你非常讨厌的9个人,你和这9个人同时死于雷击的概率,你想想有多低,所以你忽略不计吧。姑且认为是不太可能重复的(当然,有可能有10个人是同时死于雷击的,但这10个人不会都是你非常讨厌的人吧    )。
    MD5和SHA1都是常见的安全散列算法,当然我们不必关心这些算法的具体细节,我们只需要知道他们要解决什么问题就可以了。最好不要再去使用MD5算法,因为这个算法已经在2004年被山东大学王小云教授破解。
    知道了消息摘要是什么,那么我们到底怎么解决如上问题呢?我们来看,如果将你朋友要发给你的消息我们称之为A,通过安全散列算法计算出的消息摘要我们称之为AS,然后你的朋友将A和AS一起发送给你。如果窃取者窃取了信息A,然后将其改为B,再发送给你。这时你接收到的肯定是消息B,之后你计算B的消息摘要我们称之为BS,现在BS和AS的值肯定不一样,所以你就会知道了,这个消息B一定是被修改过的消息,已经非原版了。
    消息摘要看似很简单就解决了问题,但是你要小心了,如果窃取者在窃取到了消息A后,将其改为B,如果他还是将消息摘要AS发送给你的话,那么这个窃取者就是个十足的笨蛋,他的水平充其量也就是孙老师这样的水平。他完全可以再重新计算B的消息摘要,这时我们称之为BS,然后将B和BS发送给你。当你收到消息B后,你再计算B的消息摘要,那肯定是BS,那你就可以相信这个消息了吗?很明显,非也。那么我们究竟该怎么办呢?答案是借助数字签名。
二、数字签名
    刚刚我们已经知道了如果消息改变了,那么改变后的消息与原消息的消息摘要一定是不同的。我们将消息和消息摘要分别传送,如果消息摘要没有被截获那么我们还是可以知道消息是否被更改了,但是如果消息和消息摘要都被截获的话,那么我们也不会知道消息是否被篡改了。下面我们看一下数字签名如何解决这个问题。
    为了了解数字签名的工作原理,我们有必要先了解一下公共密钥加密技术。公共密钥加密技术是基于公共密钥和私有密钥这两个概念的。它的设计思想是你可以将公共密钥告诉世界上的任何人,但是只有你才拥有私有密钥,最重要的是你一定要保护好你的私有密钥,不要将它告诉任何人。公共密钥和私有密钥是有数学关系的,那你可能会担心,很多人都知道我的公共密钥,他们根据公钥密钥会不会推断出我的私有密钥呢?你的担心是有道理的,但是你大可放心,几乎是不可能的?这似乎令人难以相信,但直至今日,还没有人能够找到一种能够通过公共密钥来推断私有密钥的方法。所以在目前看来这种技术是绝对安全的,应该完全去信任它。那么我们怎么去使用这两个密钥呢?非常简单,如果消息用公共密钥去加密,那么只能通过私有密钥去解密。如果消息用私有密钥去加密,那么只能通过公有密钥去解密。看起来非常简单,的确它就是这么简单。基于这两句话,公共密钥加密技术有两个非常有用的应用:
1、数据加密
    如果某人给你发送数据,他用你的公共密钥加密数据,那么这个数据就只有你能够看得懂,因为只有你才拥有私有密钥。其他人根本无法解密数据。
2、数据认证
    如果你用私有密钥加密一个数据,那么任何持有你公有密钥的人都可以解密数据,当然这个时候并不是为了保密数据,而是为了证明这个数据是不是你发送的。你想想看,如果某人用你的公共密钥解开了数据,他就会知道这个数据一定是你发送的,因为通过其他人的公共密钥是不可能解开数据的。
    通过上面的介绍你应该知道了公共密钥加密技术的用途了,那么怎么产生公共密钥和私有密钥呢?有很多的算法,其中比较有名的是RSA和DSA。
    好了,现在我们就可以通过使用公共密钥加密技术的数字签名来彻底解决上面的问题了,我们还是用刚才的字母来举例:
1) 你的朋友通过某种软件产生一对密钥(公共密钥和私有密钥)。
2)然后你的朋友和你联系,将他的公共密钥告诉你和其他的人。
3)通过产生的私有密钥对A加密,产生加密数据,这个加密的数据我们就称之为数字签名,我们用AS表示。
4)你的朋友将A和AS发送给你,如果发送过程中被窃取了,窃取者将A改为了  B,现在戏剧性的事情发生了,我们来看看这个窃取者怎么伪造数字签名?数字签名是用私有密钥来加密数据产生的,这个窃取者根本就没有你朋友的私有密钥,因为私有密钥没有在网络上传送。如果窃取者也通过一个软件产生了一对密钥,然后用他的私有密钥对B加密产生了新的签名BS,然后他将B和BS一起发送给你。
5)这时我们就能够完全判断出这个数据的真伪了。怎么办?很简单,我们用你朋友的公共密钥去解密数据?结果呢?不能解密?因为这个数据是用窃取者的私有密钥加密的,要解密当然得使用窃取者的公共密钥了。
6)如果A和AS没有被窃取,那么你用你朋友的公共密钥解密,应该是能够顺利解密的,如果不能解密,那么数据肯定是已经被修改了。
 
  通过上面的说明大家应该知道,要想安全的传输数据,其实也并不是什么难的事情,所以我们应该大胆的去使用数字签名。
  基于数字签名的应用还有很多,各种网上银行使用的数字证书,国家出台的电子签名等等。如果有机会后面给大家介绍。
    感谢大家的支持,欢迎您留下宝贵的意见。

转载于:https://www.cnblogs.com/prairial/archive/2009/01/22/1379867.html

转 公有密匙 私有密匙相关推荐

  1. 一文读懂公有链、私有链、联盟链

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链中公有链.私有链.联盟链都是区块链技术的一个细分,而技术仅仅是一种工具,怎么在不同的场景应用好不同的工具才是技术进 ...

  2. CA系统的同密及多密技术

    CA系统的同密及多密技术 目前,全球在数字电视的CA(Conditional Access:条件接收)技术方面,流行着两大标准,即美国的ATSC(Advanced Television Systems ...

  3. python 类 公有属性、私有属性、公有方法、私有方法

    python 类 公有属性.私有属性.公有方法.私有方法 #!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Int ...

  4. 第174天:面向对象——公有属性、私有属性和静态属性

    一.公有属性和私有属性 1 //对象构造函数 2 //私有属性好处: 安全 就类似闭包中的函数一样 减少污染 3 function Person(name){ 4 //私有属性,只能在对象构造函数内部 ...

  5. 类属性、类方法;私有属性、公有属性;私有方法、公有方法;静态属性、静态方法;python的命名规范__xx__\__xx\_xx(自用笔记)

    Ⅰ.类属性.类方法(类和实例都能调用类属性和类方法) 类是一个特殊的对象,Python 中 一切皆对象:class AAA: #定义的类属于 类对象obj1 = AAA() #属于 实例对象 除了封装 ...

  6. 为什么说一次一密加是密抗窃听无条件安全的?

    为什么说一次一密加是密抗窃听无条件安全的? 一次一密乱码本是一个大的不重复的真随机密钥字母集,这个密钥字母集被写在几张纸上,并一起粘成一个乱码本.发方用乱码 本中的每一密钥字母准确地加密一个明文字符. ...

  7. Oracle 原理: 公有同义词 和 私有同义词

    同义词是现有对象的一个别名,和 C++ 里面的typedef关键字很像.同义词都能简化SQL语句,隐藏对象的名称和所有者,也可以提供对对象的公共访问. 在Oracle中,同义词分为公有同义词和私有同义 ...

  8. 公有链、私有链、联盟链、许可链,这些区块链又分别代表着什么意思?

    想知道更多区块链技术知识,请百度[链客区块链技术问答社区] 链客,有问必答!不同的区块链,有着不同的内涵和功能.在区块链领域经常出现的公有链.私有链.联盟链.许可链,这些区块链又分别代表着什么意思?1 ...

  9. exchange2013 OWA界面使用公有计算机或私有计算机选项

    Exchange 2013 OWA界面相比exchange 2010发生的很大的变化,对很多使用exchange 2010 OWA的用户来说,有一些不太习惯.所以用户希望能在exchange 2013 ...

最新文章

  1. 在纸上写好一个c语言程序后,上机运行的基本步骤为,c基本概念(选择题).docx
  2. “大数据系统软件国家工程实验室”建设项目通过验收
  3. 详细介绍Java和C++区别
  4. JavasScript基数排序
  5. linux 怎么把^M去掉
  6. NAT-PT (Network Address Translation-Protocol)网络地址转换协议转换
  7. 关于mac下连接mysql和mysql workbench连接mysql的异常
  8. Linux下部署wowza流媒体HA文档
  9. 远程控制设置 串口服务器,TCP232串口服务器连接远程控制电脑设置方法
  10. 常见服务的默认端口_wuli大世界_新浪博客
  11. 小学计算机教学笔记,信息技术在小学数学教学的运用
  12. Java实现QQ邮件群发功能
  13. 财务共享中心计件需求
  14. MyEclipse导入项目后报Unknown Faceted Project Problem (Java Version Mismatch)的解决方法
  15. 需求评审会如何做才不会沦为形式主义
  16. 关于PCB的机械层和差分布线、RC滤波
  17. 基于stm32单片机的模拟IIC时序(附源码)
  18. 【Android控件属性记录】
  19. 分享24个网页游戏源代码,总有一个是你想要的
  20. 开创性的区块链操作系统项目——去中心化的战舰游戏

热门文章

  1. Apache RocketMQ 荣获 2021 中国开源云联盟优秀开源项目
  2. 轻松搭建基于 Serverless 的 ThinkPHP 应用
  3. 给 K8s API “做减法”:阿里巴巴云原生应用管理的挑战和实践
  4. 阿里巴巴的云原生应用开源探索与实践
  5. 云原生生态周报 Vol. 13 | Forrester 发布企业级容器平台报告
  6. python关键字as_python 之 import、from、as 关键字的 白话 解释与例子
  7. php和java整合开发实战_PHP和Java强强联合 PHP与Java集成开发详解
  8. linux odbc 数据源测试,linux操作系统配置ODBC数据源
  9. java枚举类是什么_Java学习--常用类(2)、Math类、枚举类
  10. QQ协议分析及其还原(二)