热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

ECC算法简析,椭圆曲线密码,应用于国密SM2

SM2是国密算法的一部分,于2010年由国密局公布,属于非对称加密算法,本身是基于ECC椭圆曲线算法来实现的。本文重在理清ECC算法的来

SM2是国密算法的一部分,于2010年由国密局公布,属于非对称加密算法,本身是基于ECC椭圆曲线算法来实现的。

本文重在理清ECC算法的来龙去脉,关于无穷远点、摄影平面坐标系、Fp有限域、阿贝尔群等概念,要重点学习近世代数;关于代码实现部分,本文暂未说明。

 

一、射影平面的引入

近世代数中的几个小概念:

1关于无穷远点,可以理解为平面上两条平行线的交点;

2一组平行直线只有一个无穷远点;

3相交的两条平行直线有不同的无穷远点(易反正);

4平面上全体无穷远点构成一条无穷远直线;

5全体平常点和全体无穷远点构成射影平面。

 

射影平面坐标系是对笛卡尔平面直角坐标系的扩展,能表示无穷远点,同时向下兼容笛

卡尔平面直角坐标系中的平常点。

 

对于笛卡尔直角坐标系中的平常点A(x,y),令x=X/Z,y=Y/Z,Z!=0,则点A在射影平面坐标系中表示为A(X,Y,Z),Z!=0。

直线在笛卡尔平面直角坐标系中的方程为ax+by+c=0,带入x=X/Z,y=Y/Z,得出射影平面坐标系中表示为aX+bY+cZ=0。

然后由两直线aX+bY+c1Z=0,aX+bY+c2Z=0,c1!=c2,易得出Z=0,即aX+bY=0,所以无穷远点在射影平面中用(X,Y,0)来表示。

综上,射影平面坐标系中包括两类点,一类是平常点(X,Y,Z),Z!=0,另一类是无穷远点(X,Y,0)。

 

二、椭圆曲线的定义

射影平面坐标系上满足威尔斯特拉斯方程(Weierstrass)所有点的集合

Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3Y2Z+a1XYZ+a3YZ2=X3+a2X2Z+a4XZ2+a6Z3,组成一条椭圆曲线。

    并满足:

1椭圆曲线方程是一个齐次方程,所有项的次数都是三。

2曲线上的每个点都必须是非奇异的(光滑的),偏导数FX(X,Y,Z)、FY(X,Y,Z)、FZ(X,Y,Z)不同为0,即曲线上所有点都可微。

 

椭圆曲线的形状,并不是椭圆形。该方程与椭圆方程的相差甚远,因为椭圆方程是二次的。该曲线之所以命名为椭圆曲线,是因为上述方程类似于计算椭圆周长的方程。

        将x=X/Y,y=Y/Z带入后,得到椭圆曲线方程的所有平常点在笛卡尔坐标系中的表示:

y^2+a1xy+a3y=x^3+a2x^2+a4x+a6

        平常点(x,y)的斜率k=-Fx(x,y)/Fy(x,y)=(3x^2+2a2x+a4-a1y)/(2y+a1x+a3);

 

三、应用于加密

并不是所有的椭圆曲线都光滑和连续,例如Y^2Z=X^3+X^2和Y^2Z=X^3,在点(0,0,1)上不可微,没有切线。

并不是所有光滑的椭圆曲线都适合加密,y^2=x^3+ax+b是一种简单常用的适合用来加密的椭圆曲线。

另外,我们所说的椭圆曲线上的点包括两部分,一部分(x,y)满足y^2=x^3+ax+b,只是笛卡尔平面直角坐标系中的平常点,还要再加一个无穷远点,才是一条完整的椭圆曲线。

 

再者,上面所说的(x,y)是定义在R上的,若要用来加密,还需把椭圆曲线离散化,即定义在有限域Fp上面,还要建立起(x,y)之间关系,这个关系是加法运算。

 

四、有限域Fp

椭圆曲线是连续的,并不适合用于加密;所以,我们必须把椭圆曲线变成离散的点,我

们要把椭圆曲线定义在有限域上。

        下面,我们给出一个有限域Fp,这个域只有有限个元素。
   
  Fp中只有p(p为素数)个元素0,1,2 …… p-2,p-1;
  Fp 的加法(a+b)法则是 a+b≡c (mod p);

  Fp 的乘法(a×b)法则是  a×b≡c (mod p);
  Fp 的除法(a÷b)法则是  a/b≡c (mod p);即 a×b-1≡c  (mod p);b-1也是一个0到p-1之间的整数,但满足b×b-1≡1 (mod p)

        Fp 的单位元是1,零元是 0

 

       对于椭圆曲线Ep(a,b)p为质数,x,y[0,p-1]。选择两个小于p的非负整数ab,满足4a3+27b2≠0(mod p)

符合方程y^2=x^3+ax+b(mod p),满足上述方程的所有点(x,y),再加上无穷远点,构成一条椭圆曲线。

以y^2=x^3+x+1为例,记为E23(1,1),该椭圆曲线上的离散点为

四、椭圆曲线上点(x,y)的加法运算

我们最熟悉的加法是实数轴上的加法,3+4=7,1.2+68=69.2,2pi+3pi=5pi。

若要实现椭圆曲线上的加法,需要引入近世代数中的阿贝尔群。

阿贝尔群是一种代数结构,由一个集合和二元运算组成,需要满足封闭性、结合性、有单位元和逆元。

运算法则:任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,过R’做y轴的平行线交于R。我们规定P+Q=R。

 

在加密中,加法运算主要使用P+P+…+P(m个相加)=2P+P+…+P=(m-1)P+P=mP。即m个相

同的点P相加。

以P+P+P=2P+P=3P为例,

计算过程不断的重复做切线或连接两点,然后再沿着y轴做平行线,取交点的过程。先

有P,做P的切线,然后有2P’,再有2P,再连接2P和P,有3P’,然后再有3P。

 

五、应用于加密后的椭圆曲线

1椭圆曲线Ep(a,b)上的点的数目,称为椭圆曲线Ep(a,b)的阶。

2对于椭圆曲线上一点P,如果存在最小的正整数n,使得数乘nP=O∞,则将n称为P的阶,若n不存在,我们说P是无限阶的。事实上,在有限域上定义的椭圆曲线上所有的点的阶n都是存在的,具体证明详见近世代数相关理论。

3对于kG=K,点G是Ep(a,b)上的点,由加法定义,求点K相对容易,并且K也在Ep(a,b)上。但是由K和G,去反推k非常困难,被称为椭圆曲线上离散对数难题。

4描述一个利用椭圆曲线进行加密通信的过程:

(1)用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。
  (2)用户A选择一个私有密钥k,并生成公开密钥K=kG。
  (3)用户A将Ep(a,b)和点K,G传给用户B。
  (4)用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r。
  (5)用户B计算点C1=M+rK;C2=rG。
  (6)用户B将C1、C2传给用户A。
  (7)用户A接到信息后,计算C1-kC2,结果就是点M。
        因为C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M,再对点M进行解码就可以得到明文。

在这个加密通信中,用户A的加密用的椭圆曲线、公钥和基点,即Ep(a,b)、K、G,用户B的两个返回值C1、C2,会在网络中传输,有可能被盗取,但是通过K、G 求k和通过C2、G求r,都是相对困难的。没有k或r,就无法推算出M,没有M,就无法解码推出明文。

六、ECC公钥算法的破解难点分析

公开密钥算法总是要基于一个数学上的难题,对于等式:
  K=kG(其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数)
  不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。而且,p越大越困难,但p越大,计算速度会变慢,200位左右可以满足一般安全要求,

比如居民二代身份证的加密算法采用256位的ECC。
对于更严格的加密场合,把p取得相当大,n也相当大,要把n个解点逐一算出来,采用打表法来破解k,先认同这个思路姑且可行。但G这个基点是用户随意选取的,Ep(a,b)上每个点都可能成为基点,破解者需要建立数不清的新表,椭圆曲线上的G+G+…+G的计算过程很烦躁,离散点的跳跃也错综复杂,有E23(1,1)的P(3,10)为证

这就是椭圆曲线加密算法的破解困难的数学依据,

 

比特币系统选用的secp256k1中,参数为

p = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F
= 2^256 − 2^32 − 2^9 − 2^8 − 2^7 − 2^6 − 2^4 – 1

n = 0xFFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141,全是非常大的数字。

 

七、资料来源

ECC椭圆曲线加密算法原理,https://blog.csdn.net/jingcheng345413/article/details/54969289

ECC椭圆曲线详解(有具体实例),https://www.cnblogs.com/Kalafinaian/p/7392505.html

椭圆曲线算法(ECC)学习(一),http://www.freebuf.com/articles/database/155912.html

 

有个编码的疑问,说将明文编码到Ep(a,b)上的一个点M,还说编码规则很多。我猜想是将明文中的信息以某种方式记录在点M上,疑问是M就是一个点,可以保存的信息也就是横纵坐标。对于一条明文,比如“hello您好123”,这么长的信息如何记录到一个点M中呢?


推荐阅读
  • 当前物联网领域十大核心技术解析:涵盖哪些关键技术?
    经过近十年的技术革新,物联网已悄然渗透到日常生活中,对社会产生了深远影响。本文将详细解析当前物联网领域的十大核心关键技术,包括但不限于:1. 军事物联网技术,该技术通过先进的感知设备实现战场环境的实时监测与数据传输,提升作战效能和决策效率。其他关键技术还包括传感器网络、边缘计算、大数据分析等,这些技术共同推动了物联网的快速发展和广泛应用。 ... [详细]
  • Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战?
    Cosmos生态系统为何迅速崛起,波卡作为跨链巨头应如何应对挑战? ... [详细]
  • TCP三次握手过程详解与图示解析
    本文详细解析了TCP三次握手的过程,并通过图示清晰展示了各个状态的变化。同时,文章还介绍了四次挥手的图解,解释了在TIME_WAIT状态中,客户端最后一次发送的ACK包的作用和重要性。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 使用Charles代理工具破解HTTPS请求的详细方法与技巧
    当你将应用程序的网络请求从HTTP升级到HTTPS后,可能会遇到无法捕获请求的问题。不用担心,这只是因为应用程序进行了加密升级。本文将详细介绍如何使用Charles代理工具破解HTTPS请求,包括具体的配置步骤和实用技巧,帮助你轻松解决这一问题。 ... [详细]
  • 在PHP多线程扩展开发中,面临的主要挑战之一是多线程调用PHP用户类方法时可能出现的内存错误。具体表现为当多个线程同时调用同一个类实例的同一方法时,系统会抛出内存错误。为了解决这一问题,本文深入分析了PHP多线程扩展的实现机制,并提出了几种有效的解决方案和技术思路,包括线程安全的类设计、内存管理优化以及线程同步机制的改进。通过这些方法,可以显著提升PHP多线程扩展的稳定性和性能。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • CTF竞赛中文件上传技巧与安全绕过方法深入解析
    CTF竞赛中文件上传技巧与安全绕过方法深入解析 ... [详细]
  • 背包问题不仅是一个基础的算法挑战,更是一类广泛存在的优化问题的典型代表。这类问题实质上属于0-1线性规划范畴,其核心在于通过一系列约束条件来最大化或最小化目标函数。自2007年dd_engi发布《背包问题》一文以来,该领域得到了深入的研究和广泛应用。本文将详细解析背包问题的基本概念、求解方法及其实际应用场景,帮助读者全面理解这一重要课题。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 本文作为探讨PHP依赖注入容器系列文章的开篇,将首先通过具体示例详细阐述依赖注入的基本概念及其重要性,为后续深入解析容器的实现奠定基础。 ... [详细]
  • 字节跳动深圳研发中心安全业务团队正在火热招募人才! ... [详细]
author-avatar
雪中侠客79_932
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有