非對稱加密的簽名和驗籤、加密和解密的Java語言實現
阿新 • • 發佈:2018-12-04
本文采用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