第九十六篇 ECC加密算法

1.1 椭圆曲线离散对数问题(Elliptic Curve Discrete Logarithm Problem):

椭圆曲线上的两个点P和Q,k为整数。

在这里插入图片描述

椭圆曲线加密的数学原理:

点P称为基点(base point);k为私钥(private key);Q为公钥(public key)

给定k和P,根据加法法则,计算Q很容易。

但给定P和Q,求k⾮常困难(实际应⽤ECC,质数p取的⾮常⼤,穷举出k⾮常困难)。

椭圆曲线 :

在这里插入图片描述

a=-2,b=4时椭圆曲线形状
在这里插入图片描述

1.2 数学定义:

基于椭圆曲线的群定义
在椭圆曲线的基础上,可以定义一个加法群:

所有椭圆曲线上的点,就是这个群里的元素
单位元就是0
点P的逆元是点P相对x坐标的对称点
加法定义如下:在椭圆曲线上,和一条直线相交的3个点P,Q以及R,三点相加满足

在这里插入图片描述

。也就说,椭圆曲线上的两点相加的结果,还在椭圆曲线上。
结合群的定义,可以证明定义的这个加法群,就是阿贝尔群。

1.3 椭圆曲线加法计算

在这里插入图片描述

如图所示: 点A(x1,y1) + B(x2,y2) 就等于交点关于x轴对称的点 A+B

在这里插入图片描述

1.4 椭圆曲线乘法计算

假如点A 和 点B 无限接近, 即点A和点B重合,计算A+B也就转换成了计算2A,就得到了 此处的Q=2A ,假如我们需要计算3A怎么计算?

A和2A都在椭圆曲线线,点A和点2A交点的关于x对称轴为点3A的结果:

在这里插入图片描述

计算点nA,并映射到mod23有限域上

在这里插入图片描述

1.5 加密过程:

在这里插入图片描述

  1. 选⼀条椭圆曲线Ep(a,b), 并取椭圆曲线上⼀点作为基点P。
  2. 选定⼀个⼤数k作为私钥,并⽣成公钥Q=kP。
  3. 加密:选择随机数r,将消息M⽣成密⽂C。密⽂是⼀个点对,即C=(rP, M+rQ)。
  4. 解密:M+rQ-k(rP) = M+r(kP)-k(rp) = M

1.6 有限域上的椭圆曲线运算

先做倍数再做加法。假设n=151,其对应的⼆进制是10010111。⽽⼆进制数字可以转化为:
在这里插入图片描述

1.7 基于ECDH隐私集合求交

在这里插入图片描述
协议

  1. Alice和Bob商定一个椭圆曲线 .
  2. Alice随机地生成一个私钥 .
  3. Alice 重复地对她的原始集合中的每个值进行散列,直到它们都是 的generator。例如,她可以迭代
  4. 对每个值应用SHA256,直到输出对应于曲线上某一点的 值。
  5. 对于这些散列值中的每一个 ,Alice计算出 ,其中 是曲线上的对应的点。
  6. Alice将她的计算值 发送给Bob。
  7. Bob随机生成一个私钥 。Bob重复地对他的原始集合中的每一个值进行散列处理,直到它们都是 的 generator(与Alice的做法相同)。
  8. Bob对于这些散列值中的每一个,计算出 。
  9. Bob通过计算Alice原始集合中的每个元素 来计算对应的共享密钥 。
  10. Bob将发给Alice。
  11. Alice通过计算Bob的原始集合中的每个元素所对应的共享密钥来计算 。
  12. Alice将从她自己的原始集合中的元素计算出来的共享密钥 与用Bob的元素计算出来的共享密钥 进行比较,找到交集。
  13. 在协议结束时,Bob只看到Alice用她的私钥散列和掩盖的值( ),而Alice只看到Bob的集合中类似的掩盖值,以及她自己的掩盖值乘以Bob的私钥( ).

窃听者 Eve 也看到了这些值,但由于我们假设在椭圆曲线上很难进行反向点乘,所以她无法从这两个集合中提取原始元素。如果使用密码哈希函数,它们也被隐藏在哈希函数后面,以获得额外的安全性。同样的情况也适用于Alice和Bob(Alice得到了交集的部分)。

与使用标准Diffie-Hellman的PSI一样,"共享密钥"根本不是真正的密钥;它们只被Alice用来比较。

在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Java实现ECC加密算法的示例代码: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.Signature; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class ECCDemo { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 生成密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); keyPairGenerator.initialize(256); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // 显示密钥对 System.out.println("Private key: " + Hex.toHexString(privateKey.getEncoded())); System.out.println("Public key: " + Hex.toHexString(publicKey.getEncoded())); // 签名 Signature signature = Signature.getInstance("SHA256withECDSA", "BC"); signature.initSign(privateKey); byte[] message = "Hello, world!".getBytes(); signature.update(message); byte[] signatureBytes = signature.sign(); System.out.println("Signature: " + Hex.toHexString(signatureBytes)); // 验证签名 signature.initVerify(publicKey); signature.update(message); boolean verified = signature.verify(signatureBytes); System.out.println("Verified: " + verified); } } ``` 该示例代码使用Bouncy Castle库实现了ECC加密算法,包括生成密钥对、签名和验证签名等操作。其中,生成密钥对使用256位的椭圆曲线,签名算法使用SHA256withECDSA。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值