DSS:數字簽名標準
DSA:數字簽名算法
DSA和RSA區別:
- DSA:僅包含數字簽名
- RSA:既包含數字簽名也包含數字加密
DSA簽名和RSA簽名Java jdk提供的實現代碼基本一樣,BC提供的沒學學習過不知道啥情況。
直接上代碼吧:
public class DemoDsa {
public static void jdkDSA(String data) {
// 初始化密鑰
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("DSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//0. 獲取公鑰和密鑰
DSAPublicKey dsaPublicKey = (DSAPublicKey) keyPair.getPublic();
DSAPrivateKey dsaPrivateKey = (DSAPrivateKey) keyPair.getPrivate();
//1.執行簽名
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(dsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("DSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("SHAwithDSA");
signature.initSign(privateKey);
signature.update(data.getBytes());
//加密後的結果
byte[] result = signature.sign();
//打印數據
StringBuilder hexString = new StringBuilder();
for (int i = 0; i < result.length; i++) {
if ((result[i] & 0xff) < 0x10)
hexString.append("0");
hexString.append(Integer.toHexString(0xFF & result[i]));
}
System.out.println("加密後的數據:" + hexString.toString().toLowerCase());
//3.驗證簽名
X509EncodedKeySpec x509EncodedKeySpec=new X509EncodedKeySpec(dsaPublicKey.getEncoded());
keyFactory=KeyFactory.getInstance("DSA");
PublicKey publicKey=keyFactory.generatePublic(x509EncodedKeySpec);
signature=Signature.getInstance("SHAwithDSA");
signature.initVerify(publicKey);
signature.update(data.getBytes());
//驗證後的結果
boolean isOk=signature.verify(result);
System.out.println("驗證結果:"+isOk);
} catch (Exception e) {
e.printStackTrace();
}
}
}
調用這個簽名:
jdkDSA("i love you");