欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java使用RSA加密方式,实现数字签名

程序员文章站 2024-03-19 13:13:52
...

全栈工程师开发手册 (作者:栾鹏)

java教程全解

java使用RSA加密方式,实现数字签名。数字签名,使用私钥获取签名,使用公钥校验签名

测试代码

public static void main(String args[]) throws Exception{
        DigitalSignDemo ds=new DigitalSignDemo();
        ds.generateKey();  //产生私钥和公钥
        byte[] signeddata=ds.sign("test.txt");   //文件签名
        // 打印签名
        for(int i=0; i<signeddata.length; i++){
            System.out.println(signeddata[i]);
        }
        ds.checkSign("test.txt",signeddata);  //校验签名
    }

数字签名工具类的实现

package com.lp.app.safe;

import java.io.*;
import java.security.*;
import java.security.interfaces.*;

public class DigitalSignDemo{

    PublicKey pbkey;
    PrivateKey prkey;

    public void generateKey() {
        try {
            KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
            kpg.initialize(1024);
            KeyPair kp = kpg.genKeyPair();
            pbkey = kp.getPublic();
            prkey = kp.getPrivate();

        } catch (Exception e) {
        }
    }

    //文件签名
    public byte[] sign(String path) throws Exception{
        //获取要签名的数据
        FileInputStream f = new FileInputStream(path);
        int num = f.available();
        byte[] data = new byte[num];
        f.read(data);

        // 获取私钥
        RSAPrivateKey prk = (RSAPrivateKey)prkey;
        Signature s = Signature.getInstance("MD5WithRSA");
        s.initSign(prk);
        s.update(data);
        //数据签名
        byte[] signeddata = s.sign();

        return signeddata;
    }

    //校验签名
    public void checkSign(String path,byte[] signeddata) throws Exception{
        FileInputStream f = new FileInputStream(path);
        int num = f.available();
        byte[] data = new byte[num];
        f.read(data);
        // 读公钥
        RSAPublicKey pbk = (RSAPublicKey)pbkey;
        // 获取对象
        Signature s = Signature.getInstance("MD5WithRSA");
        //初始化
        s.initVerify(pbk);
        // 传入原始数据
        s.update(data);
        boolean ok = false;
        try{
            //用签名验证原始数据
            ok = s.verify(signeddata);
            System.out.println(ok);
        }
        catch(SignatureException e){
            System.out.println(e);
        }
        System.out.println("校验结束!");
    }


}