Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 加密++;RSA-使用相同的密钥对进行加密和签名_Encryption_Rsa_Signing_Crypto++ - Fatal编程技术网

Encryption 加密++;RSA-使用相同的密钥对进行加密和签名

Encryption 加密++;RSA-使用相同的密钥对进行加密和签名,encryption,rsa,signing,crypto++,Encryption,Rsa,Signing,Crypto++,我有一个程序a需要向程序B1发送消息。这些消息必须加密,并且还要签名。这意味着只有B1可以解码,他必须确保信息来自A 此外,B1不应能够加密消息,并担任同一程序的另一个实例B2的角色 理论上,应该可以使用单个RSA密钥对,其中一个密钥用于a,一个密钥用于B1。一旦被B解码,如果恢复的消息经过验证(例如通过哈希函数),那么它一定是由a发送的,而a没有向任何人透露其密钥。在这种情况下,两个密钥都是私有的(这意味着它们必须在安全通道中交换) 1) 这是建议的还是有充分的理由支持使用独立的密钥对进行单独

我有一个程序a需要向程序B1发送消息。这些消息必须加密,并且还要签名。这意味着只有B1可以解码,他必须确保信息来自A

此外,B1不应能够加密消息,并担任同一程序的另一个实例B2的角色

理论上,应该可以使用单个RSA密钥对,其中一个密钥用于a,一个密钥用于B1。一旦被B解码,如果恢复的消息经过验证(例如通过哈希函数),那么它一定是由a发送的,而a没有向任何人透露其密钥。在这种情况下,两个密钥都是私有的(这意味着它们必须在安全通道中交换)

1) 这是建议的还是有充分的理由支持使用独立的密钥对进行单独的加密和签名步骤

2) 实际上,在Crypto++库中,
PrivateKey
类也包含公钥。有没有办法只加载私钥

这是建议的还是有充分的理由支持使用独立的密钥对进行单独的加密和签名步骤

这是一个广泛的话题。根据你的威胁模型和风险态势,你可以做很多事情。你应该从研究开始

既然您已经选择了RSA,那么您可能想看看Crypto.SE,并了解它对30000条消息(IIRC)的改进。这就是你的威胁模型和风险态势因素


实际上,在Crypto++库中,PrivateKey类也包含公钥。有没有办法只加载私钥

我想你对钥匙有误解。无法从私钥中取出公钥


公钥是
{n,e}
对,私钥是
{n,e,d}
{n,e,d,p,q,dp,dp,dp,u}
。如果删除
n
e
,则私钥将不起作用。如果单独删除
e
,则需要将
n
因子化以恢复
e
。另请参阅关于堆栈溢出的内容。

尝试此处:尝试安全堆栈交换似乎是个好主意。当然,公钥不需要是公开的,RSA才能工作。如果双方都知道私有公钥对,那么即使
PrivateKey
类也包含该公钥,这又有什么关系呢?我没有发现任何重大的安全漏洞——但这一切似乎都没有什么动机。即使是安全的,使用RSA作为对称密钥密码也不会非常有效。@JohnColeman:B不应该被允许创建任何这些消息。他应该只能解密和验证它们。我在问题中添加了这一点,因为这明显增加了不对称性。在这种情况下,我不知道您所说的“两个密钥都是私有的(这意味着它们必须在安全通道中交换)”是什么意思,所以密钥毕竟不是都在安全通道上交换的?在任何情况下,您都应该在此处删除此问题,并将其发布到安全堆栈交换。对于安全性问题,你需要比程序员的即兴直觉更好的东西。第三方不应该能够解密来自A的消息。这意味着B的密钥(解密密钥)是私有的。但是第三方不应该能够向B发送消息并扮演a的角色。这意味着a的密钥(签名)也是私有的。好的,我认为由于私有操作只使用n和d,所以私有密钥可以是{n,d},这样您就不能在没有分解的情况下从私有密钥派生公钥。但是由于选择了e,删除e显然是无用的。