JAVA加密解密之DSA(Digital Signature Algorithm)算法

x33g5p2x  于2021-12-25 转载在 Go  
字(5.1k)|赞(0)|评价(0)|浏览(499)

DSA算法简介

DSA-Digital Signature Algorithm是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改。数字签名,是单向加密的升级!

DSA算法实现

  1. package com.jianggujin.codec;
  2. import java.security.KeyFactory;
  3. import java.security.KeyPair;
  4. import java.security.KeyPairGenerator;
  5. import java.security.PrivateKey;
  6. import java.security.PublicKey;
  7. import java.security.Signature;
  8. import java.security.spec.PKCS8EncodedKeySpec;
  9. import java.security.spec.X509EncodedKeySpec;
  10. import com.jianggujin.codec.util.JCodecException;
  11. /** * DSA-Digital Signature Algorithm * 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature * Standard)。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。 * 如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改。数字签名,是单向加密的升级! * * @author jianggujin * */
  12. public class JDSA {
  13. public static final String ALGORITHM = "DSA";
  14. /** * DSA签名算法 * * @author jianggujin * */
  15. public static enum JDSASignatureAlgorithm {
  16. SHA1withDSA, SHA224withDSA, SHA256withDSA;
  17. public String getName() {
  18. return this.name();
  19. }
  20. }
  21. /** * 初始化密钥 * * @return */
  22. public static KeyPair initKey() {
  23. return initKey(1024);
  24. }
  25. /** * 初始化密钥 * * @param keySize * @return */
  26. public static KeyPair initKey(int keySize) {
  27. try {
  28. KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(ALGORITHM);
  29. keyPairGen.initialize(keySize);
  30. return keyPairGen.generateKeyPair();
  31. } catch (Exception e) {
  32. throw new JCodecException(e);
  33. }
  34. }
  35. /** * 签名 * * @param data * @param privateKey * @param signatureAlgorithm * @return */
  36. public static byte[] sign(byte[] data, byte[] privateKey, String signatureAlgorithm) {
  37. try {
  38. PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey);
  39. KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
  40. PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
  41. Signature signature = Signature.getInstance(signatureAlgorithm);
  42. signature.initSign(priKey);
  43. signature.update(data);
  44. return signature.sign();
  45. } catch (Exception e) {
  46. throw new JCodecException(e);
  47. }
  48. }
  49. /** * 验签 * * @param data * @param publicKey * @param sign * @param signatureAlgorithm * @return */
  50. public static boolean verify(byte[] data, byte[] publicKey, byte[] sign, String signatureAlgorithm) {
  51. try {
  52. X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
  53. KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
  54. PublicKey pubKey = keyFactory.generatePublic(keySpec);
  55. Signature signature = Signature.getInstance(signatureAlgorithm);
  56. signature.initVerify(pubKey);
  57. signature.update(data);
  58. return signature.verify(sign);
  59. } catch (Exception e) {
  60. throw new JCodecException(e);
  61. }
  62. }
  63. }

测试代码:

  1. package com.jianggujin.codec.test;
  2. import java.io.File;
  3. import java.security.KeyPair;
  4. import org.junit.Test;
  5. import com.jianggujin.codec.JBase64;
  6. import com.jianggujin.codec.JBase64.JEncoder;
  7. import com.jianggujin.codec.JDSA;
  8. import com.jianggujin.codec.JDSA.JDSASignatureAlgorithm;
  9. public class DSATest {
  10. String str = "jianggujin";
  11. File file = new File(getClass().getSimpleName() + ".dat");
  12. @Test
  13. public void test() throws Exception {
  14. System.out.println("原串:" + str);
  15. JEncoder encoder = JBase64.getEncoder();
  16. KeyPair keyPair = JDSA.initKey();
  17. byte[] keyPairPrivate = keyPair.getPrivate().getEncoded();
  18. byte[] keyPairPublic = keyPair.getPublic().getEncoded();
  19. System.out.println("私钥:" + encoder.encodeToString(keyPairPrivate, "UTF-8"));
  20. System.out.println("公钥:" + encoder.encodeToString(keyPairPublic, "UTF-8"));
  21. for (JDSASignatureAlgorithm algorithm : JDSASignatureAlgorithm.values()) {
  22. System.out.println("-----------------------------------------");
  23. System.out.println("签名算法:" + algorithm.getName());
  24. byte[] signed = JDSA.sign(str.getBytes(), keyPairPrivate, algorithm.getName());
  25. System.out.println("签名:" + encoder.encodeToString(signed, "UTF-8"));
  26. boolean verify = JDSA.verify(str.getBytes(), keyPairPublic, signed, algorithm.getName());
  27. System.out.println("验签:" + verify);
  28. }
  29. }
  30. }

测试结果:
原串:jianggujin
私钥:MIIBSwIBADCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoEFgIUeCsXTr9h606CofNraKffXd3nHi8=
公钥:MIIBtzCCASwGByqGSM44BAEwggEfAoGBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnxqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAhUAl2BQjxUjC8yykrmCouuEC/BYHPUCgYEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotUfI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoDgYQAAoGAVR7OIh6cezSQ282OrAX0MKPg+/WAoU/EJolDkvwQe8reR+8NLgIWY9PcEXimjnSoDJJq+ajaLtNCdlPO6/pqzDoA1QnmMxw70lOKDhYdjLuIUXrk6JsucI45fa8b8AD5pym0Ou+NdmanHKvd8cBpeCbVUkRoS/q0AO6i99xyZoE=
—————————————–
签名算法:SHA1withDSA
签名:MC0CFQCRPEpZoudVU+dpWNzMW9Y4ncW0GQIUQDlnzgSyGxMNbYzGRgMv+Rknn5Y=
验签:true
—————————————–
签名算法:SHA224withDSA
签名:MCwCFCmSv84K1uhZoSJP4rNTHN4Xa3dfAhQX5KrtkfaW2zo+fN6QdNALfaD2Og==
验签:true
—————————————–
签名算法:SHA256withDSA
签名:MCwCFHJS9SE5rTOsvBmxxn6ESSJ5OIlSAhQsTNk1XeSoucD2avzNKN8vSNAJqg==
验签:true

相关文章