java-RSA 公私匙 数字签名

问题描述

RSA 公私匙 数字签名

RSA中通过KeyPair来生成公私匙

 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
       keyPairGen.initialize(1024);
       KeyPair keyPair = keyPairGen.generateKeyPair();
       RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
       RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

在做数字签名或者加解密时,为什么不直接使用上门的公私匙 而是要对公私匙做转化

比如公匙
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicK = keyFactory.generatePublic(keySpec);

比如私匙
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);

目前网上的帖子基本都是用转化后的公私匙
但自己在方法里试了下 在签名 验签方法里如果直接使用 不转化的 也是可以做数字签名的,那这几步转化的意义何在,求达人告知下 ,谢谢!

解决方案

###复制一段给你吧
1. 信息加密
  收信者是唯一能够解开加密信息的人,因此收信者手里的必须是私钥。发信者手里的是公钥,其它人知道公钥没有关系,因为其它人发来的信息对收信者没有意义。
2. 登录认证
客户端需要将认证标识传送给服务器,此认证标识(可能是一个随机数)其它客户端可以知道,因此需要用私钥加密,客户端保存的是私钥。服务器端保存的是公钥,其它服务器知道公钥没有关系,因为客户端不需要登录其它服务器。
3. 数字签名
  数字签名是为了表明信息没有受到伪造,确实是信息拥有者发出来的,附在信息原文的后面。就像手写的签名一样,具有不可抵赖性和简洁性。
  简洁性:对信息原文做hash,得到digest。信息越短加密的耗时越少。
  不可抵赖性:信息拥有者要保证签名的唯一性,必须是唯一能够加密digest的人,因此必须用私钥加密(就像字迹他人无法学会一样),得到签名。如果用公钥,那每个人都可以伪造签名了。
4.数字证书
  问题起源:对1和3,发信者怎么知道从网上获取的公钥就是真的?没有遭受中间人攻击?
  这样就需要第三方机构来保证公钥的合法性,这个第三方机构就是CA(Certificate Authority),证书中心。
  CA用自己的私钥对信息原文所有者发布的公钥和相关信息进行加密,得出的内容就是数字证书。
  信息原文的所有者以后发布信息时,除了带上自己的签名,还带上数字证书,就可以保证信息不被篡改了。信息的接收者先用CA给的公钥解出信息所有者的公钥,这样可以保证信息所有者的公钥是真正的公钥,然后就能通过该公钥证明数字签名是否真实了。

时间: 2024-09-14 23:59:04

java-RSA 公私匙 数字签名的相关文章

Python基于sftp及rsa密匙实现远程拷贝文件的方法_python

本文实例讲述了Python基于sftp及rsa密匙实现远程拷贝文件的方法.分享给大家供大家参考,具体如下: 如果两台服务器之间使用了RSA秘钥免密码登录的方式,可以先查找出rsa秘钥的对应目录(如find / -name id_rsa 或者locate id_rsa), 接着通过Python中paramiko模块可以这样实现scp功能: def scp_by_key(host_ip, host_port, remote_path, local_path, username, pkey_path)

RSA 非对称加密 数字签名 数字证书

什么是RSA加密算法 RSA加密算法是一种非对称加密算法,算法的数学基础是极大数分解难题. RSA加密算法的强度也就是极大数分解的难度,目前700多位(二进制)的数字已经可以破解,1024位认为是比较安全的,2048则是非常安全的. 在RSA加密算法中,密钥由两部分组成,称之为公钥和私钥,私有由发送方自己保存,不能泄漏.公钥由发送方公布出去.发送方发送消息时,会用公钥对消息进行加码,接收方必须要使用对应的私钥才能将加密后的信息解开.因此,只要私钥不泄漏,通信内容就不会被破解. 如何保证消息不会被

c# 如何与java rsa加解密互通?

问题描述 服务器java发布rsa秘钥,客户端c#根据java给定的秘钥加密字符串,并传给服务端JAVA验证:本人实践了网上诸多方法,都不得行?(备注:服务端java是别个的,别个只能提供秘钥和加密字符串):网上诸多秘钥转换的方法都用不了,哪位做过这个的大神给个完整的demo

java RSA的 sha1rsa签名和openssl签名出来的数据不同,初步怀疑是java的方法有默认的填充方式,请问如何指定签名的填充方式啊?

问题描述 javaRSA的sha1rsa签名和openssl签名出来的数据不同,初步怀疑是java的方法有默认的填充方式,请问如何指定签名的填充方式啊?

JAVA加密算法- 非对称加密算法(DH,RSA)的详细介绍_java

非对称密码概念 1.与对称加密算法的主要差别在于,加密和解密的密钥不相同,一个公开(公钥),一个保密(私钥).主要解决了对称加密算法密钥分配管理的问题,提高了算法安全性. 2.非对称加密算法的加密.解密的效率比较低.在算法设计上,非对称加密算法对待加密的数据长度有着苛刻的要求.例如RSA算法要求待加密的数据不得大于53个字节. 3.非对称加密算法主要用于 交换对称加密算法的密钥,而非数据交换 4.java6提供实现了DH和RSA两种算法.Bouncy Castle提供了E1Gamal算法支持.除

常用数字签名算法RSA与DSA的Java程序内实现示例_java

RSA加密算法 我们来回顾一下RSA的加密算法.我们从公钥加密算法和签名算法的定义出发,用比较规范的语言来描述这一算法. RSA公钥加密体制包含如下3个算法:KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法). 密钥生成算法以安全常数作为输入,输出一个公钥PK,和一个私钥SK.安全常数用于确定这个加密算法的安全性有多高,一般以加密算法使用的质数p的大小有关.越大,质数p一般越大,保证体制有更高的安全性.在RSA中,密钥生成算法如下:算法首先随机产生两个不同大质

Java加解密技术系列之RSA详解_java

距离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项目太紧,具体的就不多说了.今天来说说非对称加密真的是太重要了,我们的日常生活中,都离不开非对称加密. 概念 在说 RSA 之前,首先聊聊什么是非对称加密.在讲对称加密的时候,就曾经说过,对称加密算法在加密和解密时使用的是同一个秘钥,加解密双方必须使用同一个密钥才能进行正常的沟通.而非对称加密则不然,非对称加密算法需要两个密钥来进行加密和解密,分别是公钥和私钥. 需要注意的一点,这个公钥和私钥必须是

RSA加密算法java简单实现方法(必看)_java

简单完整的代码,通过这个代码你将对RSA加密算法在Java中的实现方法有一个初步的了解,这个类,你可以直接使用,水平高的,就自己修改完善下代码. package security; import java.security.*; import java.security.spec.*; import java.security.interfaces.*; import javax.crypto.spec.*; import javax.crypto.interfaces.*; import ja

C# Java间进行RSA加密解密交互

原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣鼓出来了. 首先,介绍一下写这代码的目的:完成webService验证问题,服务器端采用C#开发,客户端采用Java开发.服务器端给客户端提供公钥,已进行数据加密,客户端加密后提数据提交给服务器,服务器用私钥对数据解密,进行验证.  这里遇到的主要问题是C# RSACryptoServiceProv