椭圆曲线原理:

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

定义:

椭圆曲线可用下列方程来表示,其中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. Metasploit***技巧:后***Meterpreter代理
  2. 总结网站调用Flash的几种方法【转】
  3. 二分:路标设置(洛谷)
  4. 材料成形计算机辅助设计,材料成型及计算机辅助设计(综述)
  5. 【转】阿里技术专家详解 DDD 系列 第一讲- Domain Primitive
  6. iOS 静态库和动态库的基本介绍和使用
  7. cocos2d-x多分辨率自适配及因此导致的CCListView的bug修复
  8. 优先队列实现原理分析
  9. oracle 11g regexp_substr,oracle中REGEXP_SUBSTR方法的使用
  10. “幸运盒子”可悲的命运
  11. 办公室电脑怎么设置共享文件夹?
  12. 怎么关闭fcitx的简繁切换和vscode的查找快捷键冲突了
  13. opencv ipcam
  14. OptaPlanner
  15. 【真.干货】一篇文章了解关于计算机硬件那些事
  16. 学习go语言的一些笔记(三)
  17. html标签outclick,vue自定义指令(Directive中的clickoutside.js)的理解
  18. 入职前的背景调查到底在查什么?
  19. 阿里云服务器发送邮件
  20. 天猫登录 post java_天猫登录POST问题

热门文章

  1. 错误:The driver has not received any packets from the server.
  2. 【git】vscode敲stash相关命令Too many revisions specified
  3. 独立AIGC潮头 昆仑万维发布昆仑天工AIGC全系列算法与模型
  4. JavaScript 原型对象和原型链理解
  5. ctfshow-web入门-爆破wp
  6. Hive中数据导入或导出
  7. CF922 CodeForces Round #461(Div.2)
  8. 什么是项目型组织结构?
  9. 贴片电容封装尺寸与常规的贴片电阻的标准封装及额定功率
  10. 分布式事物与分布式架构