數字簽名算法是帶有公鑰和私鑰的消息摘要算法,私鑰簽名,公鑰驗證,用來驗證數據完整性,驗證數據來源,抗否認。
數字簽名必須具備 5 個特性: (1)簽名是可信的。 (2)簽名是不可偽造的。 (3)簽名是不可重用的。 (4)簽名的文件是不可改變的。 (5)簽名是不可抵賴的。
流行的有RSA、DSA、ECDSA算法。
包括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(); } }}輸出:
2982312259358826061447321482940705327790349142998412535792313942953590618626400322298375288237244307356609052905381328226612007870641624392779916247258746true場景時序圖:
首先:
然后: 
新聞熱點
疑難解答