zoukankan      html  css  js  c++  java
  • ECC(椭圆曲线加密)算法剖析

    背景

    随着计算机性能的提升,市面上的加密技术越来越不安全,1024位的RSA私钥加密已经可以破解,目前有效的手段只是将1024位换成2048位,但随着技术的进步,RSA算法的破解难度会越来越低,因此需要用更安全的加密算法来代替。随着加密难度的提高,RSA算法的密钥长度呈现指数式的增长,然而ECC算法取可以做到使用更短的密钥获得同等级别的安全性。

     

    ECC是什么

    ECC是Elliptic Curve Cryptography(椭圆曲线密码学)的缩写,是一种基于椭圆曲线数学的公开密钥加密算法,其本质是利用离散对数问题实现加密。
    ECC的主要优势,是在使用更小的密钥的同时,提供更快的性能和更高等级的安全。
     

    椭圆曲线又是什么

    一条椭圆曲线就是一组被 y2 = x3 + ax + b 定义的且满足 4a3 + 27b2 ≠ 0 的点集。
    4a3 + 27b2 ≠ 0 这个限定条件是为了保证曲线不包含奇点(在数学中是指曲线上任意一点都存在切线)。
     

    阿贝尔群

    阿贝尔群的概念是抽象代数的基本概念之一,是一种代数结构,由一个集合以及一个二元运算所组成。
    如果一个集合或者运算是群的话,就必须满足以下条件(+ 表示二元运算):
    1、封闭性(closure),如果a和b被包含于群,那么a+b也一定是群的元素;
    2、结合律(associativity);
    3、存在一个单位元(identity element)0,0与任意元素运算不改变其值的元素,即 a+0 = 0+a = a;
    4、每个元素都存在一个逆元(inverse);
    5、交换律(commutativity),即 a+b = b+a;
     

    椭圆曲线中的阿贝尔群

    在椭圆曲线上定义一个群:
    1、群中的元素就是椭圆曲线上的点;
    2、单位元就是无穷处的点0;
    3、相反数P,是关于X轴对称的另一边的点;
    4、二元运算规则定义如下:取一条直线上的三点(这条直线和椭圆曲线相交的三点),P, Q, R(皆非零),他们的总和等于0,P+Q+R=0。
    如果P, Q, R在一条直线上的话,他们满足:
    P+(Q+R)=Q+(P+R)=R+(P+Q)=⋯=0。
    当P,Q点为同一点时,P=Q,满足:
    这样,我们可以直观的证明:+运算符是符合交换律和结合律的,这是一个阿贝尔群。
    因为阿贝尔群满足交换律和结合律,所以点P和点-R的二元运算结果必会在曲线上,即P+P+P的结果必会在曲线上的另一点Q,
    以此类推,可以得出得出:
    Q=kP(k个相同的点P进行二元运算(数乘),记做kP)
     

    离散对数问题

    描述一条Fp上的椭圆曲线,常用到六个参量:T=(p,a,b,n,x,y)。(p 、a 、b) 用来确定一条椭圆曲线,p为素数域内点的个数,a和b是其内的两个大数;
    x,y为G基点的坐标,也是两个大数;
    n为点G基点的阶;
    以上六个量就可以描述一条椭圆曲线,有时候我们还会用到h(椭圆曲线上所有点的个数p与n相除的整数部分)。

    这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

      1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;
      2、p≠n×h;
      3、pt≠1 (mod n),1≤t<20;
      4、4a3+27b2≠0 (mod p);
      5、n 为素数;
      6、h≤4。

     

    加解密过程

      1、选定一条椭圆曲线 Ep(a,b) 并取椭圆曲线上一点,作为基点P。
      2、选择一个大数k作为私钥,并生成公钥 Q=kP。
      3、将 Ep(a,b) 和点Q、P传给用户。
      4、用户接到信息后 ,将待传输的明文编码到Ep(a,b)上的一点M,并产生一个随机整数r。
      5、公钥加密(密文C是一个点对):
        C={rP, M+rQ}
      6、私钥解密(M + rQ - k(rP) ,解密结果就是点M),公式如下:
        M + rQ - k(rP) = M + r(kP) - k(rP) = M
      7、对点M进行解码就可以得到明文
      假设在加密过程中,有一个第三者H,H只能知道椭圆曲线 Ep(a,b)、公钥Q、基点P、密文点C,而通过公钥Q、基点P求私钥k或者通过密文点C、基点P求随机数r都是非常困难的,因此得以保证数据传输的安全。
     
    具体:
    设私钥、公钥分别为k、K,即K = kG,其中G为G点。
      公钥加密:
      选择随机数r,将消息M生成密文C,该密文是一个点对,即:
        C = {rG, M+rK}
        其中K为公钥
      私钥解密:
        M + rK - k(rG) = M + r(kG) - k(rG) = M
        其中k、K分别为私钥、公钥
     

    椭圆曲线签名与验证签名

    椭圆曲线签名算法,即ECDSA。
    设私钥、公钥分别为k、K,即K = kG,其中G为G点。
     
    私钥签名:
      1、选择随机数r,计算点rG(x, y)。
      2、根据随机数r、消息M的哈希h、私钥k,计算s = (h + kx)/r。
      3、将消息M、和签名{rG, s}发给接收方。
     
    公钥验证签名:
      1、接收方收到消息M、以及签名{rG=(x,y), s}。
      2、根据消息求哈希h。
      3、使用发送方公钥K计算:hG/s + xK/s,并与rG比较,如相等即验签成功。
     
    原理如下:
      hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s = r(h+xk)G / (h+kx) = rG

     
  • 相关阅读:
    vim操作
    brew安装
    pycharm工程包导入问题
    mongodb的更新语句
    mongodb的增加和删除
    Mongodb中 数据库和集合的创建与删除
    mongodb服务器启动
    mac 根目录下新建文件夹并赋予权限
    常用的python标准库
    mac显示隐藏文件夹和文件
  • 原文地址:https://www.cnblogs.com/jockming/p/12111681.html
Copyright © 2011-2022 走看看