java调用ecdh_Jecc(java椭圆曲线加密库)学习笔记及ECDH实现

C++椭圆曲线库下载网址http://sourceforge.net/projects/libecc/files/,打开之后右边显示:

c0a7552e5106c0f7ce77a479f3e9c62c.png

点击红框里面链接:http://sourceforge.net/projects/jecc/?source=recommended,跳转到jecc下载页

0cf554a37b76c53d24c5f57435eeb356.png

点击下载即可。下载之后文件名是jecc-alpha1.1.tar.gz,直接用winrar解压即可,文件已存至网盘,链接: http://pan.baidu.com/s/1sjpEcqT 密码: e3yd。

接下来可以在myeclipse里面跑ecc程序了,首先新建程序:

b8dd360c81710d8eab232e901576679a.png

注意红框里面选择:Use project folder as root for sources and class files,不然运行时报错,接下来在project里面建立一个名为ecc的package,

用import将解压后的ecc目录下面的文件全部导入进来:

41d98972dfee62b0e8e18d2713c5849e.png

最后我选择了运行elliptic下面的run.java

7cdbfaf74faec9aa1693afc3b8d5d1bd.png

运行结果

3ab48e4c27375abb4fb3e0c84777f9d9.png

下面是一段我利用JECC写的用来实习ECDH代码,ECDH是基于ECC(EllipticCurveCryptosystems,椭圆曲线密码体制,参看ECC)的DH(

Diffie-Hellman)密钥交换算法。ECDH的参考网址:http://www.tuicool.com/articles/em6zEb。此代码没有随机生成一条椭圆曲线,而是自己规定了一条,这点有待改进。

package ecc.elliptic;

import java.math.BigInteger;

import java.io.*;

import java.util.*;

import java.util.zip.*;

public class Ecdh {

public static void main(String[] args) throws InsecureCurveException,

NotOnMotherException {

Random r1 = new Random(100);

BigInteger a = new BigInteger(60, r1);// Alice生成随机整数a

System.out.println("Alice:" + a);

Random r2 = new Random(20);

BigInteger b = new BigInteger(50, r2);// Bob生成随机整数b

System.out.println("Bob:" + b);

EllipticCurve e = new EllipticCurve(new BigInteger("1"),

new BigInteger("6"), new BigInteger("11"));

System.out.println("EllipticCurve: " + e + " created succesfully!");

// 生成基点G

ECPoint G = new ECPoint(e, new BigInteger("2"), new BigInteger("7"));

ECPoint A, B;

A = G.multiply(a);// 计算A=a*G

System.out.println("A=a*G: "+a + " * " + G + " = " + A);

B = G.multiply(b);// 计算B=b*G

System.out.println("B=b*G: "+b + " * " + G + " = " + B);

ECPoint Q1, Q2;

Q1 = A.multiply(b);// Bob收到Alice传递的A,计算Q =b*A

Q2 = B.multiply(a);// Alice收到Bob传递的B,计算Q`=a*B

System.out.println("Q1:"+Q1);

System.out.println("Q2:"+Q2);

System.out.print(Q1.equals(Q2));

}

}运行结果:

7bab11741d944c529b54dbb63a8bd325.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
椭圆曲线加密Elliptic Curve Cryptography,ECC)是一种公钥加密算法,可以用于加密和解密数据。在Java中,可以使用Bouncy Castle或者Java Cryptography Extension(JCE)提供的API来实现椭圆曲线加密和解密。 下面是一个使用Bouncy Castle实现椭圆曲线加密和解密的示例代码: ```java import org.bouncycastle.jce.ECNamedCurveTable; import org.bouncycastle.jce.spec.ECParameterSpec; import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.util.encoders.Hex; import javax.crypto.Cipher; import javax.crypto.KeyAgreement; import javax.crypto.spec.SecretKeySpec; import java.security.*; import java.security.interfaces.ECPrivateKey; import java.security.interfaces.ECPublicKey; import java.security.spec.ECGenParameterSpec; import java.util.Arrays; public class ECCExample { public static void main(String[] args) throws Exception { // 生成椭圆曲线参数 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec("secp256k1"); // 使用secp256k1曲线 keyPairGenerator.initialize(ecGenParameterSpec); KeyPair keyPairA = keyPairGenerator.generateKeyPair(); KeyPair keyPairB = keyPairGenerator.generateKeyPair(); // Alice生成本地密钥 KeyAgreement keyAgreementA = KeyAgreement.getInstance("ECDH", "BC"); keyAgreementA.init(keyPairA.getPrivate()); keyAgreementA.doPhase(keyPairB.getPublic(), true); byte[] secretKeyA = keyAgreementA.generateSecret(); // Bob生成本地密钥 KeyAgreement keyAgreementB = KeyAgreement.getInstance("ECDH", "BC"); keyAgreementB.init(keyPairB.getPrivate()); keyAgreementB.doPhase(keyPairA.getPublic(), true); byte[] secretKeyB = keyAgreementB.generateSecret(); // 密钥一致性校验 System.out.println("密钥一致性校验: " + Arrays.equals(secretKeyA, secretKeyB)); // 使用共享密钥进行加密和解密 SecretKeySpec secretKeySpecA = new SecretKeySpec(secretKeyA, "AES"); SecretKeySpec secretKeySpecB = new SecretKeySpec(secretKeyB, "AES"); Cipher cipherA = Cipher.getInstance("AES/ECB/PKCS5Padding"); Cipher cipherB = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipherA.init(Cipher.ENCRYPT_MODE, secretKeySpecA); cipherB.init(Cipher.DECRYPT_MODE, secretKeySpecB); byte[] encryptedData = cipherA.doFinal("Hello World!".getBytes()); byte[] decryptedData = cipherB.doFinal(encryptedData); System.out.println("解密结果: " + new String(decryptedData)); } } ``` 这段代码使用了Bouncy Castle来生成椭圆曲线参数和执行加密解密操作。首先,通过`KeyPairGenerator`生成椭圆曲线的密钥对,然后使用`KeyAgreement`进行密钥交换,生成共享密钥。最后,使用共享密钥进行加密和解密操作。 注意:为了运行这段代码,需要在项目中引入Bouncy Castle的依赖,可以通过Maven或者Gradle进行添加。 这只是一个简单的示例代码,实际应用中还需要考虑安全性和性能等方面的因素,并进行适当的参数选择和安全性处理。建议在实际使用时参考安全专家的建议和最佳实践。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值