1
luchenqun 2019-03-09 15:27:34 +08:00 via iPhone
公钥可以解密的话,你加密的意义何在?
|
2
h123123h 2019-03-09 15:27:48 +08:00 via iPhone
私钥加密是签名吧
|
3
lululau 2019-03-09 15:29:05 +08:00 via iPhone
可以,签名就是对摘要做四月加密
|
4
lululau 2019-03-09 15:29:26 +08:00 via iPhone
私钥
|
5
GuguguguDa OP @luchenqun 先不论意义何在吧,只是想问问能不能这样做,因为看了下面那个博文有些疑惑,私钥加密之后,公钥还能正常解密出来
https://blog.csdn.net/wangqiuyun/article/details/42143957 |
6
GuguguguDa OP @lululau 签名是签名 加密是加密 不一样吧
|
7
GuguguguDa OP @h123123h 看了上面那个博客,我觉得很疑惑,签名是签名,加密是加密
|
8
Kilerd 2019-03-09 16:03:40 +08:00 via iPhone
可以,
|
9
t6attack 2019-03-09 16:05:07 +08:00 2
<?php
//测试密钥-公钥 $pubKey="-----BEGIN PUBLIC KEY----- MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANSlDRoxEXWQrbIbFig3SuT/YH/K0q5/ OLBVloeXSr+dc+PWvXsRnwkxIkX5KznPCG9zLGe/Ga9XRyp+k2YrnrsCAwEAAQ== -----END PUBLIC KEY-----"; //私钥 $privKey="-----BEGIN RSA PRIVATE KEY----- MIIBOQIBAAJBANSlDRoxEXWQrbIbFig3SuT/YH/K0q5/OLBVloeXSr+dc+PWvXsR nwkxIkX5KznPCG9zLGe/Ga9XRyp+k2YrnrsCAwEAAQJACg70m7SOet0pGi+l0Kks 5cAetGzHonFqIQ0rXaaOZpnZ7VeBTjklFVlVv/6UGr0h7jLclU+0UcEZ1lxwQUBx wQIhAPoD6k+WOJld9D0p6ECLlS0ii4spj/T5o5ODdI+pkS2JAiEA2bwhZICOwb8w FjfJOoKFcfuUfTk0n8y1DokfRQBC/SMCIBoZ8opgioQodOk1yNOEPwy5QIxEyIyw y00JOlANSeTRAiBm+oeAlRzvnZEMsQ3HUnvy0N4F68xr19G6MjhL1jfYqQIgGiYa RlI1jeOWFLKyxOFcNim8HUhfqIebm8Mccc0/3kQ= -----END RSA PRIVATE KEY-----"; function pubEncrypt($data,$pubKey){ //公钥加密 $pubKey = openssl_pkey_get_public($pubKey); openssl_public_encrypt($data, $encrypted, $pubKey); return base64_encode($encrypted); } function privDecrypt($data,$privKey){ //私钥解密 $privKey=openssl_pkey_get_private($privKey); $encrypted = base64_decode($data); openssl_private_decrypt($encrypted, $decrypted, $privKey); return $decrypted; } function privEncrypt($data,$privKey){ //私钥加密 $privKey=openssl_pkey_get_private($privKey); openssl_private_encrypt($data, $encrypted, $privKey); return base64_encode($encrypted); } function pubDecrypt($data,$pubKey){ //公钥解密 $pubKey = openssl_pkey_get_public($pubKey); $encrypted = base64_decode($data); openssl_public_decrypt($encrypted, $decrypted, $pubKey); return $decrypted; } $string='一二三四五六七八九十'; echo '公钥加密:'; $en = pubEncrypt($string,$pubKey); echo $en . '<br /> 私钥解密:'; $de = privDecrypt($en,$privKey); echo $de; echo "<br>"; $string='一二三四五六七八九十'; echo '私钥加密:'; $en = privEncrypt($string,$privKey); echo $en . '<br /> 公钥解密:'; $de = pubDecrypt($en,$pubKey); echo $de; ?> 有何疑问? |
10
ayase252 2019-03-09 16:06:01 +08:00 1
可以,数字签名就是这么搞的
|
11
GuuJiang 2019-03-09 16:06:29 +08:00 1
取决于你怎么理解“加密”,如果“加密”指的是 RSA 里的“明文+密钥=密文”这个过程的话,用公钥和私钥都是可以的,公钥加密就对应的私钥解密,私钥公钥就对应的公钥解密,而如果放到实际的应用场景里,只有“公钥加密、私钥解密”才能起到保密信息的作用,这整个流程合起来称为“加密”,反之,“私钥加密、公钥解密”并不能让信息保密,但是却能起到验证发送者身份的作用,于是这整个流程称为“签名”
|
12
GuguguguDa OP |
13
GuguguguDa OP @GuuJiang 签名我可以理解,那么私钥加密之后的密文,可以用公钥还原的吗?
|
14
jssyxzy 2019-03-09 16:10:49 +08:00
私钥加密,公钥解密,
那么问题就来了, 为啥要加密啊,这个需求很奇葩啊。 |
15
jssyxzy 2019-03-09 16:12:26 +08:00
@GuguguguDa
“@luchenqun 先不论意义何在吧,只是想问问能不能这样做,因为看了下面那个博文有些疑惑,私钥加密之后,公钥还能正常解密出来 https://blog.csdn.net/wangqiuyun/article/details/42143957 ” 做可以做,数字签名里面就有。 其实私钥加密公钥解密的一个作用是表明自己的身份。 |
16
GuguguguDa OP @jssyxzy 唔 数字签名我理解
换个问题 私钥加密后的密文 能用公钥还原成明文吗? |
17
jssyxzy 2019-03-09 16:19:02 +08:00 1
看第三章
![]( ) |
18
jssyxzy 2019-03-09 16:19:23 +08:00
@GuguguguDa
看上面那本书第三章 |
19
jssyxzy 2019-03-09 16:20:28 +08:00 1
|
20
h3lica 2019-03-09 16:23:22 +08:00 1
如果公钥指的是 RSA 里的 e 而私钥指的是 RSA 里的 d 的话。
加密函数表示为 C = M ^ d mod n 解密函数表示为 M = C ^ e = M ^ (e * d) = M mod n 从数学上看是可行的。 |
21
liwufan 2019-03-09 16:24:13 +08:00
简单来说,私钥不能反推出自己加密的内容,公钥也不能反推出自己加密的内容.类比就是锁(公钥)和钥匙(只能有一把的私钥),私钥加密,公钥解密的行为相当与做一把全世界人都能开的锁,但是这把锁你自己无论如何都打不开.
|
22
GuuJiang 2019-03-09 16:25:35 +08:00 1
@GuguguguDa 肯定是可以还原的,否则怎么验证签名,验证签名的过程就是用公钥解密啊,至于你贴的那个链接,你再好好看看,那个问题问的是为什么公钥加密的消息无法用公钥还原,跟你这里问的不是一回事
|
23
GuguguguDa OP @GuuJiang 哈哈哈 对对对 我看错了
|
24
sherlockwhite 2019-03-09 18:37:50 +08:00
我理解的公钥私钥是相对的,公钥加密私钥解密,但是你这里的问题是问定义的私钥加密,公钥能不能解密,应该是可以的。公钥私钥应该是相对的在数学意义上,你用定义的私钥加密,这里的定义的私钥就是公钥了,你要保证原本定义的公钥的唯一性,就保证了这对密钥的安全性。
|
25
580a388da131 2019-03-09 18:58:17 +08:00 via iPhone
生成公钥一般用的是常数 所以安全性来说 公私不对互换
数学上没问题 |
26
hhhsuan 2019-03-09 19:02:33 +08:00 via Android
当然可以,RSA 不就是干这事的吗
|
27
Xbluer 2019-03-09 19:04:26 +08:00
私钥是可以加密的。
非对称加密,需要一对密钥,两者技术层面是一样的。只是挑了其中一个公开,叫做公钥;另一个不公开 /私有,所以叫做私钥。 你提到的数字签名就是私钥加密的一种应用。 |
28
lvybupt 2019-03-09 19:25:57 +08:00
RSA 的公钥和私钥是用扩展的欧几里德算法(辗转相除法)求出来的,选出来就是成对的。
然后你随便选一个当公钥,另外一个当私钥。 其他的非对称加密并不一定具有这个特性,但是 RSA 肯定是没问题。 |
29
Mutoo 2019-03-09 20:29:09 +08:00 1
RSA 非对称加密使用一对密钥协相互加密解密。
对外公开的叫公钥,自己保留的叫私钥。 在端到端加密的场景中,别人向你发信息的时候: 使用你的公钥加密,用他自己的私钥签名。 这样的话只有你的私钥能解开这个信息,别人无法读取。 用对方的公钥可以验证签名,确定信息确实是由对方发起的,第三方无法伪造。 |
31
hoiyd 2019-03-09 20:42:22 +08:00 via Android
可以,但是非对称加解密算法( RSA )的性能不如对称加密( AES 之类)算法,所以一般加解密大量内容的时候一般用对称加密算法,然后用非对称加密签个名。
|
32
cjw1115 2019-03-09 20:54:57 +08:00
这种一般不叫加密了,使用私钥叫做签名,使用公钥叫做验签。 公钥可以从私钥中获取,要保证私钥的绝对安全
|
33
BinRelay 2019-03-09 21:51:45 +08:00
从数学角度,私钥和公钥并没什么区别。只选选择公开的叫公钥。选择保留的是私钥。
而且公钥私钥不能互推。所以公钥加密私钥解,私钥加密公钥解没有本质区别。 不过,从应用角度,例如 9 楼的那一对公钥私钥,采用的 PKCS#1 格式的私钥,并不是真正 数学意义上的私钥,里面包含了 rsa 推导过程的信息( p、q ),所以得到私钥可以直接推导得到公钥。 |
36
jimages 2019-03-09 22:37:51 +08:00
|
39
msg7086 2019-03-10 01:57:38 +08:00
本坛其实有过很多很多相关的讨论,多到我已经回复过好多贴了,而且 38 楼的链接里没有我回复的内容。
|
40
tomczhen 2019-03-10 07:19:58 +08:00 via Android
数学上讲是可以的,并且代码也能实现,但是实际很多加密库并没有实现。
|
41
p1gd0g 2019-03-10 09:16:34 +08:00
在公钥密码学中,公钥( public key )默认是公开的,所以这么做的意义是什么呢。
|
42
Mutoo 2019-03-10 11:13:10 +08:00
@p1gd0g 例如中本聪一开始就公开了公钥,这样当他对外发布信息,并用他自己的私钥签名。大家都可以用他的公钥去验证签名。从而确定这个信息确实是他发出的,而不是别人伪造的。
|
43
honeycomb 2019-03-10 11:15:12 +08:00 via Android
@GuguguguDa 当然可以啊。
数字签名无非就是给原文的摘要做 RSA 的加密解密+用于解密的密钥( public certificate 角色)公开。 用于加密的话就是用 RSA 加密明文了+用于解密的密钥应当只让需要知晓秘密的人知道。 |
44
honeycomb 2019-03-10 11:16:55 +08:00 via Android
有一个区别是用于数字签名的时候,RSA 的 e 参数一般会取一些很简单的固定值,但用于自定义的加密时,e 的取值没有什么限制
|