椭圆曲线原理:

椭圆曲线的图像并不是椭圆形,椭圆曲线源自于求椭圆弧长的椭圆积分的反函数。

定义:

椭圆曲线可用下列方程来表示,其中a,b,c,d为系数。

E: y2 =ax3 + bx2 +cx +d

椭圆曲线运算:(相当于交换群)

A+B:

过曲线上两点A,B画一条直线,找到直线与椭圆曲线的的交点,将该交点关于x轴对称位置的点定义为A+B。

A+A:

画出曲线在A点的切线,找到该切线与椭圆曲线的交点,将该交点关于x轴对称位置的点定义为A+A,即2A。

-A:

A点关于X轴对称位置的点定义为-A。

那A+(-A)怎样定义?

认为A和-A间的这条直线在无穷远处相交,这个点图像上画不出来,记为O。

基于上边的运算,如果有椭圆曲线上一个点G,可以求2G,3G,。。。点的坐标。就是说给定G,求xG并不困难。但反过来很难!(椭圆曲线上的离散对数问题)

椭圆曲线上的离散对数问题

本质上就是“已知点xG求数x的问题”。

密码学中的椭圆曲线

密码学中的椭圆曲线运算不是在光滑曲线上进行,并不能使用上面的实数域上的椭圆曲线,因为

1. 实数域上的椭圆曲线是连续的,有无限个点,密码学要求有限点。

2. 实数域上的椭圆曲线的运算有误差,不精确。密码学要求精确。

所以我们需要引入有限域上的椭圆曲线。就是说不是在实数域R上,而是在有限域Fp上。

(x,y坐标的取值只能在有限域Fp中取)

Fp中只有p(p为素数)个元素0,1,2 …… p-2,p-1;

Fp 的加法(a+b)法则是 a+b≡c (mod p);即,(a+c)÷p的余数 和c÷p的余数相同。

比特币中ECDSA使用的椭圆曲线参数:secp256k1

有限域Fp定义:

p = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE FFFFFC2F

= 2256 - 232 - 29 - 28 - 27 - 26 - 24 - 1

Fp上的曲线E:y2 = x3 + ax + b定义如下:

a = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

b = 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,它是使得 nG=0 的最小正整数:

n = FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141

参数h,它是椭圆曲线群的阶跟由G生成的子群的阶的比值。是设计secp256k1时使用的参数,在具体实现中使用这个参数主要是出于安全性考虑,忽略它不影响理解。

h = 01

私钥公钥地生成过程:

用户随机生成一个小于 n 的大整数 k ,这就是私钥。

然后计算 Q=kG ,这就是公钥(注意,公钥是椭圆曲线上的一个点)。

ECDH过程:

假设公私钥是用于密钥交换,那么步骤如下(这里的乘法是指椭圆曲线上点的乘法):

part1:

小红生成私钥kA,将它乘以基点G得到公钥QA,即 kA *G=QA

小明生成私钥kB,将它乘以基点G得到公钥QB,即 kB *G=QB

part2:

小红计算 ( xk, yk ) = kA *QB, xk即为交换得到的密钥。

小明计算 ( xk, yk ) = kB *QA, xk即为交换得到的密钥。

最后,小红跟小明得到的密钥是相同的。

由以上过程,ECDH的part2部分最终交换得到的密钥是只用到曲线上的点32字节的x坐标值,是没用到y坐标的。

而part1部分,这个公钥QA则必须是全的xy坐标都有。

注:ledger源码中由32字节ECC私钥生成65字节(1+32x+32y)ECC公钥的过程实际只用到了part1,只要得到Q的x和y坐标。

javacard中的ECDH

javacard.security.KeyAgreement

KeyAgreement类是密钥协商算法的基类,例如Diffie-Hellman和EC Diffie-Hellman [IEEE P1363]。 KeyAgreement算法的实现必须扩展此类并实现所有抽象方法。撕裂或卡重置事件将初始化的KeyAgreement对象重置为先前通过调用init()初始化时所处的状态。

在用这个类实现ECDH时,

首先,

private KeyAgreement keyAgreement;

keyAgreement=KeyAgreement.getInstance(KeyAgreement.ALG_EC_SVDP_DH_PLAIN_XY,false);

getInstance

功能是创建所选算法的KeyAgreement对象实例。

public static final KeyAgreement getInstance(byte algorithm,

boolean externalAccess)

throws CryptoException

algorithm - 所需的密钥协商算法:例如:ALG_EC_SVDP_DH_PLAIN_XY

externalAccess - 如果为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*G=QA

输出的结果根据所选择的算法不同是不同的,具体的:

带有_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

java调用ecdh_椭圆曲线ECC ECDH原理 javacard实现相关推荐

  1. java ecdh算法_椭圆曲线ECC ECDH原理 javacard实现

    椭圆曲线原理: 椭圆曲线的图像并不是椭圆形,椭圆曲线源自于求椭圆弧长的椭圆积分的反函数. 定义: 椭圆曲线可用下列方程来表示,其中a,b,c,d为系数. E: y2 =ax3 + bx2 +cx +d ...

  2. ECC椭圆曲线加解密原理详解(配图)

    ECC椭圆曲线加解密原理详解(配图) 本文主要参照:ECC加密算法入门介绍及 ECC椭圆曲线详解(有具体实例) 前言: 椭圆曲线(ECC)加密原理跟RSA加解密原理比起来,可真是晦涩难懂.拜读了Kal ...

  3. ECC 算法原理JAVA 实现

    遗留问题 ECCurve.Fp与ECCurve.F2m区别? 概述 椭圆曲线算法依赖于椭圆曲线,只有椭圆曲线确定之后,才能基于此曲线去做加密.解密,加签.验签. 椭圆曲线算法同样有多种密钥长度,常用的 ...

  4. Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27

    Atitit.java jna  调用c  c++ dll的原理与实践  总结  v2  q27 1. Jna简单介绍1 2. Jna范例halo owrld1 3. Jna概念2 3.1. (1)需 ...

  5. DH密钥交换和ECDH原理

    DH密钥交换和ECDH原理 上述的就是DH密钥交互的图表: 可以这么理解,A与B想要生成只有彼此知道的密钥,而使得自己本地产生的私钥,不被对方知道,包括第三方的Eve. 此时的Alice 和Bob 彼 ...

  6. Java服务器热部署的实现原理

    [本文转载于Java服务器热部署的实现原理] 今天发现早年在大象笔记中写的一篇笔记,之前放在ijavaboy上的,现在它已经访问不了了.前几天又有同事在讨论这个问题.这里拿来分享一下. 在web应用开 ...

  7. JAVA层HIDL服务的获取原理-Android10.0 HwBinder通信原理(九)

    摘要:本节主要来讲解Android10.0 JAVA层HIDL服务的获取原理 阅读本文大约需要花费19分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的 ...

  8. JAVA层HIDL服务的注册原理-Android10.0 HwBinder通信原理(八)

    摘要:本节主要来讲解Android10.0 JAVA层HIDL服务的注册原理 阅读本文大约需要花费22分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的 ...

  9. java调节音量代码_用Java调用VC音量控制程序_java

    前言 本文通过java的Runtime接口来实现调用其他语言实现的应用程序,进而来实现对计算机硬件信息的监控和控制.本文是多媒体信息系统的一个部分,就是调整计算机音量. 使用VC编写音量控制程序 本控 ...

最新文章

  1. Java通过JDBC连接MySQL数据库
  2. the user operation is waiting for building workspace to complete解决办法
  3. mysql 乐观锁 命令_MySQL-乐观锁
  4. NumPy Ndarray 对象
  5. 【Python】判断列表中是否存在一个数
  6. bat小游戏代码大全_Python打砖块小游戏源代码
  7. 八十七、CSS水平垂直居中的布局方式
  8. e.printStackTrace() 会导致锁死?
  9. 如何修改wince的网络配置
  10. oracle gtx,ORACLE
  11. 【李宏毅机器学习】Introduction of ELMO、BERT、GPT(p25) 学习笔记
  12. linux 下串口转usb不能发送数据包,红帽redhat下 串口转USB问题 linux
  13. webstorm编辑器相关
  14. 20 Alarms, sigaction(), and Reentrant System Calls
  15. 汇编语言:程序如下,编写code段中的代码,将a段和b段中的数据一次相加,结果放到c段中
  16. 燃烧我的卡路里 ---- Flutter瘦内存瘦包之图片组件
  17. geddy mysql_以ToDoList应用来学习Geddy
  18. 故障树手册(Fault Tree handbook)(1)
  19. Vue使用js读取Excel数据
  20. 几款好用的录屏软件推荐

热门文章

  1. pro坚果android耗流量,深度使用坚果Pro3一个月,憋了一肚子话,不吐不快​
  2. android动态设置软键盘弹出模式,Android 弹出软键盘所遇到的坑及解决方法
  3. 黑马程序员iOS10.0新课程与苹果发布会在9月8号同步发布
  4. 已知男程序员穿格子衫,那么女程序员会穿格子裙吗?
  5. 数据库基础之范式理解
  6. R语言的for循环等简单运用
  7. C语言位操作详解(全网最全)
  8. 06 类与对象、封装、构造方法
  9. 音频(五)——性能指标
  10. ​【创作赢红包】sql常用语法