سؤال

أحتاج إلى تحميل يم ترميز شهادة X. 509 في ويندوز تشفير API السياق إلى استخدام مع C++.فهي تلك التي لديك -----BEGIN RSA XXX KEY----- و -----END RSA XXX KEY-----.وجدت أمثلة على الثعبان .صافي ولكنها تستخدم وظائف محددة لا أستطيع تتصل عادي ويندوز تشفير API.

أنا أفهم كيفية تشفير/فك تشفير مرة واحدة كنت قد حصلت على HCRYPTKEY.ولكن أنا فقط لا تحصل على كيفية استيراد Base64 النقطة في .بيم ملف(ق) و الحصول على HCRYPTKEY التي يمكن استخدامها للخروج منه.

لدي شعور غريب بأن هناك أكثر من مجرد الدعوة CryptDecodeObject().

أي المؤشرات التي يمكن أن يضعني على الطريق الصحيح ؟ لقد فقدت اثنين من الأيام تفعل "التجربة والخطأ" البرمجة و الحصول على مكان.

هل كانت مفيدة؟

المحلول

KJKHyperion قال في كتابه الجواب:

اكتشفت "السحر" سلسلة من المكالمات إلى استيراد RSA العامة الرئيسية في PEM format.تفضل:

  1. فك شفرة المفتاح في ثنائي النقطة مع CryptStringToBinary;تمر CRYPT_STRING_BASE64HEADER في dwFlags
  2. فك ثنائي النقطة الرئيسية في CERT_PUBLIC_KEY_INFO مع CryptDecodeObjectEx;تمر X509_ASN_ENCODING في dwCertEncodingType ، X509_PUBLIC_KEY_INFO في lpszStructType
  3. فك PublicKey النقطة من CERT_PUBLIC_KEY_INFO إلى مفتاح RSA النقطة مع CryptDecodeObjectEx;تمر X509_ASN_ENCODING في dwCertEncodingType ، RSA_CSP_PUBLICKEYBLOB في lpszStructType
  4. استيراد مفتاح RSA النقطة مع CryptImportKey

هذا التسلسل ساعدني على فهم ما يجري ، ولكن ذلك لم يكن العمل بالنسبة لي كما هو.النداء الثاني CryptDecodeObjectEx أعطاني خطأ:"ASN.1 سيئة الوسم اجتمع قيمة".بعد العديد من المحاولات في فهم وثائق Microsoft ، أدركت أخيرا أن الإخراج من قبضة فك شفرة لا يمكن فك الشفرة كما ASN مرة أخرى, وهذا هو في الواقع على استعداد لاستيراد.مع هذا الفهم وجدت الجواب في الرابط التالي:

http://www.ms-news.net/f2748/problem-importing-public-key-4052577.html

التالي هو برنامج بلدي أن الواردات العامة الرئيسية من .بيم الملف إلى CryptApi السياق:

int main()
{
    char           pemPubKey[2048];
    int            readLen;
    char           derPubKey[2048];
    size_t         derPubKeyLen = 2048;
    CERT_PUBLIC_KEY_INFO *publicKeyInfo;
    int            publicKeyInfoLen;
    HANDLE         hFile;
    HCRYPTPROV     hProv = 0;
    HCRYPTKEY      hKey = 0;

    /*
     * Read the public key cert from the file
     */
    hFile = CreateFileA( "c:\\pub.pem", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
    if ( hFile == INVALID_HANDLE_VALUE )
    {
        fprintf( stderr, "Failed to open file. error: %d\n", GetLastError() );
    }

    if ( !ReadFile( hFile, pemPubKey, 2048, &readLen, NULL ) )
    {
        fprintf( stderr, "Failed to read file. error: %d\n", GetLastError() );
    }

    /*
     * Convert from PEM format to DER format - removes header and footer and decodes from base64
     */
    if ( !CryptStringToBinaryA( pemPubKey, 0, CRYPT_STRING_BASE64HEADER, derPubKey, &derPubKeyLen, NULL, NULL ) )
    {
        fprintf( stderr, "CryptStringToBinary failed. Err: %d\n", GetLastError() );
    }

    /*
     * Decode from DER format to CERT_PUBLIC_KEY_INFO
     */
    if ( !CryptDecodeObjectEx( X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, derPubKey, derPubKeyLen, 
                               CRYPT_ENCODE_ALLOC_FLAG, NULL, &publicKeyInfo, &publicKeyInfoLen ) )
    {
        fprintf( stderr, "CryptDecodeObjectEx 1 failed. Err: %p\n", GetLastError() );
        return -1;
    }

    /*
     * Acquire context 
     */
    if( !CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) )
    {
        {
            printf( "CryptAcquireContext failed - err=0x%x.\n", GetLastError() );
            return -1;
        }
    }

    /*
     * Import the public key using the context
     */
    if ( !CryptImportPublicKeyInfo( hProv, X509_ASN_ENCODING, publicKeyInfo, &hKey ) )
    {
        fprintf( stderr, "CryptImportPublicKeyInfo failed. error: %d\n", GetLastError() );
        return -1;
    }
    LocalFree( publicKeyInfo );

    /*
     * Now use hKey to encrypt whatever you need.
     */

    return 0;
}

نصائح أخرى

اكتشفت "السحر" سلسلة من المكالمات إلى استيراد RSA العامة الرئيسية في PEM format.تفضل:

  1. فك شفرة المفتاح في ثنائي النقطة مع CryptStringToBinary;تمر CRYPT_STRING_BASE64HEADER في dwFlags
  2. فك ثنائي النقطة الرئيسية في CERT_PUBLIC_KEY_INFO مع CryptDecodeObjectEx;تمر X509_ASN_ENCODING في dwCertEncodingType ، X509_PUBLIC_KEY_INFO في lpszStructType
  3. فك PublicKey النقطة من CERT_PUBLIC_KEY_INFO إلى مفتاح RSA النقطة مع CryptDecodeObjectEx;تمر X509_ASN_ENCODING في dwCertEncodingType ، RSA_CSP_PUBLICKEYBLOB في lpszStructType
  4. استيراد مفتاح RSA النقطة مع CryptImportKey

وأنا تواجه حاليا صعوبة نفسها. أنا لم تنته الترميز حل ولكن كما أفهمها تحتاج إلى تجريدها من ----- BEGIN الخ ----- و----- END الخ ------ العلامات وفك باستخدام Base64 .

وهذا يترك لك مع DER المشفرة سلسلة، والتي تحتاج إلى تحليل للحصول على معامل والأس العام. من تلك يمكنك تجميع الهياكل PUBLICKEYSTRUC وRSAPUBKEY. حظا سعيدا؛ -)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top