RSA数字签名的原理及作用

简介:

关于数字签名,先了解下何为数字签名。数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与数字摘要技术的应用。简单地说,所谓数字签名就是附加在数据单元上的一些数据,或是对数据单元所作的密码变换。这种数据或变换允许数据单元的接收者用以确认数据单元的来源和数据单元的完整性并保护数据,防止被人(例如接收者)进行伪造。

    数字签名的主要功能如下:
 


    保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。

    数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。

    数字签名是个加密的过程,数字签名验证是个解密的过程。

     数字签名算法依靠公钥加密技术来实现的。在公钥加密技术里,每一个使用者有一对密钥:一把公钥和一把私钥。公钥可以自由发布,但私钥则秘密保存;还有一个要求就是要让通过公钥推算出私钥的做法不可能实现。

    普通的数字签名算法包括三种算法:

    1.密码生成算法;

    2.标记算法;

   3.验证算法

    通过RSA加密解密算法,我们可以实现数字签名的功能。我们可以用私钥对信息生成数字签名,再用公钥来校验数字签名,当然也可以反过来公钥签名,私钥校验。


wKiom1hl2NzzZKNxAADSz3hXVkI109.png

    私钥签名
 


?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
      * 用私钥对信息生成数字签名
      * @param data   //加密数据
      * @param privateKey //私钥
      * @return
      * @throws Exception
      */
     public  static  String sign( byte [] data,String privateKey) throws  Exception{      //解密私钥
         byte [] keyBytes = decryptBASE64(privateKey);      //构造PKCS8EncodedKeySpec对象
         PKCS8EncodedKeySpec pkcs8EncodedKeySpec =  new  PKCS8EncodedKeySpec(keyBytes);         //指定加密算法
         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);         //取私钥匙对象
         PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8EncodedKeySpec);         //用私钥对信息生成数字签名
         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
         signature.initSign(privateKey2);
         signature.update(data);    
         return  encryptBASE64(signature.sign());
     }

    公钥校验 



?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
      * 校验数字签名
      * @param data   加密数据
      * @param publicKey  公钥
      * @param sign   数字签名
      * @return
      * @throws Exception
      */
     public  static  boolean  verify( byte [] data,String publicKey,String sign) throws  Exception{       //解密公钥
         byte [] keyBytes = decryptBASE64(publicKey);       //构造X509EncodedKeySpec对象
         X509EncodedKeySpec x509EncodedKeySpec =  new  X509EncodedKeySpec(keyBytes);        //指定加密算法
         KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);         //取公钥匙对象
         PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec);
         
         Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
         signature.initVerify(publicKey2);
         signature.update(data);      //验证签名是否正常
         return  signature.verify(decryptBASE64(sign));
         
     }

    



      本文转自建波李 51CTO博客,原文链接:http://blog.51cto.com/jianboli/1887611,如需转载请自行联系原作者





相关文章
|
2月前
|
数据安全/隐私保护
公钥和私钥的作用和区别
公钥和私钥的作用和区别
|
8月前
|
安全 数据安全/隐私保护
一分钟教会你如何使用Crypto模块RSA非对称加密,把重要的数据进行加密
随着互联网的迅速发展,信息安全变得尤为重要。数据加密是一个必不可少的环节。有时候,我们一不留神,可能数据就被人窃听到。今天跟大家分享一个数据加密的小案例。
167 0
|
算法 Linux 数据安全/隐私保护
RSA公钥文件解密密文的原理分析
RSA公钥文件解密密文的原理分析
339 0
RSA公钥文件解密密文的原理分析
|
Java 数据安全/隐私保护
java实现RSA加密、解密、签名
java实现RSA加密、解密、签名
894 0
java实现RSA加密、解密、签名
|
算法 安全 数据安全/隐私保护
非对称加密加密原理和开发场景解析
过上一节,就能很好的理解非对称加密就是加密和解密双方使用的是不同的密钥。比喻就是:一把锁,如果被A用钥匙锁上了,那么A无法继续使用自己的钥匙打开,只能让B用他的钥匙打开。而如果B用钥匙把锁给锁上之后,同样必须只有A的钥匙才能打开。所以非对称加密主要解决的问题就是:可信问题,防窃听问题。
577 0
|
算法 Java 数据安全/隐私保护
加密解决方案-Java实现RSA非对称加密
本文基于RSA加密算法原理,详述什么是RSA算法、RSA加密解密原理进行实践的过程。
815 1
加密解决方案-Java实现RSA非对称加密
|
算法 Java API
RSA加密解密及数字签名Java实现
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
524 0
密钥原理,公钥和私钥的作用
说明: 下面流程图中说到的支付宝私钥是不对外开放的,商户自己的私钥也要注意保密不要对外展示,否则会影响账号安全!  一般我们会看到4个密钥      rsa_private_key              商户私钥 :        适用开发语言php ,.net等。
1510 0
|
移动开发 Java 数据安全/隐私保护
小程序RSA非对称加密/解密
小程序RSA非对称加密/解密 官方文档参考:官方文档参考 1.my.rsa 支持的密钥1024或者2048都可以进行加密解密(密钥的生成可以用代码(如java)自行实现或者使用工具生成(可参考:支付宝提供一键生成密钥工具)); 2.
1704 0