初识非对称加密

非对称加密算法概念

公钥密码学即Public-key cryptography,也称非对称密码学Asymmetric cryptography,是密码学中的一类算法。与对称加密算法相对,非对称加密算法的密钥成对出现,称为密钥对,分为公钥和私钥,可以记作\((PK, SK)\)。消息的接收方生成密钥对,公钥可以公开,消息的发送方使用公钥对明文加密,而接收方使用自己的私钥对密文进行解密得到消息明文,没有私钥的第三方是无法解密消息密文的。由于公钥可以公开,非对称密码算法避免了对称密码算法必须考虑的密钥协商的问题。

非对称密码算法的缺点在于其性能比对称密码算法低。实际使用中一般用公钥加密会话密钥,使用会话密钥对任意长度数据进行对称加密。(这里的密钥分别可以称为KEK和DEK)

常见的公钥加密算法有RSA、ElGamal、ECDSA等等。使用最广泛的是RSA算法。

RSA

其名称源于三个发明者姓氏的首字母。

RSA的安全性取决于极大整数的因数分解难题(已知乘积求两个因数)。如果有一种高效的因数分解算法,RSA算法的安全性就会被破解。现在密钥长度较短的RSA算法已经被破解,因此实际使用应该参照建议和标准使用。

假设Bob想给Alice发送明文\(m\)

KeyGen

  1. 随机选择两个大质数\(p,q(p \ne q)\),计算\(N=pq\)
  2. 根据欧拉函数得到\(r = \phi(N) = \phi(p)\phi(q) = (p-1)(q-1)\)。(因为\(p\)\(q\)都是质数)
  3. 选择一个小于\(r\)并与之互素的整数\(e\),求得\(e\)关于\(r\)的模反元素\(d\),即\(d\)满足\(ed \equiv 1 \pmod{r}\)​。
  4. 公钥\(PK=(N,e)\),私钥\(SK=(N,d)\)。将\(PK\)发送给Bob。

Encrypt

  1. 将明文\(m\)转化为小于\(N\)的非负整数\(n\)

  2. 密文\(c \equiv n^e \pmod{N}\)

Decrypt

  1. 利用\(SK\)计算\(n \equiv c^d \pmod{N}\)
  2. 转换得到明文\(m\)

ElGamal

这个算法基于Diffie-Hellman密钥交换协议。它可以定义在任何循环群\(G\)上,其安全性取决于循环群\(G\)上的离散对数难题,简单来说就是难以求出指数。

仍然是AB两人的通信,A为接收方而B为发送方。

KeyGen

  1. 生成一个阶为\(q\)的循环群\(G\),其生成元为\(g\)
  2. \(\{1,\dots,q-1\}\)随机选择一个数\(x\)
  3. 计算\(h=g^x\)
  4. 得到\(PK=<G,q,g,h>,SK=x\)。将\(PK\)发送给Bob。

Encrypt

  1. \(\{1,\dots,q-1\}\)随机选择一个数\(y\),计算第一个密文组件\(c_1=g^y\)
  2. 计算共享秘密\(s=h^y\)
  3. 将密文\(m\)映射为\(G\)上一个元素\(m’\),计算第二个\(c_2=m' \cdot s\)
  4. 构造密文\(ct = (c_1,c_2)\),发送给Alice。

对于每次加密都产生一个新的\(y\),可以提高安全性。这里\(y\)为加密算法引入了随机性,可以说加密算法是一个概率加密算法。

Decrypt

  1. 计算共享秘密\(s = c_1^x\)
  2. 计算\(m' = c_2 \cdot s^{-1}\),并映射回明文\(m\)

概率加密算法是什么

参考现代密码学中怎么理解密钥产生算法、加密算法是概率算法? - 知乎 (zhihu.com)上的几个回答,整理整理总算是基本理解了什么是概率加密算法。

首先说明概率算法(Probablistic algorithm)也可以看作随机算法,运算过程中需要随机状态的参与,因此算法的输出不仅取决于输入,还依赖随机状态,正如上面的ElGamal的加密算法。相对应的就是确定算法(Deterministic algorithm),对于任意确定的输入,算法的输出也唯一确定,我们一般说的编程的算法都是这样的。

密码学中,加密方案一般需要满足IND-CPA安全性(选择明文攻击的不可区分性)。如果一个加密方案是确定的,就无法满足IND-CPA安全。因此实际使用的现代密码学加密方案基本上都是概率的。

  1. RSA加密方案中除了密钥生成,都是确定的。
  2. 现代公钥加密和签名基本都是概率的。
  3. 所有hash函数都是确定的,所有为随机函数算法都是确定的。
  4. 一次性密码本(One-Time Pad即OTP)实际上是确定的,因为OTP中密钥是算法的输入而不是执行过程中生成的。
  5. 对称加密方案如DES、AES都是确定的,但是由于运行模式的加入,初始向量IV的引入,算法变成了随机的。

对于Quora某答主的答案的简单阅读

来源为What is RSA and how we will implement it? - Quora,重点关注后面一半问题。

The first thing to keep in mind is that RSA itself gets exponentially more expensive as the amount of data goes up. As a result, it’s usually used to encrypt a very small (8–64 bytes) piece of random bits, and then use that random bits as a session key for a much faster symmetric encryption algorithm like AES and use that for encrypting and decrypting the actual payload, or encrypting just a similarly small hash of the data for use as a digital signature.

第一点是RSA太贵,一般与AES等较快的对称密码结合起来使用,只用来加密小数据。(这里给了数字,8-64字节。)

The next thing to keep in mind is that “RSA” by itself is sort of useless. It’s usually used as a part of a more comprehensive encryption protocol such as TLS 1.3 (which is what drives the https:// on the internet). Among other things, TLS provides option negotiation for things like which symmetric protocol and what mode (ECB, etc) to use it in.

第二点是一般没人单单使用RSA,而是通常用作更完善的加密协议的一个部分,比如TLS。

So out in the Real World, “implement RSA” usually means “Use OpenSSL or GnuTLS or similar to enable TLS 1.3 on the network connection, and generate a public/private key pair, have some CA company that does TLS certificates sign the key so the other end trusts that your key is really yours, and have the security team check the system to make sure it’s not wide-open for hacker attacks”. And sometimes, it’s as simple as ”Get a certificate from Let’s Encrypt, put it in the right place in the file system, and check the box on the webserver GUI that says ‘Use TLS’. Just remember to tell the firewall to allow TCP port 443 😃

总结来说说现实世界中“使用RSA”意味着什么。一般是需要我们使用OpenSSL或者其他的东西,使用现有的完善的PKI。

posted @ 2024-05-19 00:05  随机生成一个id  阅读(6)  评论(0编辑  收藏  举报