2016-05-17 171 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