2017-05-30 30 views
0

CNGを使用して、パラメータとして与えられた公開鍵でいくつかのデータを暗号化しようとしています。 NCryptImportKey関数を呼び出すときに、私はNTE_BAD_DATAエラーを取得 which isn't listed in the msdn page.C++ CNGでモジュラスと指数からRSA公開鍵をインポートする

マイコード:私はMyRSAPublicBlobを構築する方法の

#include <iostream> 
#include <Windows.h> 
#include <Bcrypt.h> 
#include <Ntstatus.h> 
#include <string> 
#include <vector> 
#include "base64.h" 

using std::string; 
using std::vector; 

struct MyRSAPublicBlob { 
    BCRYPT_RSAKEY_BLOB blob; 
    BYTE exponent[3]; 
    BYTE modulus[128]; 
    MyRSAPublicBlob(const vector<BYTE>& mod, const vector<BYTE>& exp) 
    { 
     blob.BitLength = (128 + 3) * 8; 
     blob.Magic = BCRYPT_RSAPUBLIC_MAGIC; 
     blob.cbModulus = 128; 
     blob.cbPublicExp = 3; 
     for (size_t i = 0; i < mod.size(); ++i) //copy BigEndian 
      modulus[i] = mod[mod.size() - 1 - i]; 
     for (size_t i = 0; i < exp.size(); ++i) //copy BigEndian 
      exponent[i] = exp[exp.size() - 1 - i]; 
    } 
    MyRSAPublicBlob() { ; } 

}; 

MyRSAPublicBlob b; 

bool RSA_encrypt() { 
    SECURITY_STATUS stat; 
    NCRYPT_PROV_HANDLE hProv; 
    NCRYPT_KEY_HANDLE hKey; 

    stat = NCryptOpenStorageProvider(&hProv, MS_KEY_STORAGE_PROVIDER, 0); 
    if (ERROR_SUCCESS != stat) { 
     std::cout << "failed in NCryptOpenStorageProvider: " << GetLastError() << std::endl; 
     return false; 
    } 
    stat = NCryptImportKey(hProv, 
     NULL, 
     BCRYPT_RSAPUBLIC_BLOB, 
     NULL, 
     &hKey, 
     (PBYTE)&b.blob, 
     sizeof(b), 
     0); 

    if (ERROR_SUCCESS != stat) { 
     std::cout << "failed in NCryptImportKey: " << GetLastError() << std::endl; 
     return false; 
    } 

例:私はぶっきらぼうに間違ってやっている

string PubKeyModulus = "yVUndgQFuB5Z5FgC0/WgWCg6Y8VuB582avGjQDdeoJDa1+RBKCyXo700sAMSGjM/bVakOlFqvCsVFNBysx1CH731CDb2DR1a0bsmYmDQ9d0ZHX+AOohVDIx9mc7bkDQZoEFpe9NqFsu95Y9yktpl1JKPmKyLOFgufGJYYvQyoOM="; 
string PubKeyExp = "AQAB"; 

vector<BYTE> PubKeyModulus_bin = base64_decode(PubKeyModulus); 
vector<BYTE> PubKeyExp_bin = base64_decode(PubKeyExp); 
struct MyRSAPublicBlob c(PubKeyModulus_bin, PubKeyExp_bin); 
b = c; 

何か?

答えて

0

BitLengthの値は「キーのサイズ」で、RSAの場合は「モジュラス値のサイズ」を意味します。だから、cbModulusでは一種の冗長ですが、それは本当ですか?

BitLengthの計算で+ 3を削除すると、おそらく動作し始めます。 .NETと比較してRSACng.ImportParametersのブロブを作成する:http://source.dot.net/#System.Security.Cryptography.Cng/Common/System/Security/Cryptography/RSACng.ImportExport.cs,79

関連する問題