网络安全 与 加密算法 (5)

其实生成一个大素数非常简单,最直观的方法就是随机搜索,例如要生成一个100位的大素数,我们先随机生成一个数字序列,然后用Miller-Rabin素性测试对其进行测试即可,如果不是素数的话再随机生成一个,如此循环下去~

当然我们可以采用随机搜索法(每次生成一个完全不一样的随机数),也可以采用随机递增搜索法(生成一个随机数之后,每次对其加2)

生成一个n位十进制大素数的步骤如下:

产生一个n位的随机数p,且最高位不能为0

若最低位为偶数,则将它加1,保证该数为奇数以节省时间

测试该数能否被10000以下的素数(共1228个)整除,这样可以快速排除许多合数,节省时间

在2到p-1这间随机生成一个数a,以a为底对p进行Miller-Rabin素性测试,若不通过说明p为合数。若通过则再选取一个a对p进行测试。选取a时应该选取尽可能小的素数,以提高运算速度。大概进行5次Miller-Rabin素性测试后,精确性就比较高了

若p每次测试都通过,则认为p是素数。否则p←p+2,再次对p进行测试

会话秘钥

我们已经看到了,对于对称密码而言,密码本身的发送是一个问题,再者对待千千万万不同的用户, 我们需要不同的密码去应对每一个请求。

而RSA算法,加密起来确实无人可解, 但是运算太耗费时间, 需要的计算量是 对称秘钥算法的 成百上千倍。

那么,我们有没有一个比较好的处理办法能够解决这些问题呢?

当然是将两者结合起来使用了哇。

我们在一个会话刚刚开始时, 通过 RSA算法 加密 秘钥, 将秘钥发送给对方, 在之后的会话过程中, 使用对称秘钥进行会话即可。

完整性

需要验证的是 数据未被修改过。

这就表示 对于我们的 明文, 需要有对应的数据 能够 验证, 确确实实没有被变更.

密码散列函数

也即哈希函数, hash相信每个开发人员都不陌生, 但在这里 我们对于hash的要求会更高一点:

要求对于任意两个不同的报文, H(x) == H(y) 的概率 几乎为0

这一点也就保证了 对于任意报文而言,通过相同的hash函数,我们几乎不可能找到相同的报文。

MD5正是这样这样一个hash 函数.

SHA SHA-1 也是起到同样的作用。

需要注意到的一点是: MD5, SHA-1 并不能够被称作是加密算法。

就我个人理解来说: 凡是被加密的数据,那么必然能够还原回初始版本, 也即 解密, 而hash函数无疑是不具备这个特点的。

我们想要破解 hash函数 进行还原的唯一办法是,穷举法, 对撞。 因为对于密码散列函数而言,对于不同的文本其hash值几乎是完全不同的。那么反过来说, 对于散列值必然有其唯一对应的 原始文本。

报文鉴别

对于单纯的hash来说, 如果存在第三方,截获了 A发送的消息, 同时自己伪造了新的消息,并加入了新的散列值。伪装成A将消息发送给B。

对方收到了消息,傻傻的以为A绝情的要分手。

那么我们就需要一种办法, 验证消息确确实实是 A发送的, 而不是来源于别人。

密令就是一个不错的方式, 当地下党接头时, 可能也采用的是原始的对暗号的方式来确定对方的身份。

假定双方已经持有一个 共享秘钥s, 当A发送数据时, 通过 明文 H(m + s) 生成哈希值, 当B收到数据时, 自身已经持有s, 因此可以同样通过 H(m + s) 验证 数据是否是对方发送的, 也能够验证数据的完整性。

而 H(m + s) 就被成为是 报文鉴别码 (MAC).

但这就要求双方都已经持有共享秘钥, 在部分场景, 如 在路由器 链路选择算法中, 可以由网络管理员配置秘钥, 以确定数据的来源.

而在服务器和个人交互中呢? 我们如何确定共享秘钥?

哎? 前面不是提到过会话秘钥吗, 这个应该就可以吧. 那么在双方的初次交互过程中, 又如何确定会话的对象是 你理想中的 服务器呢? 在初次交流中, 已经伪装成了 知心哥哥, 将秘钥发给你, 无碍交流, 最终才发现这是又一次残忍的欺骗.

数字签名

看来MAC已经没有办法帮助我们阻挡坏人了. 那么该怎么办呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsppzg.html