eclipse实现ECDSA数字签名

2020-06-23 17:00 来源:易采站长站 作者:王振洲 点击: 评论:

A-A+

原标题:eclipse实现ECDSA数字签名

ECDSA数字签名,供大家参考,具体内容如下

一,实验目的

通过使用密码学库实现基于椭圆曲线的签名方案,能够编写简单的实验代码进行正确的ECDSA签名和验证。

二、 实验要求

熟悉ECDSA算法基本原理;
了解如何使用Java简单实现用ECDSA算法;
掌握用ECDSA签名算法的简单代码实验。

三、开发环境

JDK1.8,Java相关开发环境(本实验采用Windows+eclipse作为实验环境)要求参与实验的同学提前安装好jdk

四、实验内容

【1-1】 ECDSA签名和验证实验

1.使用如下的函数进行系统初始化并产生密钥:

public static void KeyGenerator() throws Exception {
//  //初始化签名
System.out.println("系统正在初始化……");
  KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
  keyPairGenerator.initialize(256);
  KeyPair keyPair = keyPairGenerator.generateKeyPair();
  ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic();
  ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate();
//把公钥和私钥分别存储在publicKey.key和privateKey.key文件里
String path = new File("").getCanonicalPath();
out(path + "\\privateKey.key", Base64.getEncoder().encodeToString(ecPrivateKey.getEncoded()));
out(path + "\\publicKey.key",Base64.getEncoder().encodeToString(ecPublicKey.getEncoded()));
  System.out.println("你的公钥存放在:" + path + "\\publicKey.key");
  System.out.println("你的私钥存放在:" + path + "\\privateKey.key");
  System.out.println("系统已完成初始化。");
 }

其中,使用public static KeyPairGenerator getInstance(String algorithm);产生密钥对生成器,这个方法需要一个字符串作为参数,用于说明使用哪个密钥算法,例如本算法中使用椭圆曲线“EC”。
使用public void initialize(int keysize);初始化密钥对。参数keysize用于说明生成的key的长度,理论上说是这个参数的值越大,加密的数据就越难以被破解,但在加密时也越消耗计算资源。
使用keyPairGenerator.generateKeyPair().getPublic();动态生成公钥
使用keyPairGenerator.generateKeyPair().getPrivate();动态生成私钥

2.使用如下的函数执行签名过程:

//执行签名过程

public static byte[] SignGen(byte[] ECprivateKey) throws Exception {
KeyFactory keyFactory = KeyFactory.getInstance("EC");
 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ECprivateKey);
 PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
 Signature signature = Signature.getInstance("SHA1withECDSA");
 signature.initSign(privateKey);
 signature.update(data.getBytes());
byte[] result = signature.sign();
return result;
}

其中,使用KeyFactory.getInstance(String algorithm);实例化一个密钥工厂,这个方法需要一个字符串作为参数,用于说明使用哪个密钥算法,例如本算法中使用椭圆曲线“EC”。

【易采站长站编辑:秋军】