这就要求 我们对 每一个块(在对称加密算法中, 正是将数据分成一个又一个的块), 都发送相应的Ri 用于处理数据。 Ri可以明文发送, 即使Ri被劫持到, 在没有秘钥的情况下, 依然是没有用的。
但这种方式同样会带来一个缺点,即对于每一个块, 我们都需要发送等长的Ri给对方(异或预算必然要求两者长度一样,才能进行异或运算。) 这样我们的数据长度就变为原来的两倍, 这实在是一笔不小的开销。
因此通常采用的方式是CBC, 其基本思想是, 仅随第一个报文发送一个随机值, 在之后的通讯中 通过计算获取 相应的编码。
因此,仅需要N+1个块, 就能够实现 对相同的明文,产生不同的密文。
公开秘钥加密但在对称秘钥体系中, 会有这样一个问题, 如果一切依托于现实, 我们可以彼此约定一个只有双方知道的秘钥, 完成加密解密的相关工作。
但在网络通讯中, 这并不现实, TCP链接时时刻刻都在被销毁与创建中不断循环, 我们不可能在路由器两端使用固定的密码, 如果这样做的话 就意味着线路两端的路由器都要完成解密 然后加密的操作。 用自己的密码加密之后 发送给下一个节点。
我们也不可能将密码直接明文 在 通讯中直接传输, 那样的话, 和不加密又有什么区别呢?
这好像是个难题。
直到公开密码的出现:
是以这样的方式使用:
对于小B来说, 存在两个秘钥, 一个是 公知的 Kb+ 以及 只有自己存有的秘钥 Kb-, 当小A想要给小B发送消息时, 首先会取得 Kb+ 用一个公知的 加密算法 进行加密,得到密文 Kb+(m), 而当小B接收到 Kb+(m) 时, 用一个公知的 解密算法 配以私钥 Kb- 进行解密, 最终使得 Kb-(Kb+(m)) = m。 这样需要解密密文, 就必须要两个秘钥才能够解密。
虽然这样会引入一个新的问题, 即 任何人都可以 截获 发送给小B的消息, 然后用自己准备好的明文, 通过 Kb+对明文加密, 发送给小B。
这就要求我们能够验证数据的来源方究竟是谁, 需要做端点鉴别, 即确确实实是小A自身发送给小B的消息, 而不是别人冒用名义 发送 分手吧 这样的悲惨消息。
RSA算法对于RSA算法, 个人比较感兴趣, 在这里描述的可能就会多一点。
对于任何数据流, 我们都不能忘记其本质 依然是 bit流, 而任何bit流 自然也能够用 唯一的 整数 去表示。
加密这个bit流 自然实际上就是加密这个 唯一数值。
在RSA算法中, 并没有将数据看成是 字符的集合, 而是数值, 这样我们就可以使用种种数学公式加以匹配。
RSA包含两个部分:
加密解密算法
两个秘钥, 公钥和私钥。
秘钥的生成选择两个大素数, 这个值越大越好, 甚至已经超出了常规意义上的 大数值。 该值越大, 破解RSA算法越困难。 推荐公司使用时, p q 两个数的乘积 需要 为 1024bit数量级。
计算 n=pq 和 z=(p - 1)(q - 1)
选择小于n的一个数值 e, 且 e 和 z 互素。
求解一个数d, 使得 ed - 1 可以被 z整除。换成数值表达则是:
ed mod z = 1
则公钥是 (n, e), 私钥是 (n, d);
加解密过程要求被加密的整数 m, m < n
求解 c = (m ^ e) mod n, c即是加密后的密文
求解 m = (c ^ d) mod n.
看上去实在是很简单的过程。
但是 我们需要注意到的是这样几个问题, p q 本身就是数百bit的值。
被加密的整数一般也都不会非常小。
需要计算 m ^ e c ^ d, 这种种操作本身就是非常消耗计算力的过程。
更何况还需要求得大素数q p 本身。
工作原理将上述 加解密过程 合并起来看:
求解m时 即是求解: ((m^e) mod n)^d mod n
在模运算中有这样一个性质:
a ^ b mod n = ((a mod n)^b) mod n则上述公式可以变为:
m^ed mod n因此现在就需要证明:
m ^ ed mod n = m
在数论中, 有:
如果 p q 是素数,且有 n = pq 和 z = (p -1) * (q - 1) 则 X^y mod n = X ^ (y mod z) mod n
因此上述被替换成:
m ^ (ed mod z) mod n => m ^ 1 mod n => (m 小于 n) m
同时如果注意到另一个特点:
如果加解密流程微调:
c = (m ^ d) mod n
m = (m ^ e) mod n
原因则是: m ^ ed mod n 等价于 m ^ de mod n
这个特性意味着什么呢?