java使用RSA加密方式,實現數字簽名

資料架構師發表於2017-10-07

全棧工程師開發手冊 (作者:欒鵬)

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("校驗結束!");
    }


}

相關文章