java ecdh算法_椭圆曲线ECC ECDH原理 javacard实现
椭圆曲线原理:
椭圆曲线的图像并不是椭圆形,椭圆曲线源自于求椭圆弧长的椭圆积分的反函数。
定义:
椭圆曲线可用下列方程来表示,其中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实现相关推荐
- java python算法_用Python,Java和C ++示例解释的排序算法
java python算法 什么是排序算法? (What is a Sorting Algorithm?) Sorting algorithms are a set of instructions t ...
- java 线性回归算法_线性搜索或顺序搜索算法在Java中如何工作? 示例教程
java 线性回归算法 大家好,之前,我讨论了二进制搜索算法的工作原理,并分享了在Java中实现二进制搜索的代码. 在那篇文章中,有人问我是否还有其他搜索算法? 如果数组中的元素未排序,又该如何使用它 ...
- java python算法_用Java,Python和C ++示例解释的搜索算法
java python算法 什么是搜索算法? (What is a Search Algorithm?) This kind of algorithm looks at the problem of ...
- java轮训算法_负载均衡算法WeightedRoundRobin(加权轮询)简介及算法实现
Nginx的负载均衡默认算法是加权轮询算法,本文简单介绍算法的逻辑,并给出算法的Java实现版本. 算法简介 有三个节点{a, b, c},他们的权重分别是{a=5, b=1, c=1}.发送7次请求 ...
- java调用ecdh_椭圆曲线ECC ECDH原理 javacard实现
椭圆曲线原理: 椭圆曲线的图像并不是椭圆形,椭圆曲线源自于求椭圆弧长的椭圆积分的反函数. 定义: 椭圆曲线可用下列方程来表示,其中a,b,c,d为系数. E: y2 =ax3 + bx2 +cx +d ...
- java图像识别算法_图像算法原理与实践——绪论
本系列文章是写给程序源的数字图像处理教程,从最基础的知识来讲解数字图像处理专业知识,通过最基本的编码方式来实践相应的处理算法,从而使得大家掌握基础的图像处理知识. 关于图像处理知识,在高校课程中,比较 ...
- java mllib 算法_朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)
朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...
- java移动平均线算法_移动平均线的原理是什么? 移动平均线计算公式详解
移动平均线的定义是将一段时期的股票价格加以平均,然后把不同时间的平均值连接起来成一条线,这就是移动平均线的本质,具体如何将股价加以平均就是它的算法问题了,一起来看看移动平均线的原理与算法是什么? 一. ...
- java不规则算法_分布式id生成算法 snowflake 详解
背景 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识.如在支付流水号.订单号等,随者业务数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需 ...
最新文章
- MySQL 学习笔记(5)— 视图优缺点、创建视图、修改视图、删除视图
- 通过 Keras 构建深度学习模型的步骤
- mysql 密码重置
- VTK:Utilities之UnknownLengthArray
- 【数学】数列(jzoj 2752)
- Linux内存管理:kmemcheck介绍
- BZOJ2042 : [2009国家集训队]Will的烦恼
- win7 修改欢迎登录界面
- Kaldi AMI数据集脚本学习7---train_deltas.sh
- CAD建模软件BricsCAD 22.2.03 for Mac
- 西工大疫情期间关于如何做好博士学位论文专题讲座笔记
- 【https】 1 HTTP Security (bb102-1)
- pycharm 更换 pip 下载源
- 知乎凡尔赛沙雕语录,究竟有多沙雕?
- 2017CS231n笔记_S11分割,定位,检测
- ADODB.Stream 错误 #x27;800a0bb9#x27; 参数类型不正确,或不在可以接受的范围之内,或与其他参数冲突。
- 基于OLT(实体、关系、标签)建模方法论的最佳实践 | StartDT Tech Lab 08
- Excel数据如何导入到Oracle数据库中
- 大数据学习的有哪些相关书籍
- 机器学习实战分享:用 Python 进行信用卡欺诈检测
热门文章
- linux c 宏定义 #define _GNU_SOURCE 含义
- linux服务 Systemd 简介
- linux c 客户端与 golang 服务端通信(网络字节序)
- C++ string类型占几个字节
- Android--DPAD键的事件处理
- java邮件支持_使用Spring的JAVA Mail支持简化邮件发送功能
- mysql修改字段为现在时间_mysql如何修改字段自动生成时间
- python编辑svg文件_SVG 文本
- video.min.js php,使用flv.js与video.js做一个视频直播效果
- python sanic部署_Sanic框架配置操作分析