1. 程式人生 > >非對稱加密的簽名和驗籤、加密和解密的Java語言實現

非對稱加密的簽名和驗籤、加密和解密的Java語言實現

本文采用java.security包的簽名和驗籤。採用A的私鑰簽名傳送至B,B採用A的公鑰進行驗籤。

加解密可以私鑰加密、公鑰解密(或者公鑰加密、私鑰解密)。

一般用於銀行報文傳輸、支付寶、微信、銀行以及各大銀行的資料交換。

package com.example.demo;

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.Signature;

import javax.crypto.Cipher;

import org.springframework.util.Base64Utils;

public class TestUint {
	
	public static final String SIGNATURE_ALGORITHM = "MD5withRSA";
	public static final byte[] data="xyz_test".getBytes();
	public static void main(String[] args) throws Exception {
		KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
		SecureRandom random = new SecureRandom();
		// 初始加密,512位已被破解,用1024位,用2048位更安全
		keygen.initialize(1024, random);
		// 取得金鑰對  
		KeyPair kp = keygen.generateKeyPair();

//		System.out.println("==公鑰==");
		PublicKey pubK = kp.getPublic();
		System.err.println("公鑰:"+Base64Utils.encodeToString(pubK.getEncoded()));
		
//		System.out.println("==私鑰==");
		PrivateKey priK = kp.getPrivate();
		System.err.println("私鑰:"+Base64Utils.encodeToString(priK.getEncoded()));
		

		/**簽名**/
		Signature sig = Signature.getInstance(SIGNATURE_ALGORITHM);
		sig.initSign(priK);
		sig.update(data);
		byte[] s=sig.sign();
		System.out.println("簽名內容:"+Base64Utils.encodeToString(s));
		/**驗籤**/
		sig.initVerify(pubK);
		sig.update(data);
		boolean b=sig.verify(s);
		System.out.println("驗簽結果:"+b);
		
		/**加密**/
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, pubK);
		byte[] bt_encrypted = cipher.doFinal(data);
		System.err.println(Base64Utils.encodeToString(bt_encrypted));
		/**解密**/
		cipher.init(Cipher.DECRYPT_MODE, priK);
		byte[] sec=cipher.doFinal(bt_encrypted);
		System.err.println(new String(sec));
	}

}

介面PublicKey、PrivateKey都繼承了介面Key