簡介
數字簽名算法是帶有公鑰和私鑰的消息摘要算法,私鑰簽名,公鑰驗證,用來驗證數據完整性,驗證數據來源,抗否認。
數字簽名必須具備 5 個特性:
(1)簽名是可信的。
(2)簽名是不可僞造的。
(3)簽名是不可重用的。
(4)簽名的文件是不可改變的。
(5)簽名是不可抵賴的。
流行的有RSA、DSA、ECDSA算法。
RSA算法
包括MD和SHA兩類。其中 MD5withRSA 的java實現:
public class MyRSA {
private static String str = "guo feng";
public static void main(String[] args) {
try {
//初始化密鑰
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
//私鑰簽名
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initSign(privateKey);
signature.update(str.getBytes());
byte[] result = signature.sign();
System.out.println(new BigInteger(result));
//公鑰驗證
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
signature = Signature.getInstance("MD5withRSA");
signature.initVerify(publicKey);
signature.update(str.getBytes());
boolean b = signature.verify(result);
System.out.println(b);
} catch (Exception e) {
e.printStackTrace();
}
}
}
輸出:
2982312259358826061447321482940705327790349142998412535792313942953590618626400322298375288237244307356609052905381328226612007870641624392779916247258746
true
場景時序圖:
首先:
然後: