數字簽名--DSA實現
阿新 • • 發佈:2019-02-06
其實DSA的實現和RSA差不多,只是改了改介面名稱。
注意,我的程式碼只是用jdk實現,並沒有用BC,想學的人可以自己深究一下。
程式碼:
package Signature; 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.DSAPrivateKey; import java.security.interfaces.DSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; public class DSA { //jdk只提供了SHA1withDSA,其他的用BC實現 private static String dsa = "CYK"; public static void main(String[] args) { // TODO Auto-generated method stub jdkDSA(); } public static void jdkDSA() { //1.初始化祕鑰 KeyPairGenerator keyPairGenerator; try { keyPairGenerator = KeyPairGenerator.getInstance("DSA"); keyPairGenerator.initialize(512); KeyPair keyPair = keyPairGenerator.generateKeyPair(); DSAPublicKey dsaPublicKey = (DSAPublicKey)keyPair.getPublic(); DSAPrivateKey dsaPrivateKey = (DSAPrivateKey)keyPair.getPrivate(); //執行簽名 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded()); KeyFactory keyFactory = KeyFactory.getInstance("DSA"); //這一步注意更改一下catch,讓它獲取所有錯誤 PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); //宣告簽名的物件 Signature signature = Signature.getInstance("SHA1withDSA"); signature.initSign(privateKey); signature.update(dsa.getBytes()); byte[] result = signature.sign(); System.out.println("jdk dsa sign:" + result); //3.驗證簽名 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(dsaPublicKey.getEncoded()); keyFactory = KeyFactory.getInstance("DSA"); PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec); signature = Signature.getInstance("SHA1withDSA"); signature.initVerify(publicKey); signature.update(dsa.getBytes()); boolean bool = signature.verify(result); System.out.println("jdk dsa verify:" + bool); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }