2016-05-17 128 views
1

我有一个程序A需要将消息发送到程序B1。消息必须加密,并且也要签名。这意味着只有B1可以解码,他必须确保该消息来自A.加密++ RSA - 使用相同的密钥对进行加密和签名

此外,B1不应该是能够加密信息,并采取对同一程序的另一个实例B2 A的作用。

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

1)这是推荐还是有强烈的争论,支持使用独立密钥对进行单独的加密和签名步骤?

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

+1

试一下:http://security.stackexchange.com/ – dahui

+0

在安全堆栈交换尝试似乎是一个不错的主意。当然,公共密钥并不需要公开RSA才能工作。如果双方都知道私钥 - 公钥对,为什么PrivateKey类也包含公钥?没有重大的安全缺陷跳出来给我 - 但似乎一切都没有动机。即使安全,使用RSA作为对称密钥密码也不会很有效。 –

+0

@JohnColeman:B不应该被允许创建任何这些消息。他应该只能解密并验证它们。我在问题中加入了这个,因为这明显增加了不对称性。 – galinette

回答

1

这是推荐的还是有支持独立加密和独立密钥对的签名步骤的有力论据?

这是怎样的一个广泛的话题。根据您的威胁模型和风险状况,您可以执行多项操作。你应该从研究key management and separation开始。

既然看起来您已经选择了RSA,那么您可能需要查看Crypto.SE上的Bleichenbacher 1998 “Million message attack” on RSA并按照其对30,000条消息(IIRC)的改进。这是您的威胁模型和风险因素融入事物的地方。


实际上,在加密++库,该专用密钥类也包含了公共密钥。有没有办法只加载私钥?

我觉得你有钥匙的误解。公钥不能从私钥中泄露。公钥为{n,e}对,私钥为{n,e,d}{n,e,d,p,q,dp,dp,u}。如果删除ne,那么私钥将不起作用。如果单独删除e,则需要将因子n恢复为e。有关堆栈溢出,请参阅RSA function generates public key (e) always to 17

+0

好吧,我认为私人操作只使用n和d,私钥可能只是{n,d},所以你不能从没有因子的私钥推导出公钥。但由于e的选择,删除e显然是无用的。 – galinette