网站设计说明书,系统和网站哪个简单一点,如何学习做网站,百度地图关键词排名优化椭圆曲线原理#xff1a;椭圆曲线的图像并不是椭圆形#xff0c;椭圆曲线源自于求椭圆弧长的椭圆积分的反函数。定义#xff1a;椭圆曲线可用下列方程来表示#xff0c;其中a,b,c,d为系数。E#xff1a; y2 ax3 bx2 cx d椭圆曲线运算#xff1a;(相当于交换群)AB#x…椭圆曲线原理椭圆曲线的图像并不是椭圆形椭圆曲线源自于求椭圆弧长的椭圆积分的反函数。定义椭圆曲线可用下列方程来表示其中a,b,c,d为系数。E y2 ax3 bx2 cx d椭圆曲线运算(相当于交换群)AB过曲线上两点AB画一条直线找到直线与椭圆曲线的的交点将该交点关于x轴对称位置的点定义为AB。AA画出曲线在A点的切线找到该切线与椭圆曲线的交点将该交点关于x轴对称位置的点定义为AA即2A。-AA点关于X轴对称位置的点定义为-A。那A(-A)怎样定义认为A和-A间的这条直线在无穷远处相交这个点图像上画不出来记为O。基于上边的运算如果有椭圆曲线上一个点G可以求2G3G。。。点的坐标。就是说给定G求xG并不困难。但反过来很难(椭圆曲线上的离散对数问题)椭圆曲线上的离散对数问题本质上就是“已知点xG求数x的问题”。密码学中的椭圆曲线密码学中的椭圆曲线运算不是在光滑曲线上进行并不能使用上面的实数域上的椭圆曲线因为1. 实数域上的椭圆曲线是连续的有无限个点密码学要求有限点。2. 实数域上的椭圆曲线的运算有误差不精确。密码学要求精确。所以我们需要引入有限域上的椭圆曲线。就是说不是在实数域R上而是在有限域Fp上。(xy坐标的取值只能在有限域Fp中取)Fp中只有p(p为素数)个元素0,1,2 …… p-2,p-1Fp 的加法(ab)法则是 ab≡c (mod p)即(ac)÷p的余数 和c÷p的余数相同。比特币中ECDSA使用的椭圆曲线参数secp256k1有限域Fp定义p FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F 2256 - 232 - 29 - 28 - 27 - 26 - 24 - 1Fp上的曲线Ey2 x3 ax b定义如下a 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000b 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000007压缩形式(1字节压缩标志位32字节x坐标)的基点G是G 02 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798未压缩形式(1字节压缩标志位32字节x坐标32字节y坐标)G 04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DCE28D9 59F2815B 16F81798 483ADA77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8参数n它是使得 nG0 的最小正整数n FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141参数h它是椭圆曲线群的阶跟由G生成的子群的阶的比值。是设计secp256k1时使用的参数在具体实现中使用这个参数主要是出于安全性考虑忽略它不影响理解。h 01私钥公钥地生成过程用户随机生成一个小于 n 的大整数 k 这就是私钥。然后计算 QkG 这就是公钥(注意公钥是椭圆曲线上的一个点)。ECDH过程假设公私钥是用于密钥交换那么步骤如下(这里的乘法是指椭圆曲线上点的乘法)part1小红生成私钥kA将它乘以基点G得到公钥QA即 kA *GQA小明生成私钥kB将它乘以基点G得到公钥QB即 kB *GQBpart2:小红计算 ( xk, yk ) kA *QB xk即为交换得到的密钥。小明计算 ( xk, yk ) kB *QA xk即为交换得到的密钥。最后小红跟小明得到的密钥是相同的。由以上过程ECDH的part2部分最终交换得到的密钥是只用到曲线上的点32字节的x坐标值是没用到y坐标的。而part1部分这个公钥QA则必须是全的xy坐标都有。注ledger源码中由32字节ECC私钥生成65字节(132x32y)ECC公钥的过程实际只用到了part1只要得到Q的x和y坐标。javacard中的ECDHjavacard.security.KeyAgreementKeyAgreement类是密钥协商算法的基类例如Diffie-Hellman和EC Diffie-Hellman [IEEE P1363]。 KeyAgreement算法的实现必须扩展此类并实现所有抽象方法。撕裂或卡重置事件将初始化的KeyAgreement对象重置为先前通过调用init()初始化时所处的状态。在用这个类实现ECDH时首先private KeyAgreement keyAgreement;keyAgreementKeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH_PLAIN_XYfalse)getInstance功能是创建所选算法的KeyAgreement对象实例。public static final KeyAgreement getInstance(byte algorithm,boolean externalAccess)throws CryptoExceptionalgorithm - 所需的密钥协商算法例如ALG_EC_SVDP_DH_PLAIN_XYexternalAccess - 如果为true则表示实例将在多个applet实例之间共享并且当KeyAgreement实例的所有者不是当前选定的applet时也将访问KeyAgreement实例(通过Shareable接口)。如果为true则实现不得为内部数据分配CLEAR_ON_DESELECT瞬态空间。然后keyAgreement.init(privateKey)privateKey存了对应于小红的私钥kA注意这个privateKey一定要在之前设定好secp256k1对应的参数(ledger源码中定义了Secp256k1类只需调用Secp256k1.setCommonCurveParameters(privateKey)设置参数)并且也放入了私钥值kA(调用setS()来存)init()功能是使用给定的私钥初始化对象。检查密钥与KeyAgreement算法的一致性。例如密钥类型必须匹配。对于椭圆曲线算法key必须表示曲线域参数上的有效点。其他关键组件/域参数强度检查是特定于实现的。接着就是流程中小红生成QA(QA结果存放在publicPoint中)keyAgreement.generateSecret(Secp256k1.SECP256K1_G, (short)0,(short)Secp256k1.SECP256K1_G.length, publicPoint, publicPointOffset);generateSecret函数generateSecret就是实现密钥交换中的这两部分的曲线上乘法例如kA*GQA输出的结果根据所选择的算法不同是不同的具体的带有_PLAIN输出结果就是原始的与之对应不带有PLAIN的则是输出将原始结果通过SHA-1散列后得到的20字节的结果。带有_XY输出结果是未压缩完整的结果QA(65字节)与之对应的不带有_XY的则是压缩形式的结果(只有QA的x坐标即32字节)带有_DHC和带有_DH的输出是一样的只是DHC是 with cofactor multiplication and compatibility mode注综上ledger中源码应选择同时带有_PLAIN和_XY的算法即 ALG_EC_SVDP_DH_PLAIN_XY