日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java加密与解密的艺术~数字签名~DSA实现

發布時間:2024/7/23 java 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java加密与解密的艺术~数字签名~DSA实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?DSA 實現

/*** 2008-6-13*/ package org.zlex.chapter09_2;import java.security.Key; import java.security.KeyFactory; 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 java.security.interfaces.DSAPrivateKey; import java.security.interfaces.DSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map;/*** DSA安全編碼組件* * @author 梁棟* @version 1.0*/ public abstract class DSACoder {/*** 數字簽名密鑰算法*/public static final String ALGORITHM = "DSA";/*** 數字簽名* 簽名/驗證算法*/public static final String SIGNATURE_ALGORITHM = "SHA1withDSA";/*** 公鑰*/private static final String PUBLIC_KEY = "DSAPublicKey";/*** 私鑰*/private static final String PRIVATE_KEY = "DSAPrivateKey";/*** DSA密鑰長度 * 默認1024位, * 密鑰長度必須是64的倍數, * 范圍在512至1024位之間(含)*/private static final int KEY_SIZE = 1024;/*** 簽名* * @param data* 待簽名數據* @param privateKey* 私鑰* @return byte[] 數字簽名* @throws Exception*/public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {// 還原私鑰// 轉換私鑰材料PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey);// 實例化密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);// 生成私鑰對象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 實例化SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 初始化Signaturesignature.initSign(priKey);// 更新signature.update(data);// 簽名return signature.sign();}/*** 校驗* * @param data* 待校驗數據* @param publicKey* 公鑰* @param sign* 數字簽名* * @return boolean 校驗成功返回true 失敗返回false* @throws Exception* */public static boolean verify(byte[] data, byte[] publicKey, byte[] sign)throws Exception {// 還原公鑰// 轉換公鑰材料X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);// 實例化密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);// 取公鑰匙對象PublicKey pubKey = keyFactory.generatePublic(keySpec);// 實例話SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 初始化Signaturesignature.initVerify(pubKey);// 更新signature.update(data);// 驗證return signature.verify(sign);}/*** 生成密鑰* * @return 密鑰對象* @throws Exception*/public static Map<String, Object> initKey() throws Exception {// 初始化密鑰對兒生成器KeyPairGenerator keygen = KeyPairGenerator.getInstance(ALGORITHM);// 實例化密鑰對兒生成器keygen.initialize(KEY_SIZE, new SecureRandom());// 實例化密鑰對兒KeyPair keys = keygen.genKeyPair();DSAPublicKey publicKey = (DSAPublicKey) keys.getPublic();DSAPrivateKey privateKey = (DSAPrivateKey) keys.getPrivate();// 封裝密鑰Map<String, Object> map = new HashMap<String, Object>(2);map.put(PUBLIC_KEY, publicKey);map.put(PRIVATE_KEY, privateKey);return map;}/*** 取得私鑰* * @param keyMap* 密鑰Map* @return byte[] 私鑰* @throws Exception*/public static byte[] getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return key.getEncoded();}/*** 取得公鑰* * @param keyMap* 密鑰Map* @return byte[] 公鑰* @throws Exception*/public static byte[] getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return key.getEncoded();} }

DSA 示例

/*** 2009-5-7*/ package org.zlex.chapter09_2;import static org.junit.Assert.*;import java.util.Map;import org.apache.commons.codec.binary.Base64; import org.apache.commons.codec.binary.Hex; import org.junit.Before; import org.junit.Test;/*** DSA簽名校驗* * @author 梁棟* @version 1.0*/ public class DSACoderTest {/*** 公鑰*/private byte[] publicKey;/*** 私鑰*/private byte[] privateKey;/*** 初始化密鑰* * @throws Exception*/@Beforepublic void initKey() throws Exception {Map<String, Object> keyMap = DSACoder.initKey();publicKey = DSACoder.getPublicKey(keyMap);privateKey = DSACoder.getPrivateKey(keyMap);System.err.println("公鑰: \n" + Base64.encodeBase64String(publicKey));System.err.println("私鑰: \n" + Base64.encodeBase64String(privateKey));}/*** 校驗簽名* * @throws Exception*/@Testpublic void test() throws Exception {String inputStr = "DSA數字簽名";byte[] data = inputStr.getBytes();// 產生簽名byte[] sign = DSACoder.sign(data, privateKey);System.err.println("簽名:\r" + Hex.encodeHexString(sign));// 驗證簽名boolean status = DSACoder.verify(data, publicKey, sign);System.err.println("狀態:\r" + status);assertTrue(status);}}

總結

以上是生活随笔為你收集整理的Java加密与解密的艺术~数字签名~DSA实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。