私钥加密公钥解密或者公钥加密私钥解密有意义吗?

开源中国总书记 发布于 2018/03/01 18:47
阅读 8K+
收藏 1

最近对java的算法的进行了梳理,看了一本梁栋编写的java加密与解密的艺术,对此有个疑问。就是对RSA算法来说,公钥和私钥都可以用来加密。

1、如果是私钥加密,公钥解密的话,因为公钥是公开出来的,所以拿到公钥的人 ,是可以解密报文的,我认为这种加密方式没意义。

2、如果是公钥加密,私钥解密的话,因为公钥是公开出来的,所以系统是无法识别请求就是指定系统发送的,也就是别人是可以模拟你的报文,请求你的系统。

请大家帮我解惑,谢谢!

加载中
1
开源中国总书记
开源中国总书记

我想了下,其实应该这样。比如现在有A(私钥A、公钥A),B(私钥B、公钥B) ,A向B发送消息,用私钥A加签、用公钥B加密,发送给B,B用私钥B解密,然后用公钥A验签。这样就可以解决上述2个问题。如果单纯的使用RSA只进行加密不签名的话,我认为是不安全的。

蛰伏ly
蛰伏ly
你这样的说法也是对的,这种叫双向认证。 A拥有A私钥、B公钥;B拥有A公钥、B私钥,这种一般用在最高级别的时候,一般很少这么用。
2
秦maoren
秦maoren
私钥加密用于数字签名,你对内容私钥加密,表示这内容版权归你 公钥加密用于防止信息被别人看到,只有持有私钥的人才能解密,如邮件加密发送给对方
卖核弹的小火柴
卖核弹的小火柴
回复 @开源中国总书记 : 老哥你这个脑瓜子真的是,A用C的公钥加密发送给C,B也用C公钥加密伪装成A发送C,你的意思是如何判断A是不是真正的A吧?首先A和C直接的通信内容只有A和C知道,A在加密的内容里面定义一串只有两个人知道的内容不就好了,例如123,C解密报文以后只要看内容中是否有123就知道是不是真正的A发的内容,B即使有C的公钥,但是不知道A和C之间通信的内容。
开源中国总书记
开源中国总书记
私钥加密的话,因为公钥是公开的,别人有可能拿到,也就是说,可以解密你的报文。 公钥加密的话,确实是只有拥有私钥的人才能解密,但是不能保证请求就是指定系统的。
1
路小磊
路小磊
私钥加密公钥解密防止发送信息中途呗篡改,公钥加密私钥解密防止信息中途被截获泄露。
开源中国总书记
开源中国总书记
还是不能解决我说的上边的2个问题
1
风尘叹
风尘叹

你举的例子 1,是用于身份验证的,你说它不能用于加密通讯。

你举的例子 2,是用于加密通讯的,你说它不能用于身份验证。

这其中的逻辑就好比,筷子不能用来喝汤,吸管不能用来吃饭,所以人发明这两种工具都没有意义吗?

蛰伏ly
蛰伏ly
回复 @开源中国总书记 : 公钥加密私钥解密,你怎么模拟我的报文,每个人公钥的拥有者都会有自己的身份ID,比如https的session之类的,你既不能获取我的身份Id,也不能获取我发送的报文内容,你怎么模拟,你自己用公钥生成的报文那不叫模拟,那是你用自己的身份做的事。 私钥加密公钥解密,这种主要是用于签名,信息是公开的,谁都可以看到,但是签名的作是为了让你知道这个信自己确定是我给你的
开源中国总书记
开源中国总书记
我的意思是,如果单纯用RSA加密的话不安全。
1
CasparLi
CasparLi

"1、如果是私钥加密,公钥解密的话,因为公钥是公开出来的,所以拿到公钥的人 ,是可以解密报文的,我认为这种加密方式没意义。"

 

你理解有误. 这种场景是用作签名的, 就是校验信息发送者身份. 只有通过特定私钥的的信息才能被公开出来的公钥解密. 这就唯一确定了信息发送者, 达到签名(不可抵赖)的目的. 

"2、如果是公钥加密,私钥解密的话,因为公钥是公开出来的,所以系统是无法识别请求就是指定系统发送的,也就是别人是可以模拟你的报文,请求你的系统。"

 

这种场景是做信息加密用. 发送者A通过公钥加密信息, 只有持有私钥的人C才能解密. 保证了被发送的信息不会被第三方知晓. 而B通过模拟报文的攻击方式并不是修改了A的信息, 而是B"假扮"A向系统发信息. 这种情况并不是A的密文被破解, 而是B在欺骗C, 所以不属于RSA算法漏洞. 

同时, 要预防这类欺骗只需利用场景1的方式, 由A使用另外一套RSA密钥对信息签名即可. 此时B即使知晓了A要发送的原文, 由于没有A的密钥 C也无法使用公钥解密出数据. 达到了既不可篡改, 又不可抵赖的目的.

 

CasparLi
CasparLi
回复 @开源中国总书记 : 即便第三者知道报文格式, 通过公钥仿制一个报文请求系统, 这种情况也不是RSA的问题. RSA还是很好的保护了通信者之间的信息. 第三方如无密钥, 无法得知通信内容. 签名只是对RSA的活用,相当于对密文的再次加密. 要解决这种欺骗问题, 还可以通过诸如约定token来实现. 因为通信内容不可被第三方获取, 故可在报文中加入身份验证信息token来实现防骗.
CasparLi
CasparLi
回复 @开源中国总书记 : 所以需要签名啊. 使用场景1 的方式签名就可以防止这种欺骗了. 一共有两套密钥. 第一套做签名, 第二套做加密. 这样无论第三者是否知道报文格式, 都无法欺骗到系统了.
开源中国总书记
开源中国总书记
我的意思是:如果我知道你的报文结构,因为公钥是公开的,我可以使用公钥加密模拟报文请求你的系统,并不是说要篡改数据
0
混乱羽翼
混乱羽翼

加密是为了加密内容,防止别人窃据你的信息

你说的2是权限控制应该做的东西

0
莫扎特的代码
莫扎特的代码

发送方用接收方的公钥加密,然后用自己的私钥进行签名,然后发送消息

接收方用发送方的公钥验证发送方身份,然后用自己的私钥解密

开源中国总书记
开源中国总书记
因为发送方和接收方的公钥都公开了,还是不能解决上述2个问题
0
hyperfox
hyperfox

1上面有人说了是用来证明代码/软件所有权的,比如有人做了个木马,试图伪装成微软的程序骗过杀毒软件,可是他没有微软的私钥,无法对木马程序进行签名,也就没办法伪装成微软的程序

2既然是加密的信息别人都不知道你的报文内容怎么伪造呢,就算邪恶第三方知道你的报文格式,只要你在报文里加上一个双方提前商量好的口令就可以阻止第三方伪造报文,因为第三方不可能知道口令是什么

开源中国总书记
开源中国总书记
1、签名是可以的,这个没问题 2、你说的口令,这个口令怎么保证安全?
0
Shazi199
Shazi199

1.用于签名认证

2.并不是用于身份认证的,参考HTTPS客户端发送数据

0
郭里奥

两个都是有意义的。

1.私钥加密,公钥解密;用于数字签名方向。私钥-公钥是一对一的关系,使用私钥加密的值,只能用对应的公钥解开,可以验证持有者身份(即私钥表示一个身份)。

2.公钥加密,私钥解密;用于数字信封方向。对方使用公钥加密的结果,只能用对应的私钥解开,可以发送给特定持有者一些私密的消息。

你说的模拟报文,进行请求;是可以进行的。

如果要验证对方身份信息,建议使用SSL的双向验证功能

开源中国总书记
开源中国总书记
签名是没问题的。如果单纯的公钥加密,私钥解密,是不能保证请求是别人模拟的。 我想了下,其实应该这样。比如现在有A(私钥A、公钥A),B(私钥B、公钥B) ,A向B发送消息,用私钥A加签、用公钥B加密,发送给B,B用私钥B解密,然后用公钥A验签。这样就可以解决上述2个问题。
返回顶部
顶部