「椭圆加密java」椭圆加密算法

博主:adminadmin 2023-03-21 10:52:10 542

今天给各位分享椭圆加密java的知识,其中也会对椭圆加密算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java加密的几种方式

基本的单向加密算法:

BASE64 严格地说,属于编码格式,而非加密算法

MD5(Message Digest algorithm 5,信息摘要算法)

SHA(Secure Hash Algorithm,安全散列算法)

HMAC(Hash Message Authentication Code,散列消息鉴别码)

复杂的对称加密(DES、PBE)、非对称加密算法:

DES(Data Encryption Standard,数据加密算法)

PBE(Password-based encryption,基于密码验证)

RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)

DH(Diffie-Hellman算法,密钥一致协议)

DSA(Digital Signature Algorithm,数字签名)

ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)

代码参考:

/**

* BASE64加密

*

* @param key

* @return

* @throws Exception

*/

public static String encryptBASE64(byte[] key) throws Exception {

return (new BASE64Encoder()).encodeBuffer(key);

}

/**

* MD5加密

*

* @param data

* @return

* @throws Exception

*/

public static byte[] encryptMD5(byte[] data) throws Exception {

MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);

md5.update(data);

return md5.digest();

}

/**

* SHA加密

*

* @param data

* @return

* @throws Exception

*/

public static byte[] encryptSHA(byte[] data) throws Exception {

MessageDigest sha = MessageDigest.getInstance(KEY_SHA);

sha.update(data);

return sha.digest();

}

}

/**

* 初始化HMAC密钥

*

* @return

* @throws Exception

*/

public static String initMacKey() throws Exception {

KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);

SecretKey secretKey = keyGenerator.generateKey();

return encryptBASE64(secretKey.getEncoded());

}

/**

* HMAC加密

*

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encryptHMAC(byte[] data, String key) throws Exception {

SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);

Mac mac = Mac.getInstance(secretKey.getAlgorithm());

mac.init(secretKey);

return mac.doFinal(data);

}

非对称加密算法 (RSA、DSA、ECC、DH)

非对称加密需要两个密钥:公钥(publickey) 和私钥 (privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公钥进行解密。因为加密和解密用的是不同的密钥,所以称为非对称加密。

非对称加密算法的保密性好,它消除了最终用户交换密钥的需要。但是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比对称加密慢上1000倍。

算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。

RSA、Elgamal、背包算法、Rabin、D-H、ECC (椭圆曲线加密算法)。使用最广泛的是 RSA 算法,Elgamal 是另一种常用的非对称加密算法。

收信者是唯一能够解开加密信息的人,因此收信者手里的必须是私钥。发信者手里的是公钥,其它人知道公钥没有关系,因为其它人发来的信息对收信者没有意义。

客户端需要将认证标识传送给服务器,此认证标识 (可能是一个随机数) 其它客户端可以知道,因此需要用私钥加密,客户端保存的是私钥。服务器端保存的是公钥,其它服务器知道公钥没有关系,因为客户端不需要登录其它服务器。

数字签名是为了表明信息没有受到伪造,确实是信息拥有者发出来的,附在信息原文的后面。就像手写的签名一样,具有不可抵赖性和简洁性。

简洁性:对信息原文做哈希运算,得到消息摘要,信息越短加密的耗时越少。

不可抵赖性:信息拥有者要保证签名的唯一性,必须是唯一能够加密消息摘要的人,因此必须用私钥加密 (就像字迹他人无法学会一样),得到签名。如果用公钥,那每个人都可以伪造签名了。

问题起源:对1和3,发信者怎么知道从网上获取的公钥就是真的?没有遭受中间人攻击?

这样就需要第三方机构来保证公钥的合法性,这个第三方机构就是 CA (Certificate Authority),证书中心。

CA 用自己的私钥对信息原文所有者发布的公钥和相关信息进行加密,得出的内容就是数字证书。

信息原文的所有者以后发布信息时,除了带上自己的签名,还带上数字证书,就可以保证信息不被篡改了。信息的接收者先用 CA给的公钥解出信息所有者的公钥,这样可以保证信息所有者的公钥是真正的公钥,然后就能通过该公钥证明数字签名是否真实了。

RSA 是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。

A 要把信息发给 B 为例,确定角色:A 为加密者,B 为解密者。首先由 B 随机确定一个 KEY,称之为私钥,将这个 KEY 始终保存在机器 B 中而不发出来;然后,由这个 KEY 计算出另一个 KEY,称之为公钥。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给 A,A 收到公钥后,利用公钥对信息加密,并把密文通过网络发送到 B,最后 B 利用已知的私钥,就能对密文进行解码了。以上就是 RSA 算法的工作流程。

由于进行的都是大数计算,使得 RSA 最快的情况也比 DES 慢上好几倍,无论是软件还是硬件实现。速度一直是 RSA 的缺陷。一般来说只用于少量数据加密。RSA 的速度是对应同样安全级别的对称密码算法的1/1000左右。

比起 DES 和其它对称算法来说,RSA 要慢得多。实际上一般使用一种对称算法来加密信息,然后用 RSA 来加密比较短的公钥,然后将用 RSA 加密的公钥和用对称算法加密的消息发送给接收方。

这样一来对随机数的要求就更高了,尤其对产生对称密码的要求非常高,否则的话可以越过 RSA 来直接攻击对称密码。

和其它加密过程一样,对 RSA 来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设 A 交给 B 一个公钥,并使 B 相信这是A 的公钥,并且 C 可以截下 A 和 B 之间的信息传递,那么 C 可以将自己的公钥传给 B,B 以为这是 A 的公钥。C 可以将所有 B 传递给 A 的消息截下来,将这个消息用自己的密钥解密,读这个消息,然后将这个消息再用 A 的公钥加密后传给 A。理论上 A 和 B 都不会发现 C 在偷听它们的消息,今天人们一般用数字认证来防止这样的攻击。

(1) 针对 RSA 最流行的攻击一般是基于大数因数分解。1999年,RSA-155 (512 bits) 被成功分解,花了五个月时间(约8000 MIPS 年)和224 CPU hours 在一台有3.2G 中央内存的 Cray C916计算机上完成。

RSA-158 表示如下:

2009年12月12日,编号为 RSA-768 (768 bits, 232 digits) 数也被成功分解。这一事件威胁了现通行的1024-bit 密钥的安全性,普遍认为用户应尽快升级到2048-bit 或以上。

RSA-768表示如下:

(2) 秀尔算法

量子计算里的秀尔算法能使穷举的效率大大的提高。由于 RSA 算法是基于大数分解 (无法抵抗穷举攻击),因此在未来量子计算能对 RSA 算法构成较大的威胁。一个拥有 N 量子位的量子计算机,每次可进行2^N 次运算,理论上讲,密钥为1024位长的 RSA 算法,用一台512量子比特位的量子计算机在1秒内即可破解。

DSA (Digital Signature Algorithm) 是 Schnorr 和 ElGamal 签名算法的变种,被美国 NIST 作为 DSS (DigitalSignature Standard)。 DSA 是基于整数有限域离散对数难题的。

简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名,如果数据和签名不匹配则认为验证失败。数字签名的作用就是校验数据在传输过程中不被修改,数字签名,是单向加密的升级。

椭圆加密算法(ECC)是一种公钥加密算法,最初由 Koblitz 和 Miller 两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成 Abel 加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。

ECC 的主要优势是在某些情况下它比其他的方法使用更小的密钥 (比如 RSA),提供相当的或更高等级的安全。ECC 的另一个优势是可以定义群之间的双线性映射,基于 Weil 对或是 Tate 对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。

ECC 被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。

比特币钱包公钥的生成使用了椭圆曲线算法,通过椭圆曲线乘法可以从私钥计算得到公钥, 这是不可逆转的过程。

Java 中 Chipher、Signature、KeyPairGenerator、KeyAgreement、SecretKey 均不支持 ECC 算法。

DH,全称为"Diffie-Hellman",它是一种确保共享 KEY 安全穿越不安全网络的方法,也就是常说的密钥一致协议。由公开密钥密码体制的奠基人 Diffie 和 Hellman 所提出的一种思想。简单的说就是允许两名用户在公开媒体上交换信息以生成"一致"的、可以共享的密钥。也就是由甲方产出一对密钥 (公钥、私钥),乙方依照甲方公钥产生乙方密钥对 (公钥、私钥)。

以此为基线,作为数据传输保密基础,同时双方使用同一种对称加密算法构建本地密钥 (SecretKey) 对数据加密。这样,在互通了本地密钥 (SecretKey) 算法后,甲乙双方公开自己的公钥,使用对方的公钥和刚才产生的私钥加密数据,同时可以使用对方的公钥和自己的私钥对数据解密。不单单是甲乙双方两方,可以扩展为多方共享数据通讯,这样就完成了网络交互数据的安全通讯。

具体例子可以移步到这篇文章: 非对称密码之DH密钥交换算法

参考:

比特币源码研读一:椭圆曲线在比特币密码中的加密原理

参加比特币源码研读班后首次写作,看到前辈black写的有关密钥,地址写的很好了,就选了他没有写的椭圆曲线,斗胆写这一篇。

在密码学上有两种加密方式,分别是对称密钥加密和非对称密钥加密。

对称加密:加密和解密使用的同样的密钥。

非对称加密:加密和解密是使用的不同的密钥。

二战中图灵破解德军的恩尼格码应该就是用的对称加密,因为他的加密和解密是同一个密钥。比特币的加密是非对称加密,而且用的是破解难度较大的椭圆曲线加密,简称ECC。

非对称加密的通用原理就是用一个难以解决的数学难题做到加密效果,比如RSA加密算法。RSA加密算法是用求解一个极大整数的因数的难题做到加密效果的。就是说两个极大数相乘,得到乘积很容易,但是反过来算数一个极大整数是由哪两个数乘积算出来的就非常困难。

下面简要介绍一下椭圆曲线加密算法ECC。

首先椭圆曲线的通式是这个样子的:

一般简化为这个样子:

()发公式必须吐槽一下,太麻烦了。)

其中

这样做就排除了带有奇点的椭圆曲线,可以理解为所有的点都有一条切线。

图像有几种,下面列举几个:[1]

椭圆曲线其实跟椭圆关系不大,也不像圆锥曲线那样,是有圆锥的物理模型为基础的。在计算椭圆曲线的周长时,需要用到椭圆积分,而椭圆曲线的简化通式:

,周长公式在变换后有一项是这样的:,平方之后两者基本一样。

我们大体了解了椭圆曲线,就会有一个疑问,这个东西怎么加密的呢?也就是说椭圆曲线是基于怎样的数学难题呢?在此之前还得了解一些最少必要知识:椭圆曲线加法,离散型椭圆曲线。

椭圆曲线加法

数学家门从普通的代数运算中,抽象出了加群(也叫阿贝尔群或交换群),使得在加群中,实数的算法和椭圆曲线的算法得到统一。

数学中的“群”是一个由我们定义了一种二元运算的集合,二元运算我们称之为“加法”,并用符号“+”来表示。为了让一个集合G成为群,必须定义加法运算并使之具有以下四个特性:

1. 封闭性:如果a和b是集合G中的元素,那么(a + b)也是集合G中的元素。

2. 结合律:(a + b) + c = a + (b + c);

3. 存在单位元0,使得a + 0 = 0 + a =a;

4. 每个元素都有逆元,即:对于任意a,存在b,使得a + b = 0.

如果我们增加第5个条件:

5. 交换律: a + b = b + a

那么,称这个群为阿贝尔群。[1]

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

特别的,当P和Q重合时,P+Q=P+P=2P,对于共线的三点,P,Q,R’有P+Q+R’=0∞.

这里的0∞不是实数意义的0,而是指的无穷远点(这里的无穷远点就不细说了,你可以理解为这个点非常遥远,遥远到两条平行线都在这一点相交了。具体介绍可以看参考文献[2])。

注意这里的R与R’之间的区别,P+Q=R,R并没有与P,Q共线,是R’与P,Q共线,不要搞错了。

法则详解:

这里的+不是实数中普通的加法,而是从普通加法中抽象出来的加法,他具备普通加法的一些性质,但具体的运算法则显然与普通加法不同。

根据这个法则,可以知道椭圆曲线无穷远点O∞与椭圆曲线上一点P的连线交于P’,过P’作y轴的平行线交于P,所以有无穷远点 O∞+ P = P 。这样,无穷远点 O∞的作用与普通加法中零的作用相当(0+2=2),我们把无穷远点 O∞ 称为零元。同时我们把P’称为P的负元(简称,负P;记作,-P)。(参见下图)

离散型椭圆曲线

上面给出的很好看的椭圆曲线是在实数域上的连续曲线,这个是不能用来加密的,原因我没有细究,但一定是连续曲线上的运算太简单。真正用于加密的椭圆曲线是离散型的。要想有一个离散型的椭圆曲线,先得有一个有限域。

域:在抽象代数中,域(Field)之一种可进行加、减、乘、除运算的代数结构。它是从普通实数的运算中抽像出来的。这一点与阿贝尔群很类似。只不过多了乘法,和与乘法相关的分配率。

域有如下性质[3]:

1.在加法和乘法上封闭,即域里的两个数相加或相乘的结果也在这个域中。

2.加法和乘法符合结合律,交换率,分配率。

3.存在加法单位,也可以叫做零元。即存在元素0,对于有限域内所有的元素a,有a+0=a。

4.存在乘法单位,也可以叫做单位元。即存在元素1,对于有限域内所有的元素a,有1*a=a。

5.存在加法逆元,即对于有限域中所有的元素a,都存在a+(-a)=0.

6.存在乘法逆元,即对于有限域中所有的元素a,都存在a*=0.

在掌握了这些知识后,我们将椭圆曲线离散化。我们给出一个有限域Fp,这个域只有有限个元素。Fp中只有p(p为素数)个元素0,1,2 …… p-2,p-1;

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

Fp 的乘法(a×b)法则是 a×b≡c (mod p);

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

Fp 的单位元是1,零元是 0(这里的0就不是无穷远点了,而是真正的实数0)。

下面我们就试着把

这条曲线定义在Fp上:

选择两个满足下列条件的小于p(p为素数)的非负整数a、b,且a,b满足

则满足下列方程的所有点(x,y),再加上无穷远点O∞ ,构成一条椭圆曲线。

其中 x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。

图是我手画的,大家凑合看哈。不得不说,p取7时,别看只有10个点,但计算量还是很大的。

Fp上的椭圆曲线同样有加法,法则如下:

        1. 无穷远点 O∞是零元,有O∞+ O∞= O∞,O∞+P=P

        2. P(x,y)的负元是 (x,-y),有P+(-P)= O∞

3. P(x1,y1),Q(x2,y2)的和R(x3,y3) 有如下关系:

x3≡-x1-x2(mod p)

y3≡k(x1-x3)-y1(mod p)

其中若P=Q 则 k=(3+a)/2y1 若P≠Q,则k=(y2-y1)/(x2-x1)

通过这些法则,就可以进行离散型椭圆曲线的计算。

例:根据我画的图,(1,1)中的点P(2,4),求2P。

解:把点带入公式k=(3*x∧2+a)/2y1

有(3*2∧2+1)/2*4=6(mod 7).

(注意,有些小伙伴可能算出13/8,这是不对的,这里是模数算数,就像钟表一样,过了12点又回到1点,所以在模为7的世界里,13=6,8=1).

x=6*6-2-2=4(mod 7)

y=6*(2-4)-4=2 (mod 7)

所以2P的坐标为(2,4)

那椭圆曲线上有什么难题呢?在模数足够大的情况下,上面这个计算过程的逆运算就足够难。

给出如下等式:

K=kG (其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数)不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。

这就是椭圆曲线加密算法采用的难题。我们把点G称为基点(base point),k称为私钥,K称为公钥。

现在我们描述一个利用椭圆曲线进行加密通信的过程[2]:

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(rn)。

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进行解码就可以得到明文。

整个过程如下图所示:

密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:

T=(p,a,b,G,n,h),p 、a 、b 用来确定一条椭圆曲线,G为基点,n为点G的阶,h 是椭圆曲线上所有点的个数m与n相除的整数部分

这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;

2、p≠n×h;

3、pt≠1 (mod n),1≤t20;

4、4a3+27b2≠0 (mod p);

5、n 为素数;

6、h≤4。

200位位的一个数字,那得多大?而且还是素数,所以这种方式是非常安全的。而且再一次交易中,区块被记录下来只有10分钟的时间,也就是说要想解决这个难题必须在10分钟以内。即便有技术能够在10分钟以内破解了现在这个难度的加密算法,比特币社区还可以予以反制,提高破解难度。所以比特币交易很安全,除非自己丢掉密钥,否则不存在被破解可能。

第一次写一个完全陌生的数学领域的知识,也许我有错误的地方,也许有没讲明白的地方,留言讨论吧。总之写完后对比特比系统的安全性表示很放心。

参考文献

[1] 椭圆曲线密码学简介

[2] 什么是椭圆曲线加密(ECC)

[3] 域(数学)维基百科

区块链研习社源码研读班 高若翔

椭圆曲线加密算法原理

椭圆曲线加密算法,简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。

相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在公开密钥加密和电子商业中RSA被广泛使用。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密(有待考证)。

比特币Bitcoin使用了 secp256k1这条特殊的椭圆曲线:Y的平方=X的三次方+7.

一、阿贝尔群

椭圆曲线也可以有运算,像实数的加减乘除一样,这就需要使用到加群。19世纪挪威的尼尔斯·阿贝尔抽象出了加群(又叫阿贝尔群或交换群)。数学中的群是一个集合,我们为它定义了一个“加法”,并用符号+表示。假定群用 表示,则加法必须遵循以下四个特性:

封闭性:如果a和b都是 的成员,那么a+b也是 的成员;

结合律:(a + b) + c = a + (b + c);

单位元:a+0=0+a=a,0就是单位元;

逆元:对于任意值a必定存在b,使得a+b=0。

如果再增加一个条件,交换律:a + b = b + a,则称这个群为阿贝尔群,根据这个定义整数集是个阿贝尔群。

理解椭圆曲线加密算法

椭圆曲线加密算法,即:Elliptic Curve Cryptography,简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密。

一般椭圆曲线方程式表示为:(其中a,b,c,d为系数)

y2=ax3+ bx2+cx+d

典型的椭圆曲线如:y2=x3−4x2+16

先摆一个栗子:

小米很难算到的那个数,就是公钥密码算法中的私钥(一个公钥密码算法安全的必要条件(非充分)是“由公钥不能反推出私钥”),公钥密码算法最根本的原理是利用信息的不对称性:即掌握私钥的人在整个通信过程中掌握最多的信息。

椭圆曲线加密算法是一个基于加法阶数难求问题的密码方案。 对于椭圆曲线来讲,椭圆曲线的基点就是例子里面的5,而私钥就是基点的加法阶数(例子里面的11),公钥是基点(5)进行对应阶数的加法(11次)得到的结果(55)。

简单描述就是:G * k = K (G,K公开,k保密)

上述例子相对简单,椭圆曲线加密算法里的加法建立在 “有限域上的二元三次曲线上的点”上 ,组成一个“有限加法循环群”。具体的说,这个加法的几何定义如下图,两个点的加法结果是指这两点的连线和曲线的交点关于x轴的镜像。

如果我们从某一点出发(所谓的单位元,比如正整数域的1,代表一个空间里的最基本单元),不停做自增操作(所谓群操作,比如++),枚举出整个空间的集合元素。如图:

因此给定椭圆曲线的某一点G,从G出发,不停做切线,找对称点,依次得到-2G,2G,-4G,4G,-8G,8G... 。即:当给定G点时,已知x,求xG点并不困难。反之,已知xG点,求x则非常困难。即Q = NG,N就是我们的私钥,Q就是我们的公钥。

现在我们知道了公钥(Q)和私钥(N)的生成的原理,我们在看看椭圆曲线数字签名算法(ECDSA)的过程,椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准。

私钥主要用于 签名,解密 ;公钥主要用于 验签,加密 ,可以通过私钥可以计算出公钥,反之则不行。

公钥加密:公钥加密的内容可以用私钥来解密——只有私钥持有者才能解密。

私钥签名:私钥签名的内容可以用公钥验证。公钥能验证的签名均可视为私钥持有人所签署。

通常需要六个参数来描叙一个特定的椭圆曲线:T = (p, a, b, G, n, h).

p: 代表有限域Fp的那个质数 a,b:椭圆方程的参数 G: 椭圆曲线上的一个基点G = (xG, yG) n:G在Fp中规定的序号,一个质数。 h:余因数(cofactor),控制选取点的密度。h = #E(Fp) / n。

这里以secp256k1曲线(比特币签名所使用的曲线)为例介绍一下公私钥对的产生的过成。

secp256k1的参数为:

本质上ECDSA的私钥就是一个随机数满足在曲线G的n阶里及k∈(0,n),根据Q=kG可以计算出公钥,生成的私钥一般为32字节大小,公钥通常为64个字节大小。如:

ECDSA签名算法的输入是数据的哈希值,而不是数据的本身,我们假设用户的密钥对:(d, Q);(d为私钥,Q为公钥) 待签名的信息:M; e = Hash(M);签名:Signature(e) = ( r, s)。

签名接口:

验证接口:

一个例子:

椭圆曲线加密算法

椭圆曲线加密算法,即:Elliptic Curve Cryptography,简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密。

椭圆曲线在密码学中的使用,是1985年由Neal Koblitz和Victor Miller分别独立提出的。

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

例如,当a=1,b=0,c=-2,d=4时,所得到的椭圆曲线为:

该椭圆曲线E的图像如图X-1所示,可以看出根本就不是椭圆形。

过曲线上的两点A、B画一条直线,找到直线与椭圆曲线的交点,交点关于x轴对称位置的点,定义为A+B,即为加法。如下图所示:A + B = C

上述方法无法解释A + A,即两点重合的情况。因此在这种情况下,将椭圆曲线在A点的切线,与椭圆曲线的交点,交点关于x轴对称位置的点,定义为A + A,即2A,即为二倍运算。

将A关于x轴对称位置的点定义为-A,即椭圆曲线的正负取反运算。如下图所示:

如果将A与-A相加,过A与-A的直线平行于y轴,可以认为直线与椭圆曲线相交于无穷远点。

综上,定义了A+B、2A运算,因此给定椭圆曲线的某一点G,可以求出2G、3G(即G + 2G)、4G......。即:当给定G点时,已知x,求xG点并不困难。反之,已知xG点,求x则非常困难。此即为椭圆曲线加密算法背后的数学原理。

椭圆曲线要形成一条光滑的曲线,要求x,y取值均为实数,即实数域上的椭圆曲线。但椭圆曲线加密算法,并非使用实数域,而是使用有限域。按数论定义,有限域GF(p)指给定某个质数p,由0、1、2......p-1共p个元素组成的整数集合中定义的加减乘除运算。

假设椭圆曲线为y² = x³ + x + 1,其在有限域GF(23)上时,写作:y² ≡ x³ + x + 1 (mod 23)

此时,椭圆曲线不再是一条光滑曲线,而是一些不连续的点,如下图所示。以点(1,7)为例,7² ≡ 1³ + 1 + 1 ≡ 3 (mod 23)。如此还有如下点:

(0,1) (0,22)(1,7) (1,16)(3,10) (3,13)(4,0)(5,4) (5,19)(6,4) (6,19)(7,11) (7,12)(9,7) (9,16)(11,3) (11,20)等等。

另外,如果P(x,y)为椭圆曲线上的点,则-P即(x,-y)也为椭圆曲线上的点。如点P(0,1),-P=(0,-1)=(0,22)也为椭圆曲线上的点。

相关公式如下:有限域GF(p)上的椭圆曲线y² = x³ + ax + b,若P(Xp, Yp), Q(Xq, Yq),且P≠-Q,则R(Xr,Yr) = P+Q 由如下规则确定:

Xr = (λ² - Xp - Xq) mod pYr = (λ(Xp - Xr) - Yp) mod p其中λ = (Yq - Yp)/(Xq - Xp) mod p(若P≠Q), λ = (3Xp² + a)/2Yp mod p(若P=Q)

因此,有限域GF(23)上的椭圆曲线y² ≡ x³ + x + 1 (mod 23),假设以(0,1)为G点,计算2G、3G、4G...xG等等,方法如下:

计算2G:λ = (3x0² + 1)/2x1 mod 23 = (1/2) mod 23 = 12Xr = (12² - 0 - 0) mod 23 = 6Yr = (12(0 - 6) - 1) mod 23 = 19即2G为点(6,19)

计算3G:3G = G + 2G,即(0,1) + (6,19)λ = (19 - 1)/(6 - 0) mod 23 = 3Xr = (3² - 0 - 6) mod 23 = 3Yr = (3(0 - 3) - 1) mod 23 = 13即3G为点(3, 13)

建立基于椭圆曲线的加密机制,需要找到类似RSA质因子分解或其他求离散对数这样的难题。而椭圆曲线上的已知G和xG求x,是非常困难的,此即为椭圆曲线上的的离散对数问题。此处x即为私钥,xG即为公钥。

椭圆曲线加密算法原理如下:

设私钥、公钥分别为k、K,即K = kG,其中G为G点。

公钥加密:选择随机数r,将消息M生成密文C,该密文是一个点对,即:C = {rG, M+rK},其中K为公钥

私钥解密:M + rK - k(rG) = M + r(kG) - k(rG) = M其中k、K分别为私钥、公钥。

椭圆曲线签名算法,即ECDSA。设私钥、公钥分别为k、K,即K = kG,其中G为G点。

私钥签名:1、选择随机数r,计算点rG(x, y)。2、根据随机数r、消息M的哈希h、私钥k,计算s = (h + kx)/r。3、将消息M、和签名{rG, s}发给接收方。

公钥验证签名:1、接收方收到消息M、以及签名{rG=(x,y), s}。2、根据消息求哈希h。3、使用发送方公钥K计算:hG/s + xK/s,并与rG比较,如相等即验签成功。

原理如下:hG/s + xK/s = hG/s + x(kG)/s = (h+xk)G/s= r(h+xk)G / (h+kx) = rG

假设要签名的消息是一个字符串:“Hello World!”。DSA签名的第一个步骤是对待签名的消息生成一个消息摘要。不同的签名算法使用不同的消息摘要算法。而ECDSA256使用SHA256生成256比特的摘要。

摘要生成结束后,应用签名算法对摘要进行签名:

产生一个随机数k

利用随机数k,计算出两个大数r和s。将r和s拼在一起就构成了对消息摘要的签名。

这里需要注意的是,因为随机数k的存在,对于同一条消息,使用同一个算法,产生的签名是不一样的。从函数的角度来理解,签名函数对同样的输入会产生不同的输出。因为函数内部会将随机值混入签名的过程。

关于验证过程,这里不讨论它的算法细节。从宏观上看,消息的接收方从签名中分离出r和s,然后利用公开的密钥信息和s计算出r。如果计算出的r和接收到的r值相同,则表示验证成功。否则,表示验证失败。

椭圆加密java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于椭圆加密算法、椭圆加密java的信息别忘了在本站进行查找喔。