据我所知,我必须保证私钥的安全并发布公钥,这样任何人都可以使用公钥加密任何数据,而我可以使用我自己的私钥解密它(没有人拥有)。
问题是,如果我发布私钥并保留公钥会怎么样?该算法似乎又起作用了:任何人都用私钥(已发布)锁定数据,但没有人拥有公钥(由我保持安全)。
是什么使公钥成为公钥?私钥中有哪些安全且重要的资料是我不应该向任何人展示的?
对于一个完整的加密+解密(或签名+验证)过程,您总是需要两个密钥。一个用于加密/签名,另一个用于解密/验证。对于哪个操作使用哪个键(原则上)是不相关的,只要您为反向操作使用相应的另一个键即可。
那么让我们假设您使用类似openssl
的工具来生成密钥对A
和B
。
在发布这些密钥时,我们必须考虑两个方面
-
数学从纯数学的角度来看(暂时不考虑安全性),您将哪些密钥公开,哪些密钥保密是无关紧要的。所有进程都将以任何方式工作。
decrypt(encrypt(data, A), B) == data == decrypt(encrypt(data, B), A)
verify(sign(data, A), B) == OK == verify(sign(data, B), A)
-
安全当我们考虑到安全性时,通过数字签名证明你的身份是唯一可能的,如果你使用钥匙,没有人可能知道。对于某些加密系统,可以从密钥
B
导出密钥A
,即存在一个函数,使得A = f(B)
而不是相反,即没有函数使得
B = f(A)
B
时,您也知道A
,但是如果您只知道A
,则不可能推导出B
。
因此B
被称为私钥,必须保持私有,A
是公钥,可以发布。如果你用另一种方式来做,从数学的角度来看,这些过程仍然有效(尽管大多数系统会拒绝你的密钥),但它们不再安全了……
根据系统的使用,公钥可能是'众所周知的'。例如,对于RSA,公钥只是你的模数加上公共指数65537,而私钥是模数加上私有指数(这是真正的秘密)。所以知道私钥的人在默认情况下也知道公钥。大多数基于椭圆曲线的系统也是如此。
理论上,人们可以创建一个rsa风格的系统,其中公共指数也难以确定(例如随机生成的足够位的值是不可猜测的),在这种情况下,它将更加对称,但这不是系统通常设置的方式。在任何情况下,知道密钥背后的秘密参数(RSA中的模数因子)的人都可以很容易地从私钥中确定公钥,或者从公钥中确定私钥。
在像Diffie-Hellman这样的系统中,公钥实际上是通过一个众所周知的算法从私钥中派生出来的(除了私钥本身之外没有任何秘密参数),所以在这种情况下,密钥根本不是对称的,任何知道私钥的人都可以轻松地确定公钥。