数字签名算法的实现
来源:互联网 发布:淘宝产品参数 编辑:程序博客网 时间:2024/06/05 20:41
数字签名的基础是公钥和私钥的非对称加密,发送者使用私钥加密消息摘要(签名),接收者使用公钥解密消息摘要以验证签名是否是某个人的。
算法流程图:
实现类:
RSA.java
package com.rsa;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import org.apache.commons.codec.binary.Hex;public class RSA { private static String src = "海哥";public static void main(String[] args) {// TODO Auto-generated method stub jdkRSA();} public static void jdkRSA(){try {//1.初始化密钥KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(512);KeyPair keyPair = keyPairGenerator.generateKeyPair();RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic(); //用作验证RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate(); //用做签名//2.执行签名PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());//私钥进行签名KeyFactory keyFactory = KeyFactory.getInstance("RSA");//得到实例PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);Signature signature = Signature.getInstance("MD5withRSA"); //签名算法signature.initSign(privateKey); //初始化密钥signature.update(src.getBytes()); //产生签名byte [] result = signature.sign();System.out.println("数字签名后的密钥:"+Hex.encodeHexString(result));//签名后的结果//3.验证签名X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());//使用公钥来验证签名keyFactory = KeyFactory.getInstance("RSA"); //说明完整性PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);signature = Signature.getInstance("MD5withRSA");signature.initVerify(publicKey);//初始化验证方式signature.update(src.getBytes());boolean bool = signature.verify(result); //对原始数据的签名进行验证System.out.println("签名验证结果 :" + bool); //输出验证结果} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
实现结果:
数字签名后的密钥:2ce56c6357f73a171780547c4fc51407033766ea4f8ab1d1a252458a90f573e04d4fbfd58c7a6e85822cdca84766be8aea610b2a034c3a50b11db183717bdc63
签名验证结果 :true
总结:最近在做一个B/S项目用到的技术,就研究了点密码学和网络安全的知识,根据实现原理编写了这个简单的实现类。数字签名也算自己简单实现了一遍。
阅读全文
0 0
- 数字签名算法的实现
- 基于JDK的RSA算法实现数字签名
- Java实现数字签名算法
- RSA算法和RSA数字签名算法的实现
- 用DSA算法实现数字签名
- SM2数字签名算法java实现
- 数字签名算法SHA-1的FPGA高速实现
- Silverlight中非对称加密及数字签名RSA算法的实现
- 基于OpenSSL简单实现Shamir基于身份的数字签名算法
- Silverlight中非对称加密及数字签名RSA算法的实现
- 数字签名的技术实现
- CAD数字签名的实现
- SM2算法第十五篇:ECDSA数字签名算法的C语言实现
- 实现ActiveX控件的数字签名
- 数字签名算法
- 数字签名算法
- 从https的实现看数字证书、SSL、数字签名、摘要算法、对称/非对称加密
- Java中数字签名RSASignature 算法的使用
- STM32堆和栈(Heap & Stack)的资料理解
- Android Studio 开发中遇到的bug
- 谷歌开源TensorFlow Object Detection API物体识别系统
- servlet中的Filter过滤器
- Unicode和UTF-8的区别
- 数字签名算法的实现
- 三种特征归一化的方法之SumNormalizer
- C++字符串流操作
- 日志库EasyLogging++学习系列(9)—— 性能跟踪功能
- jquery 不区分元素根据name获取对象
- php代码标识
- C++编译器多态实现原理
- java弱引用软引用
- springmvc+maven+cxf