我有一個只有RSA密鑰的公共部分的EVP_PKEY。我從DER編碼中的SubjectPublicKeyInfo結構中提取公共部分。這是我現在有:驗證OpenSSL中的RSA公鑰?
unsigned char publicKey[] = {0x30, 0x5a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, ...}
size_t publicKeyLength = 92;
unsigned char* publicKeyCopy = new unsigned char[publicKeyLength];
memcpy(publicKeyCopy, publicKey, publicKeyLength);
RSA *rsa;
rsa = d2i_RSA_PUBKEY(NULL, (unsigned char const **) &pubKey, pubKeyLen);
EVP_PKEY *pkey = EVP_PKEY_new();
EVP_PKEY_assign_RSA(pkey, rsa);
我知道,你可以使用RSA_check_key to verify a RSA private key但該文檔說,「它不會對RSA的工作,只有模量和填充公開指數元素公共密鑰」。
那麼,是否有可能驗證密鑰沒有私人部分?因爲你可以看到我只有這個公共部分的EVP_PKEY。我想知道,這甚至有可能嗎?你會在EVP_PKEY的公共部分驗證什麼?
你可以看到這個問題的答案Programmatically verify a X509 certificate and private key match但是在那裏驗證了完整的密鑰(私人和公共部分)。
謹防 張貼在這個問題的原代碼有缺陷。這是因爲內部d2i_RSA_PUBKEY
使用d2i_PUBKEY
和d2i_PUBKEY
使用d2i_X509_PUBKEY
(在x_pubkey.c)。如果您閱讀documentation for d2i_X509,您將看到下一個「警告:必須使用臨時變量。常見錯誤是嘗試直接使用緩衝區...」。 因此更正後的代碼將不得不使用的publicKeyCopy
臨時副本和使用後,你可以安全地刪除publicKeyCopy
:
您發佈的內容看起來像(開始的)512位RSA公鑰。當你說「驗證」時,你的意思是說它是完好的?或者你的意思是將它建立爲特定公共/私人配對的「公鑰」。後者涉及私鑰加密的已知值(通常是簽名)。澄清你正在驗證的是什麼? 「公鑰」不是答案。 「關於......的公鑰」將有助於瞭解。 – WhozCraig
感謝您的回覆。我想知道公鑰是否格式良好,使用這個密鑰的客戶端只知道這是一個公鑰,他會用它來加密一些數據。這是DER格式的關鍵http://lapo.it/asn1js/#305A300D06092A864886F70D01010105000349003046024100832E2AE6E38F9C69928DAD2D9DABEFEB6DA8E5F48F114EBC283B838F7DA2B306E6D677414A86E2D2137F397F422C43DB5F8453D2AB12EEF5C5AFFDDD5C267B13020103。 – lmiguelmh