JAVA加密算法(5)- 数字签名算法(RSA、DSA)

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了JAVA加密算法(5)- 数字签名算法(RSA、DSA)脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

数字签名流程

(1)生成签名:对文件的「数字摘要」,使用私钥加密,生成「加密数字摘要」;

(2)验证签名:对「加密数字摘要」通过公钥进行解密,生成「数字摘要2」,比较「数字摘要」与「数字摘要2」,结果相同则签名验证通过。

概念:带有「公钥」和「私钥」的「消息摘要」算法,是「非对称加密算法」和「消息摘要」算法的结合体

私钥签名,公钥验证

常用签名算法

  • RSASignature

  • DSASignature

  • ECDSASignature(需Bouncy Castle)

数字签名作用

  • 验证数据完整性

  • 认证数据来源

  • 抗否认

场景

如AndROId App开发者签名

RSASignature示例

import java.securITy.*; import java.security.sPEc.PKCS8encodedKeySpec; import java.security.spec.X509EncodedKeySpec;  public class RSASignatureUtil {      public static final String KEY_ALGORITHM = "RSA";//密钥算法     public static final String SIGN_ALGORITHM = "MD5withrSA";//签名算法:MD2withRSA,SHA1WithRSA,SHA256withRSA,SHA384withRSA,SHA512withRSA      /**      * 初始化RSA公钥私钥      */     public static KeyPair initKey() throws Exception{         KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);         keyPairGenerator.initialize(1024);         return keyPairGenerator.generateKeyPair();     }      /**      * 签名(原数据,私钥 2要素)      */     public static byte[] sign(byte[] data, PRivateKey privateKey) throws Exception{         PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded());         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);         PrivateKey priKey = keyFactory.generatePrivate(keySpec);          Signature signature = Signature.getInstance(SIGN_ALGORITHM);         signature.initSign(priKey);         signature.update(data);//设置要计算的数据         return signature.sign();     }      /**      * 校验签名(元数据,公钥,签名 三要素)      */     public static boolean valid(byte[] data, byte[] publicKey, byte[] sign) throws Exception{         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);         X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);         PublicKey pubKey = keyFactory.generatePublic(keySpec);          Signature signature = Signature.getInstance(SIGN_ALGORITHM);         signature.initVerify(pubKey);         signature.update(data);         return signature.verify(sign);     }      public static void main(String[] args) throws Exception {         String data = "123456";         KeyPair keyPair = initKey();         byte[] sign = sign(data.getBytes(),keyPair.getPrivate());         boolean isValid = valid(data.getBytes(),keyPair.getPublic().getEncoded(),sign);         System.out.println(isValid);     }  }

脚本宝典总结

以上是脚本宝典为你收集整理的JAVA加密算法(5)- 数字签名算法(RSA、DSA)全部内容,希望文章能够帮你解决JAVA加密算法(5)- 数字签名算法(RSA、DSA)所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。