eSIM前置知识 - 00. PKI与证书

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.

没有评论:

发表评论