数字签名算法

本文介绍了一种使用Java实现RSA数字签名的方法。通过生成RSA密钥对,并利用私钥对消息进行签名,再用公钥验证签名的有效性。该示例包括了密钥生成、签名创建及验证等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

数字签名标准(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、付费专栏及课程。

余额充值