应用密码学:协议、算法与C源程序(学习第二章)

第二章:协议结构模块

协议概述

协议:是一系列步骤,它包括两方或多方,设计它的目的是要完成一项任务。

密码协议:是使用密码学的协议,使用密码的目的是防止或发现窃听者和欺骗。

协议角色

重点说仲裁者(arbitrator)是在完成协议的过程中,值得信赖的公正的第三方。“公正”意味着仲裁者在协议中没有既得利益,对参与协议的任何人也没有特别的利害关系。“值得信任”表示协议中的所有人都接受这一事实,即仲裁者说的都是真实的,他做的都是正确的,并且他将完成协议中涉及他的部分。仲裁者能帮助互不信任的双方完成协议。

仲裁协议中价格比较低廉的有两种:非仲裁子协议(仅实现协议各方的需求)和仲裁子协议(有争议的时候),这时特殊的仲裁者叫裁决者

对协议的攻击:

  • 被动攻击:与协议无关的人能够窃听协议的一部分或全部。因为攻击者不可能影响协议,所有他能做的事是观察协议并试图获取消息。难于发现,所以协议应该阻止被动攻击。
  • 主动攻击:假装是其他人,在协议中引入新消息、删掉原有的消息、替换、重放旧消息、破坏通信信道、改变存储在计算机中的消息等。
  • 在攻击者是协议中的一方这种情况时,这个人叫骗子。也分为主动和被动。

使用对称密码系统通信

(1)a和b协商用同一个密码系统。
(2)a和b协商用同一个密钥。
(3)a用加密算法和选取的密钥加密她的明文消息,得到了密文消息。
(4)a发送密文消息给b。
(5)b用同样的算法和密钥解密密文,读取信息。

好的密码系统的全部安全性只与密钥有关,与算法没有任何关系。

单向函数

单向函数计算起来相对容易,但求逆却非常困难。比如,打碎盘子很容易,但让盘子恢复却很难。但单向函数不能用于加密。
陷门单向函数是特殊的单向函数,它有一个秘密,如果知道这个秘密,将会容易求逆,如果不知道就难于计算。就像很复杂的积木,如果没有图纸,很难拼回原来的样子。

单向散列函数

也叫压缩函数、收缩函数、消息摘要、指纹、密码校验和、信息完整性检验(MIC)、操作检验码(MDC)。现代密码学的中心

散列函数就是把可变长度输入串(预映射)转换成固定长度输出串(散列值)的一种函数。(简单的散列函数就是对预映射的处理,并且返回由所有输入字节异或组成的字节)

这里我需要先去学一下散列函数的基础知识才能了解书上说的东西。现在的了解就是散列函数就是哈希函数,打算先学一下哈希函数,再学单向的。

散列函数

  • 散列值的概念:散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。
  • 若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个事先建立的表为散列表
  • 对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称碰撞。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“”作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。
  • 若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个“随机的地址”,从而减少冲突。

性质: 所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。这个特性是散列函数具有确定性的结果。但另一方面,散列函数的输入和输出不是一一对应的,如果两个散列值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。

  • 典型的散列函数都有无限定义域,比如任意长度的字节字符串,和有限的值域,比如固定长度的比特串。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的一一对应。一一对应的散列函数也称为排列。可逆性可以通过使用一系列的对于输入值的可逆“混合”运算而得到。

常用HASH函数
散列函数能使对一个数据序列的访问过程更加迅速有效,通过散列函数, 数据元素将被更快地定位。常用Hash函数有:

  1. 直接寻址法。取关键字或关键字的某个线性函数值为散列地址。即H(key)=key或H(key) = a·key + b,其中a和b为常数(这种散列函数叫做自身函数)
  2. 数字分析法。分析一组数据,比如一组员工的出生年月日,这时我们发现出生年月日的前几位数字大体相同,这样的话,出现冲突的几率就会很大,但是我们发现年月日的后几位表示月份和具体日期的数字差别很大,如果用后面的数字来构成散列地址,则冲突的几率会明显降低。因此数字分析法就是找出数字的规律,尽可能利用这些数据来构造冲突几率较低的散列地址。
  3. 平方取中法。取关键字平方后的中间几位作为散列地址。
  4. 折叠法。将关键字分割成位数相同的几部分,最后一部分位数可以不同,然后取这几部分的叠加和(去除进位)作为散列地址。
  5. 随机数法。选择一随机函数,取关键字作为随机函数的种子生成随机值作为散列地址,通常用于关键字长度不同的场合。
  6. 除留余数法。取关键字被某个不大于 散列表表长m的数p除后所得的余数为散列地址。即 H(key) = key MOD p,p<=m。不仅可以对关键字直接取模,也可在折叠、平方取中等运算之后取模。对p的选择很重要,一般取素数或m,若p选的不好,容易产生碰撞。

重点掌握MD5码。

使用公开密钥密码系统通信

解决了对称密钥密码体系的一些问题。简单来说,每个网民有自己的公钥和私钥,当a给b发消息时,知道知道b的公钥,就可以通过b的公钥加密要发送的消息,之后发给b,b再用自己的私钥解密就可以了,全程a只需要知道b的公钥,不需要a和b用一个密钥来加解密。

在现实世界中,公开密钥比对称密钥慢很多,所以不会取代对称密钥的位置,而是用公开密钥来加密密钥(这样叫混合密码系统)。而且公开加密密钥就会导致在明文是可能明文文集中的一个的时候,可以通过加密所有可选择明文,再与密文对比,这样公开密钥密码系统对选择明文攻击是脆弱的。

数字签名

  1. 使用对称密码系统和仲裁者对文件签名。优点是可信、不可伪造、不可重新使用、文件不能改变、不能抵赖。缺点是仲裁者在其中做了大量重复且易错的工作,他必须保证自己的可信和安全,他太难了。所以这种协议只在理论上可行。
  2. 数字签名树。
  3. 使用公开密钥系统对文件签名。有几种公开密钥算法能用作数字签名。如RSA,公开密钥或私人密钥都可以用做加密,用你的私人密钥加密文件,你就拥有安全的数字签名。这里描述一下基本协议
    1. A用她的私人密钥对文件加密,从而对文件签名。
    2. A将签名的文件传给B。
    3. B用A的公开密钥解密文件,从而验证签名。

这个签名不需要仲裁者去签名和验证。但要注意数字签名数字签名经常包括时间标记。对日期和时间的签名附在消息中,并与消息中的其他部分一起签名。

在实际实现过程中,采用公开密钥算法对长文件签名效率太低。所以一般都不对整个文件签名,只对文件的散列值签名。这个协议中,单向散列函数和数字签名算法是事先协商好的。

  • 采用单向散列函数,很容易实现多重签名(多个人对一个数字文件签名)。

还阅读了抗抵赖的方法,以及数字签名的应用,早期是用在对禁止核试验条约的验证。

  • 带加密的数字签名就像一封信。加密前签名是一种谨慎的习惯做法。

  • 如果一个算法既用作加密又用作数字签名,就有可能受到攻击。可以使用时间标记每次操作使用不同的密钥加密和数字签名操作不同使用单向散列函数的数字签名。这样就有四种方法可以防止重新发送消息作为收据的问题发生。

  • 得到另一个人的公开密钥将在3.1提及,目前是2.7.3,讲的是有一个密钥鉴定机关(KCA)或密钥分配中心(KDC),是一个数据库,存储很多人的公开密钥,一个值得信赖的仲裁者写入数据。为了防止坏人在数据传送期间用另外的公钥来替代别人的公钥而存在。为了防止这个问题,仲裁者可以用自己的私钥对每个公钥签名。

  • 随机和伪随机序列的产生:计算机做不到真正的随机(目前。

  • 伪随机序列:最好的计算机能产生伪随机序列发生器。但密码学对于随机性比较挑剔。

密码学意义上安全的伪随机序列还必须具有以下性质:

它不可预测。即使给出产生序列的算法或硬件和所有以前产生的位序列的全部知识,也不可能通过计算来预测下一个随机位是什么。

真正的随机:

  1. 它不能重复产生。如果用完全同样的输入对序列发生器操作两次(至少与人所能做到的最精确的一样),你将得到两个不相关的随机序列。
    不知道是书上写错了的问题还是什么,说有三点性质,这里只有一点啊,我只能看到一点。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>