
文章插图
这里我们留意到一个问题:如果相同的分组在明文中出现多次(例如互联网流量中的 GET / HTTP/1.1 词组),由于我们使用相同的密钥加密分组,我们会得到相同的加密结果 。我们的安全通信中会出现一种模式规律pattern,容易受到攻击 。
因此还有很多高级的工作模式,例如 密码分组链接Cipher Block Chaining(CBC),其中每个分组的明文在加密前会与前一个分组的密文进行 XOR 操作,而第一个分组的明文与一个随机数构成的初始化向量进行 XOR 操作 。还有其它一些工作模式,在安全性和执行速度方面各有优缺点 。甚至还有 Counter (CTR) 这种工作模式,可以将分组加密算法转换为流加密算法 。

文章插图
除了对称加密算法,还有非对称加密算法asymmetric ciphers,也被称为公钥密码学public-key cryptography 。这类加密算法使用两个密钥:一个公钥public key,一个私钥private key 。公钥和私钥在数学上有一定关联,但可以区分二者 。经过公钥加密的密文只能通过私钥解密,经过私钥加密的密文可以通过公钥解密 。公钥可以大范围分发出去,但私钥必须对外不可见 。如果你希望和一个给定的人通信,你可以使用对方的公钥加密消息,这样只有他们的私钥可以解密出消息 。在非对称加密算法领域,目前 RSA 最具有影响力 。
非对称加密算法最主要的缺陷是,它们是计算密集型computationally expensive的 。那么使用对称加密算法可以让身份验证更快吗?如果你只与一个人共享密钥,答案是肯定的 。但这种方式很快就会失效 。假如一群人希望使用对称加密算法进行两两通信,如果对每对成员通信都采用单独的密钥,一个 20 人的群体将有 190 对成员通信,即每个成员要维护 19 个密钥并确认其安全性 。如果使用非对称加密算法,每个成员仅需确保自己的私钥安全并维护一个公钥列表即可 。
非对称加密算法也有加密数据长度限制 。类似于分组加密算法,你需要将长消息进行划分 。但实际应用中,非对称加密算法通常用于建立机密confidential、已认证authenticated的通道channel,利用该通道交换对称加密算法的共享密钥 。考虑到速度优势,对称加密算法用于后续的通信 。TLS 就是严格按照这种方式运行的 。
基础
安全通信的核心在于随机数 。随机数用于生成密钥并为确定性过程deterministic processes提供不可预测性 。如果我们使用的密钥是可预测的,那我们从一开始就可能受到攻击 。计算机被设计成按固定规则操作,因此生成随机数是比较困难的 。计算机可以收集鼠标移动或键盘计时keyboard timings这类随机数据 。但收集随机性(也叫信息熵entropy)需要花费不少时间,而且涉及额外处理以确保均匀分布uniform distribution 。甚至可以使用专用硬件,例如熔岩灯lava lamps墙等 。一般而言,一旦有了一个真正的随机数值,我们可以将其用作种子seed,使用密码安全的伪随机数生成器cryptographically secure pseudorandom number generator生成随机数 。使用相同的种子,同一个随机数生成器生成的随机数序列保持不变,但重要的是随机数序列是无规律的 。在 linux 内核中,/dev/random 和 /dev/urandom 工作方式如下:从多个来源收集信息熵,进行无偏处理remove biases,生成种子,然后生成随机数,该随机数可用于 RSA 密钥生成等 。
其它密码学组件
我们已经实现了保密性,但还没有考虑完整性和身份验证 。对于后两者,我们需要使用一些额外的技术 。
首先是密码散列函数crytographic hash function,该函数接受任意长度的输入并给出固定长度的输出(一般称为摘要digest) 。如果我们找到两条消息,其摘要相同,我们称之为碰撞collision,对应的散列函数就不适合用于密码学 。这里需要强调一下“找到”:考虑到消息的条数是无限的而摘要的长度是固定的,那么总是会存在碰撞;但如果无需海量的计算资源,我们总是能找到发生碰撞的消息对,那就令人比较担心了 。更严重的情况是,对于每一个给定的消息,都能找到与之碰撞的另一条消息 。
另外,哈希函数必须是单向的one-way:给定一个摘要,反向计算对应的消息在计算上不可行 。相应的,这类条件被称为碰撞阻力collision resistance、第二原象抗性second preimage resistance和原象抗性preimage resistance 。如果满足这些条件,摘要可以用作消息的指纹 。理论上不存在具有相同指纹的两个人,而且你无法使用指纹反向找到其对应的人 。
推荐阅读
- 算法--平衡二叉树AVL原理分析以及代码实现
- Mac降级重装必备 | MacOS 制作启动U盘及安装方法
- 白术养殖方法及注意事项
- 【电灯开关】电灯开关的品牌及安装
- 浅谈java事务及隔离级别
- 用PHP实现遍历删除目录及此目录下存放的所有文件
- 光控开关的原理及应用
- 华为路由器ospf的路由控制及安全
- 南方礼仪中的茶俗及其创新
- 茶具名称及功夫茶具使用说明
