初识非对称加密

非对称加密算法概念

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

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

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

RSA

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

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

假设Bob想给Alice发送明文m

KeyGen

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

Encrypt

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

  2. 密文cne(modN)

Decrypt

  1. 利用SK计算ncd(modN)
  2. 转换得到明文m

ElGamal

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

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

KeyGen

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

Encrypt

  1. {1,,q1}随机选择一个数y,计算第一个密文组件c1=gy
  2. 计算共享秘密s=hy
  3. 将密文m映射为G上一个元素m,计算第二个c2=ms
  4. 构造密文ct=(c1,c2),发送给Alice。

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

Decrypt

  1. 计算共享秘密s=c1x
  2. 计算m=c2s1,并映射回明文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 @   随机生成一个id  阅读(48)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示