数字签名算法

RSA、DSA和ECDSA三种算法。
通常是先对消息做 摘要处理,然后使用 私钥对摘要值进行 签名处理;验证时,使用 公钥验证消息的摘要值。

public  class  RSASin {
       
         private  static  final  String  KEY_ALGORITHM =  "RSA" ;
       
         public  static  final  String  SIGNATURE_ALGORITHM =  "MD5WithRSA" ;
       
         private  static  final  String  PUBLIC_KEY =  "RSAPublicKey" ;
         private  static  final  String  PRIVATE_KEY =  "RSAPrivateKey" ;
         private  static  final  int  KEY_SIZE =512;
       
         private  static  byte []  pubKey ;
         private  static  byte []  priKey ;
       
         //数字签名,根据私钥获取数字签名
         public  static  byte [] sign( byte [] data,  byte [] privateKey)  throws  Exception{
                //私钥规范
              PKCS8EncodedKeySpec pkcs8=  new  PKCS8EncodedKeySpec(privateKey);
                //密钥工厂
              KeyFactory keyFac=KeyFactory. getInstance( KEY_ALGORITHM );
              PrivateKey priKey=keyFac.generatePrivate(pkcs8);
                //实例化Signature
              Signature signature=Signature. getInstance( SIGNATURE_ALGORITHM );
                //初始化
              signature.initSign(priKey);
                //更新
              signature.update(data);  //根据数据更新签名
                //签名
                return  signature.sign();
       }
       
       
         //校验--公钥验证
         public  static  boolean  verify( byte [] data,  byte [] publicKey, byte [] sign)  throws  Exception{
                //公钥规范
              X509EncodedKeySpec x509=  new  X509EncodedKeySpec(publicKey);
              KeyFactory keyFac=KeyFactory. getInstance( KEY_ALGORITHM );
                //生成公钥
              PublicKey pubKey=keyFac.generatePublic(x509);
              
              Signature signature=Signature. getInstance( SIGNATURE_ALGORITHM );
              signature.initVerify(pubKey);
              signature.update(data);
                //验证
                return  signature.verify(sign);
       }
       
         //取得私钥
         public  static  byte [] getPrivateKey(Map<String,Object> keyMap){
              Key key=(Key) keyMap.get(  PRIVATE_KEY );
                return  key.getEncoded();
       }
       
         //公钥
         public  static  byte [] getPublicKey(Map<String,Object> keyMap){
              Key key=(Key)keyMap.get(  PUBLIC_KEY );
                return  key.getEncoded();
       }
       
         //初始化密钥对
         public  static  Map<String,Object> initKey()  throws  Exception{
              KeyPairGenerator keyPairGen=KeyPairGenerator.getInstance(  KEY_ALGORITHM );
              keyPairGen.initialize(  KEY_SIZE );
                //生成密钥对
              KeyPair keyP=keyPairGen.generateKeyPair();
                //公钥
              RSAPublicKey publicKey=(RSAPublicKey)keyP.getPublic();
                //私钥
              RSAPrivateKey privateKey=(RSAPrivateKey)keyP.getPrivate();
                //封装密钥
              Map<String,Object> keyMap=  new  HashMap<String,Object>(2);
              keyMap.put(  PRIVATE_KEY , (Object) privateKey);
              keyMap.put(  PUBLIC_KEY , (Object) publicKey);
                return  keyMap;
       }
       
         public  static  final  void  main(String[] args)  throws  Exception{
              Map<String,Object> kMap= initKey();
                pubKey =getPublicKey(kMap);
                priKey =getPrivateKey(kMap);
              System.  err .println( "公钥:\n"  +Base64.encodeBase64String ( pubKey  ));
              System.  err .println( "私钥:\n"  +Base64.encodeBase64String ( priKey  ));
              
              String str=  "RSA数字签名"  ;
                byte [] data=str.getBytes();
              
                //产生签名
                byte [] sign=sign(data,  priKey );
              System.  err .println( "签名:\n"  +Hex.encodeHexString (sign));
              
                //验证签名
                boolean  status=verify(data,  pubKey , sign);
              System.  err .println( "状态:\n"  +status);
              
                //验证
               assertTrue(status);
       }
}

转载于:https://www.cnblogs.com/littlefishxu/p/3969187.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字签名标准(DSS)的研究与实现 1. 引言 5 2.数论基础 6 2.1 基本定义 6 2.2 散对数问题 7 3.数字签名标准DSS 9 3.1 DSA算法描述 9 3.1.1 DSA算法参数 9 3.1.2 DSA签名过程 9 3.1.3 DSA签名验证 10 3.2 DSA算法证明 10 3.3 DSA算法变形 11 3.3.1 Yen和Laih的改进方法1 12 3.3.2 Yen和Laih的改进方法2 12 3.3.3 Naccache的改进方法 12 4. DSS参数产生 13 4.1 DSA素数产生 13 4.1.1 Miller-Rabin概率素性检验算法 13 4.1.2 DSA素数产生算法 14 4.1.3 任意长度素数生成算法 16 4.2 DSA的随机数产生算法 16 4.2.1 产生m个DSA私钥的算法 16 4.2.2 产生m个DSA每消息密钥数的算法 17 4.2.3 SHA-1构造函数G(t,c) 17 4.2.4 利用SHA-1构造任意长度随机数 18 4.3 DSA其他参数的产生 18 4.3.1 产生DSA的g算法 18 4.3.2 计算 的算法 19 4.3.3 SHA-1算法 19 5. 数字签名标准DSS的Java实现 24 5.1 DSA素数产生的Java实现 27 5.1.1 Miller-Rabin概率素性检验算法的Java实现 27 5.1.2 DSA素数产生算法的Java实现 28 5.1.3 任意长度素数生成算法 30 5.2 DSA随机数产生算法的Java实现 31 5.2.1 产生m个DSA私钥的算法的Java实现 31 5.2.2 产生m个DSA每消息秘密数的算法的Java实现 32 5.2.3 利用SHA-1构造单向函数G(t,c)算法的Java实现 33 5.2.4 利用SHA-1构造任意长度随机数的Java实现 34 5.3 DSA其他参数产生算法的Java实现 35 5.3.1 生成DSA的g算法的Java实现 35 5.3.2 计算 算法的Java实现 36 5.3.3 生成DSA公钥的Java实现 36 5.3.4 求模幂 的Java实现 37 5.3.5 SHA-1的Java实现 38 5.4 本文Java实现的数字签名标准(DSS)测试 38 5.4.1 本文Java实现的DSS签名测试 38 5.4.2本文Java实现的SHA-1测试 39 5.4.3本文Java实现的其他参数测试 40 6. DSS数字签名的应用 41 结束语 42 致谢 43 参考文献 44
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值