0. 前言
最近开始认真的看GSMA eSIM规范,里面毫无疑问复用了极多已有的成熟技术。其中,最基础的就是利用PKI体系以及证书体系,来证明“我就是我”这个根本问题。
同时,eSIM里面涉及到了运营商核心数据怎么样才能通过第三方,安全的下载到eSIM里面去。运营商默认所有的第三方都是不可靠的,所以里面就涉及到各种加密解密。这也是为什么要提前介绍各种算法以及算法本身的作用。
1. 对称算法
1.1 定义
对称加密算法,就是加密方和解密方拥有同样的密钥。使用这组密钥来对敏感信息进行加密和解密。
1.2 优缺点
- 优点:加密速度快
- 缺点1:加密的安全性取决于密钥,而传输和保管密钥的过程中极容易遭到攻击导致密钥暴露。
- 缺点2:密钥管理复杂。如果有 n 个参与方,那么需要n x (n-1) 把密钥才能够保证两两之间的通信不会被第三方窃取。
1.3 常用对称算法
- DES
- 3DES
- AES
2. 非对称算法
2.1 定义
非对称算法,加密方和解密方使用不同的密钥进行。通常称之为公私钥。一方把自己的公钥公布出去,把私钥安全保存。用公钥加密的信息只能用私钥解密,反之,用私钥加密的信息也只能用公钥解密。
2.2 优缺点
- 优点:密钥管理简单
- 缺点:加解密速度较慢
2.3 常用非对称算法
一般来讲,非对称算法都是基于一些数学难题。
- RSA:基于大数的因式分解问题(IFP)
- ECC:基于椭圆曲线的离散对数问题(ECDLP)
2.3.1 RSA进一步解释
具体的解释可以参考详解非对称加密算法RSA。这里只是简单复制其中的公私钥产生步骤
- 首先:任取两个互不相等的大素数,m 和 n,令M = nm, N = (n−1)(m−1),假设m > n,最好取 m > 2n;否者容易被攻破;
- 其次:取一整数e,(e, N) = 1,e < N,求得另一整数 d 满足ed = 1 (mod N),一定存在某个 d 满足 d < N;
- 然后:两组数组数字: M,e 为公钥,可以对外公布;M,d 为私钥不可泄露。
- 最后:不再需要m, n, N,不可以泄露,最好是直接清除。
2.3.2 ECC进一步解释
ECC是基于椭圆曲线的离散对数问题。先给个结论:我是不可能看懂的。有兴趣的请去参考ECC椭圆曲线加解密原理详解(配图)
照例,复制其中的公私钥产生步骤如下:
考虑K=kG ,其中K、G为椭圆曲线 Ep(a,b) 上的点,q 为 G 的阶(nG=O∞ ),k为小于 q 的整数。则给定 k 和 G,根据加法法则,计算 K 很容易。但反过来,给定 K 和 G,求 k 就非常困难。因为实际使用中的 ECC 原则上把 p 取得相当大,q 也相当大,要把 q 个解点逐一算出来列成表是不可能的。这就是椭圆曲线加密算法的数学依据 。
- 点G称为基点(base point)
- k(k<q)为私钥(private key)
- K为公钥(public key)
我们通常使用等式y^2 = x^3 + Ax + B (mod p)来描述一条椭圆曲线,其中
- p、A、B 确定一条椭圆曲线( p 为质数)
- x、y确定了基点 G
- q 为基点 G 的阶,
- h 是椭圆曲线上所有点的个数 m 与 n 相除的商的整数部分
参考RFC 6932,举了一个参数集
Domain Parameters for the 256-Bit Curve
Curve-ID: brainpoolP256r1
p = A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377
A = 7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9
B = 26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6
x = 8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262
y = 547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997
q = A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7
z = 3E2D4BD9597B58639AE7AA669CAB9837CF5CF20A2C852D10F655668DFC150EF0
h = 1
在实际中,不是所有的椭圆曲线都可以用来做加密用,曲线的选择需要精心的设计。下面是根据 RFC 4492 附录 A 列出来的一些不同组织的曲线名称。其中最后三个是用得最多的。
------------------------------------------
Curve names chosen by
different standards organizations
------------+---------------+-------------
SECG | ANSI X9.62 | NIST
------------+---------------+-------------
sect163k1 | | NIST K-163
sect163r1 | |
sect163r2 | | NIST B-163
sect193r1 | |
sect193r2 | |
sect233k1 | | NIST K-233
sect233r1 | | NIST B-233
sect239k1 | |
sect283k1 | | NIST K-283
sect283r1 | | NIST B-283
sect409k1 | | NIST K-409
sect409r1 | | NIST B-409
sect571k1 | | NIST K-571
sect571r1 | | NIST B-571
secp160k1 | |
secp160r1 | |
secp160r2 | |
secp192k1 | |
secp192r1 | prime192v1 | NIST P-192
secp224k1 | |
secp224r1 | | NIST P-224
secp256k1 | |
secp256r1 | prime256v1 | NIST P-256
secp384r1 | | NIST P-384
secp521r1 | | NIST P-521
------------+---------------+-------------
Table 6: Equivalent curves defined by SECG, ANSI, and NIST
3. 散列算法
3.1 定义
来自英文的Hash,也翻译为哈希算法或者杂凑算法。是把任意长度的内容通过散列算法转换为固定长度的一个值。
可以看出来,本质上散列算法是在把无限的内容域映射向有限值域。一定会存在同一个散列值对应几个不同输入值的情况出现。所以,一个好的散列算法,应该具有如下特征【引用自这里】
- 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
- 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
- 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
- 碰撞避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生碰撞)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
3.2 用途与安全性分析
发送方为了描述自己的信息没有被篡改,可以为每份输入产生一个散列值。只要输入有轻微变动,散列值就会完全不一样【输入敏感】。
接收方收到信息后,再通过同样的算法可以轻易算出一个散列值【正向快速】,再与发送方的散列值进行对比,就能够知道信息是否有被篡改。而由于【碰撞避免】的特性,很难篡改原来信息后能够构造出来一个相同 Hash 值。
目前所有的攻击都是在针对【碰撞避免】,而 MD5 和 SHA1 也正是由于被证明成功构造出了具有相同 Hash 值的两段输入,从而开始慢慢被业界抛弃。
3.3 常用散列算法
- MD5
- SHA1
- SHA2 (SHA-224、SHA-256、SHA-384 和 SHA-512)
4. 各算法实用举例
下面举个实际的例子
前面讲了常见的加解密算法。其中非对称算法有个很棒的特性,就是私钥加密,就只有公钥能解开;反之亦然。利用非对称算法的这个特性,假设有两个人 Alice 和 Bob,他们可以满世界的分发自己的公钥,让别人用自己的公钥加密信息,然后自己再拿私钥来解密获得,不用像对称算法一样担心加密内容遭到破解。
密钥持有情况如下
| Key | Alice | Bob |
|---|---|---|
| 公钥 | PKa, PKb | PKb,PKa |
| 私钥 | SKa | SKb |
| 对称密钥 | K | K |
Alice 准备发会议记录给Bob:“Bob,你好,我是Alice。根据我们 2019.05.16 3pm 在 3 号楼的会议,本次会议记录为 xxxxxx(省略 3000 字)”。我们把这段话称之为 Message。
4.1 加密与解密
[非对称算法使用场景]
在这里,如果 Alice 只想让 Bob 收到这段通知,她就可以用 Bob 的 PKb 加密Message,发送给 Bob,然后 Bob 用自己的私钥 SKb 解密即可。其他人即使截获到这段加密 Message,因为没有 SKb,也没有办法得到通知的内容。
[对称算法与非对称算法结合使用]
前面我们也提到过,非对称算法的效率比较低。如果加密大量数据会很慢。这种情况下,完全可以用PKb加密一把对称密钥K,然后把加密后的K发送给 Bob,Bob使用SKb解密得到K。然后 Alice 再用K来加密 Message。这样效率和安全都得到了保证。
4.2 签名与验签
但是,因为 Bob 把自己的公钥 PKb 到处都有分发,这把密钥很有可能被其他人得到。那么,Bob 怎么确认这段会议记录确实是 Alice 发的呢?也有可能是 Mallory 写了这么一段会议记录,假装 Alice 发了出来。
所以,Alice 需要对这段话进行签名。
简单的做法,就是 Alice 直接把所有消息用自己的私钥 SKa 加密,自然只有拥有 PKa 的人才能解开,从而确认这个 Message 是 SKa 拥有者发出来的。
[散列算法使用场景]
但是一般我们不会这样子用。我们一般的做法,是对这段 Message 做一个散列运算,得到一个消息摘要 MD1(Message Digest)。再用 SKa 对这段 MD1 进行加密,得到了一个签名。
到了这一步,Alice 就可以把 明文或者密文的 Message 与签名一起发送给 Bob。
Bob 收到后,解密得到明文 Message,通过同样的算法算出一个特征值MD2。用 PKa 解密签名得到 MD1,比对 MD1 与 MD2 是否一致,就能够确认消息是否遭到篡改。
4.3 中间人攻击 MITM
在实际使用中,Alice 和 Bob 基本上不可能面对面,大概率是通过网络进行沟通。所以,这里就遇到了一个攻击方式,称之为“中间人攻击”,Man In The Middle。
前面讲到了 Alice 和 Bob可以满世界的分发自己的公钥。问题来了,如果有个攻击者 Mallory,在 Alice 和 Bob 交换 PK 的时候,截下了这个他们的 PK,用自己的PKm代替。从而我们得到如下的密钥持有情况
| Key | Alice | Mallory | Bob |
|---|---|---|---|
| 公钥 | PKa, PKm | PKa, PKb, PKm | PKb,PKm |
| 私钥 | SKa | SKm | SKb |
Alice 和 Bob 以为自己持有的公钥是对方的,后面不管 Alice 和 Bob 怎么通信,只要Mallory能够截下,他就可以先解密,然后用自己的密钥代替,从而完成中间人攻击。
成功进行中间人攻击后,可以默默的记下 Alice 和 Bob 交互的所有数据,进行消息窃取。在有价值的时候,甚至可以篡改消息,从而得到更大的收益。
要防范这个攻击,我们就需要用到“证书”这个概念。具体内容,下一篇再来仔细的讲。
Written with StackEdit.
没有评论:
发表评论