非对称算法,散列(Hash)以及证书的那些事

转载请注明出处

http://blog.csdn.net/pony_maggie/article/details/35389657

作者:小马

这几个概念在金融电子支付领域用得比较多,我忽然觉得把它们串起来一起讲,层层引入,可能更好理解一些。希望能以最简单朴实的方式讲明白他们之间的关系。

一非对称算法

关于非对称算法,你只要知道下面这些就行了,密钥是一对,一个叫公钥,一个叫私钥,前者公开,后者保密。假设你有一对公私钥,给你一串数据,你可以用私钥加密,然后把密文和公钥都放出去,别人可以用这个公钥解密。同样反过来,别人也可以用这个公钥加密一串数据,你用对应的私钥解密。可以用下图来表示:

二 散列

散列也叫哈希,学过数据结构的人对这个概念都不陌生。简单来讲,给你一串数据A,这个数据可以很长,你通过一个算法把它们转变成一个很短的固定长度(不管源串有多长)的另一串数据B。这个过程就叫散列,数据B叫数据A的散列值(或者叫哈希值,或者叫摘要)。

再深入一些。大部分情况下,A和B是一一对应的(这也是我们希望的),也就是说,如果我还有个A1,那么它的散列值B1和B不会相等。但是理想丰满,现实让人反感,B1有可能和B相等。这种现象有个学名叫”碰撞”,增加散列值的位数是防碰撞的一个方法,因为很自然位数越长,完全相同的概率就越小。目前认为超过128位的散列值都能很好的防碰撞。后面我们讲到签名时,假定是没有碰撞的。

最后再补充一点,散列具有不可逆性,也就是你没法从B还原回A,即使散列算法是公开的。

三数字签名

生活中我们用签名代表自己的身份,比如领导签署一个文件,大家看到这个签名,就确认是这个领导签的,就代表他本人。签名只占用很小的信息(一般是两个字或三个字,日本人的可能长一些),却能表示你整个人的信息,这种思想确实意义很大,我们把它用在电子化的签名过程,也就是数字签名。

数字签名的过程是这样的,比如小明有一串数据A要发给小红,小明先用散列生成一个A的摘要B,然后把B用一个私钥加密后附在A的后面发给小红,小红有公钥(因为是公开的),她先用这个公钥解密A后面的数据得到B,然后自己把A散列一些算出一个B1, 比较B1和B如果相等,首先能说明数据是小明发过来的,因为只有小明才有私钥,其次能说明A在传输过程中没有被改过,因为如果修改过,散列值肯定不相等。上述过程可以用下图说明:

可能有有会有问题,数据A似乎没有加密?,确实是这样,因为这个不是小红所关心的,小红只关心这个数据是不是小明发的,数据的内容没那么重要。其实也不难理解,就跟你去超市刷卡购物一样,小票需要你签字作为对账的凭证,人们只关心这个签名是不是你本人的,对于小票的内容没这么关心。

四证书

仔细想想上面的验证签名的过程,似乎天衣无缝。但其实有个问题,小红的公钥是哪来的?有人说这个不是公开的吗,随便哪都可以,可以是问别人要的,可以是网上找的。其实不然,验签的前提,是小红已经假设她手上的公钥和小明的私钥是一对的。如果小王生成一对非法的公私钥对,然后给小红公钥,给她说这是小明的,就会产生问题了。所以小红要有明确的途径确认她的公钥是合法的。

打个比方,一个人站在你面前,你没法判断他是好人还是坏人,但是如果法院告诉你这个人是杀人犯,你肯定会选择相信,因为法院是权威机构。同样的,对于公钥这样的”公开的敏感信息”,也需要一个权威机构来认定。这个机构叫CA(certification authority)。这样小红只要是从CA拿的公钥,就可以认为它是合法的了。

CA一般不会直接下发公钥,它通常把公钥信息和一些附加信息(比如公钥产生的日期,有效期等)一起按照一定的格式组织起来下发,这种组织起来的数据就叫做证书。证书的作用就是它有一定的格式,这个格式还是个标准,全世界都用它,这样就很方便传播。目前用得比较多的证书就是著名的x.509。

非对称算法,散列(Hash)以及证书的那些事,布布扣,bubuko.com

时间: 2024-11-18 15:24:06

非对称算法,散列(Hash)以及证书的那些事的相关文章

算法----散列

/* * 算法--散列 * 散列表是基于数组进行设计的.数组的长度是预先设定的 * 所有元素根据和该元素对应的键,保存在数组的特定位置,该键和我们前面讲到的字典中的键是类似的概念 * 使用散列表存储数据时,通过一个散列函数将键映射为一个数字,这个数字的范围是 0 到散列表的长度. * * 这里所说的键 应该就是数组的索引 只不过 数组既然长度确定了,那么索引的个数也是确定了 * 每个元素是无限的,每个元素的键值映射出来的索引也许就会发生重复或说碰撞. 这个叫有效碰撞. * * 键值映射到数组的索

个人理解c#对称加密 非对称加密 散列算法的应用场景

c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 .a程序要给B程序发送数据 但是为了防止明文发送 数据被窃取.那么我就定了一个协议传输的数据的byte字节都统一+1  而接收数据的情况下将Byte字节统一-1 然后就能获得正确的 数据(当然这个是一个简单的加密) ,真正应用的加密肯定比这个复杂很多 非对称加密 传输数据的双方有各自的公钥和私钥  

散列(hash)

散列(hash)是常用的算法思想之一,在很多程序中都会有意无意地使用到. 先来看一个简单的问题:给出N个正整数,再给出M个正整数,问这M个数中每个数分别是否在N个数中出现过. 例如N=5,M=3,N个正整数{8,3,7,6,2},欲查询的M个正整数为{7,4,2},于是后者只有7和2在N个正整数中出现过, 而4是没有出现过的. 对于这个问题,最直观的思路是:对每个欲查询的正整数x,遍历所有的N个数,看是否有一个数与x相等.这种 做法的时间复杂度为O(MN),当N和M都很大时,时间复杂度显然太大!

JavaScript数据结构与算法-散列练习

散列的实现 // 散列类 - 线性探测法 function HashTable () { this.table = new Array(137); this.values = []; this.simpleHash = simpleHash; this.betterHash = betterHash; this.showDistro = showDistro; this.put = put; this.get = get; } function put (key, data) { let pos

数据结构与算法----散列/哈希

1. 简介 散列表的实现叫散列hashing,散列用于以常数平均时间执行 插入.删除.查找,不支持排序.findMin.findMax. 查找关键字不需要 比较 在一个记录的存储位置和它的关键字之间建立映射关系:key--f(key)   这个关系就是散列函数/哈希函数.将一些记录存储在一块 连续 的存储空间,这块空间就是散列表/哈希表. 与线性表.树.图比较: 数据元素之间没有什么逻辑关系,也不能用连线图表示出来. 问题: 关键字不同,但通过散列函数计算的结果相同,即出现了冲突 collisi

Redis常用命令(一) 字符串键、散列键

redis是key-value的数据结构,每条数据都是一个键值对 键的类型是字符串,因为默认是字符串所以都不用加引号 注意:键不能重复 值的类型分为五种: 字符串string 散列hash 列表list 集合set 有序集合zset string字符串键 set key value  # 设置的键不存在则为添加,如果设置的键已经存在则修改 set name daiby set key value [NX|XX]  # NX: 如果key不存在则成功,反之失败(不覆盖旧值)! XX: 如果key存

《数据库系统概念》14-静态散列

顺序文件组织的缺点之一是必须通过访问索引或使用二分法搜索来定位数据,这需要较多的I/O操作.基于散列技术的文件组织方式则不需要访问索引结构,散列也提供了一种组织索引的方式.在散列(hash)技术中,用桶(bucket)来表示能存储一条或多条记录的存储单元.如果K代表所有搜索码的集合,B代表所有bucket的集合,则散列函数h表示一个从K到B的映射函数.插入搜索码为Ki的记录时,通过散列函数计算h(Ki)得出bucket的地址,如果这个bucket还有空间,就将数据插入.查询Ki时,也是先通过h(

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4. 鲍勃收信后,用私钥解密,看到信件内容. 5. 鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest). 6. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature). 7. 鲍勃将这个签名,附在信件下面,一起发给苏珊. 8. 苏珊收信后,取下数

【Java-加密算法】对称加密、非对称加密、单向散列

一提到加密,就会联想到数字签名,这两个经常被混淆的概念到底是什么呢? 加密:加密是一种以密码方式发送信息的方法.只有拥有正确密钥的人才能解开这个信息的密码.对于其他人来说,这个信息看起来就像是一系列随机的字母.数字和符号.如果你要发送不应该让其他人看的敏感信息时,加密是特别重要的. 数字签名:数字签名是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证. 加密与数字签名的区别 加密同数字签名