Encryption

如何解密在另一台機器上加密的一台機器上的文件?

  • March 3, 2017

我對 CryptExportKey 和 CryptImportKey 有疑問。我將盡力通過解釋我想要實現的場景來定義我的問題。

我有兩台機器。在第一台機器上,我使用帶有 ALGID=ALG_SID_RSA_PKCS 的 CryptGenKey 創建了一個密鑰對,然後我使用帶有 PUBLICKEYBLOB 標誌的 CryptExportKey 導出了密鑰。然後我通過網路將 blob 發送到第二台機器。然後在第一台機器上,我使用 CryptEncrypt 使用相同的密鑰(之前使用 CryptGenKey 創建)加密文件。加密文件後,我將此文件發送到第二台機器。

所以在第二台機器上,我有密鑰 blob 和加密文件。現在,我想在第二台機器上使用密鑰 blob 解密文件。

在第二台機器上,我正在嘗試使用 CryptImportKey 導入密鑰 blob,它成功返回,但是在呼叫 CryptDecrypt 時,它給出了錯誤 08009000d(NTE_NO_KEY,密鑰不存在)。

是否可以在第二台機器上解密文件。

提前致謝。

您正在使用非對稱加密算法。按照這種設計,只有擁有私鑰的一方才能解密,在您的情況下,這只是第一台機器,因為您導出了公鑰;這解釋了為什麼您無法在第二台機器上破譯。

至少有兩個不錯的選擇可以解決這個問題:

  • 在第二台機器上加密,在第一台機器上解密;但是您必須在一定程度上管理公鑰在傳輸到第二台機器的過程中不會被更改(“通過網路將 blob 發送到第二台機器”並未暗示這一點)。
  • 在第二台機器上生成密鑰(對),導出公鑰並發送到第一台機器,類似的要求是在傳輸中不改變。

如果您的案例是在生成密鑰的機器上加密(即保護消息的機密性),那麼這個密鑰對於像 RSA 這樣的非對稱密碼系統(像 AES 這樣的對稱密碼系統可以)是沒有意義的,並且您必須設法以保護該密鑰機密性的方式將解密密鑰移動到解密機器(“通過網路將 blob 發送到第二台機器”並未暗示這一點,並且通常更難實現確保密鑰未更改)。

如果您的案例是簽名(即,證明消息的來源和完整性,以這種方式檢查不需要機密材料),那麼在簽署消息並導出公鑰的機器上生成密鑰對是正確,但是您仍然必須在一定程度上管理公鑰在傳輸到第二台機器期間不會被更改。

引用自:https://crypto.stackexchange.com/questions/44376