离散对数和椭圆曲线加密原理

为什么是椭圆曲线加密?

椭圆曲线加密(以下简称ECC)实际上已经应用到了各个网站的HTTPS连接中。你平常访问的网站,大部分都是基于椭圆曲线加密,比如你现在正在浏览的CSDN。如果你用的是chrome浏览器,按下F12,点开Security,可以看到下图这样的内容:
在这里插入图片描述
这里的ECDHE就是椭圆曲线密钥交换的简称。能进行密钥交换的算法并非只有ECC,但是现在的大型网站(除了某些老旧的银行网站)都不约而同地选择了ECC。还有大火的比特币,先不论比特币的争议,设计相当精妙,其身份认证机制便是以ECC为基础。为何比特币选择的也是ECC?

如果你是一个服务端程序员或者运维人员,那么肯定没少用SSH连接服务器。SSH连接里面经常会用公钥进行登录。这时会要求先在本机使用ssh-keygen生成密钥对,然后把密钥对里的公钥上传到服务器。但是用多了有没有发现ssh-keygen默认生成的密钥有点长?比如这个公钥:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCypa+az50x7bi0vweyY2dVQIztS9Q/v4DL3OQMPCPDR85bFsvsXWB5r/fbETDlo25ZDyWBInOVxqR96H0vKeWE28tbbQSqne41WAobPe1Z4gxq5o2WJXsC44qjW9ne34dJFVYNX9DrcnvddyZdTxw4Apa6A/hixMtaPDueQF6lct8EsVhkRqFSbdYfumABxUlGW4kKbwA86zT+jDCbnOHyk7EOvtUuLqlTntZmko7gm46QSuYNuhlFeGQirzmVmU8C55wABvVjeVw/wXZe96Q5faPEqAvY+X3o0ku1eliQuI/7BGq9j9s8q2WqSTBweOhJ5mHhf+kyra0jm70WYRlb

但是你只需要把ssh-keygen的密钥类型从默认的RSA切换到ECC,也就是运行ssh-keygen -t ed25519,就可以得到一个短得多的公钥:

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHzJZ8pHw7wVIFWp9zmLIeYyhk81QAp42FuCQkdbG1bb

一般来说,密钥越长安全性越高,但是这个短密钥的安全性比上面长的还要高。破解它的难度相当于破解长度为3000位(二进制位)的RSA密钥。而ssh-keygen默认生成的是长度为2048位的RSA密钥。为什么ECC的密钥可以这么短但是安全性却更高?

序言


不管是RSA、离散对数加密还是椭圆曲线加密,公钥加密算法都是依赖于某个正向计算很简单(比如多项式时间复杂度),而逆向计算很难(比如指数时间复杂度)的数学难题。对于RSA,这个问题是大整数因子分解问题;对于离散对数加密,是离散对数问题;对于椭圆曲线加密,则是椭圆曲线上的离散对数问题。

本文主要介绍椭圆曲线加密,但是离散对数加密和椭圆曲线加密原理比较相似,在这里一起介绍。

离散对数问题


我们在中学里学的对数问题是指,

给定正实数 a a a a x a^x ax,求 x x x。也就是计算 x = log ⁡ a a x x=\log_a{a^x} x=logaax

这是实数域上的对数问题,不是什么难算的东西,随便按一下计算器结果就出来了。

而离散对数问题是指这样的问题:

给定素数 p p p和正整数 g g g,知道 g x m o d    p g^x\mod p gxmodp的值,求 x x x

对于符合特定条件的 p p p g g g,这个问题是很难算的,更准确地说,是没有多项式时间的解法。而 g x m o d    p g^x \mod p gxmodp的计算却非常快,由此造成了正向和逆向天差地别的计算速度。打个比方,就像随手一扔,玻璃杯就摔碎成渣,而想要将一堆玻璃渣拼回完整的玻璃杯,即使做得到,所需的人力物力也远远大于当初那随手一扔。

Diffie–Hellman密钥交换


Diffie–Hellman密钥交换(以下简称DH)是用于双方在可能被窃听环境下安全交换密钥的一种方法。
算法的安全性是由上面提到的离散对数难题保证。

具体算法流程如下:

  • 小红和小明约定 p p p g g g的值
  • 小红生成私钥 x x x,计算 g x m o d    p g^x\mod p gxmodp作为公钥公布出去
  • 小明生成私钥 y y y,计算 g y m o d    p g^y\mod p gymodp作为公钥公布出去
  • 小红得知 g y m o d    p g^y\mod p gymodp后,计算
    s = ( g y m o d    p ) x m o d    p = ( g y ) x m o d    p = g x y m o d    p s=(g^y\mod p)^x\mod p=(g^y)^x\mod p=g^{xy}\mod p s=(gymodp)xmodp=(gy)xmodp=gxymodp
  • 小明得到 g x m o d    p g^x\mod p gxmodp后,计算
    s = ( g x m o d    p ) y m o d    p = ( g x ) y m o d    p = g x y m o d    p s=(g^x\mod p)^y\mod p=(g^x)^y\mod p=g^{xy}\mod p s=(gxmod
椭圆曲线离散对数问题是基于椭圆曲线群的一个数学难题。它是在椭圆曲线上找到从一组点到另一组点之间的线性映射的问题。更精确地讲,在椭圆曲线 \(E\) 上,给定两个点 \(P\) 和 \(Q = [k]P\) (其中 \(k\) 是一个整数),椭圆曲线离散对数问题就是寻找 \(k\) 的计算过程。 椭圆曲线离散对数问题通常用于加密技术中,因为它被认为是计算上困难的,因此可以作为构建安全协议的基础。例如,在椭圆曲线密码学(Elliptic Curve Cryptography, ECC)中,这一问题被用来生成公钥和私钥,保证数据传输的安全性。 目前存在几种解决椭圆曲线离散对数问题的方法,包括但不限于: 1. **指数搜索**:一种简单的暴力破解方法,通过尝试所有可能的 \(k\) 值直到找到正确的解。这种方法在大数情况下效率极低,不适合实际应用。 2. **Pollard's rho算法**:这是在随机情况下解决离散对数问题的一种有效方法,特别适合于椭圆曲线离散对数问题。该算法利用概率论原理,通过构造一个伪随机序列并在序列中查找周期点,从而逼近离散对数的解。 3. **Schoof算法**:主要用于计算椭圆曲线的素数阶数,即曲线上有多少个不同点。了解曲线阶数对于解决椭圆曲线离散对数问题有重要帮助。 4. **Miller-Rabin素性测试结合快速指数求模算法**:这是一种现代的、高效的椭圆曲线离散对数问题求解策略,尤其当处理的是大数时。首先使用素性测试验证某个大数是否为素数,然后在素数域内应用快速指数求模算法来加速求解过程。 5. **Gallant-Lambert-Vanstone算法**:这是一种改进的指数搜索算法,通过提前预处理减少搜索空间,适用于某些特定情况下的优化求解。 值得注意的是,尽管这些算法在理论上有一定的进展和改进,但对于实际使用的椭圆曲线参数集而言,椭圆曲线离散对数问题仍然被认为是非常难以求解的,这也保证了椭圆曲线密码系统的安全性。然而,随着量子计算机的发展,现有的椭圆曲线密码系统面临着潜在的风险,因为量子计算机运行的Shor算法能够有效地解决这类离散对数问题。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值