数字签名算法的实现

来源:互联网 发布:淘宝产品参数 编辑:程序博客网 时间: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项目用到的技术,就研究了点密码学和网络安全的知识,根据实现原理编写了这个简单的实现类。数字签名也算自己简单实现了一遍。

原创粉丝点击