windows - RSA_public_decrypt و مس كريبتو أبي المكافئ




cryptography openssl (2)

أحاول تطوير حل للتحقق من الترخيص. يتم ترميز التراخيص على الخادم باستخدام وظيفة RSA_private_encrypt بينسل.

ل ماك أوكس الحادي عشر استخدام RSA_public_decrypt وأنها تعمل مثل سحر. على ويندوز يجب أن استخدام قليلا جدا من التعليمات البرمجية، لذلك لا أستطيع ربط مع بينسل أو ليب أخرى ولدي لاستخدام مس كريبتو أبي.

لقد قضيت عدة أيام في محاولة لمعرفة ما هو الخطأ، ولكن مع أي حظ. يمكنني بنجاح استيراد المفتاح العام، ولكن هنا ينتهي نجاحي. أنا على علم بأنني بحاجة إلى عكس ترتيب بايت مع كابي حتى هذا قد لا يكون القضية.

لقد حاولت كل شيء، بما في ذلك CryptVerifyMessageSignatureWithKey و CryptDecodeObject لتحميل النقطة مع معلمات مختلفة، ولكن لا يزال لا حظ.

وينتهي دائما مع GetLastError() == CRYPT_E_ASN1_BADTAG ، الذي افترض يعني أن بلوب غير ASN1 تنسيق ... جوجل لا يقول أي شيء على تنسيق الإخراج من RSA_private_encrypt ... لذلك أنا فقدت تماما هنا.

هنا هو رمز أوس X على أساس بينسل:

void cr_license_init(const char* lic) {
    __cr_license_ = lic;
    unsigned char lic_encoded[CR_LIC_LEN];

    BIO* b64 = BIO_new(BIO_f_base64());
    BIO* licIn = BIO_new_mem_buf((void*)lic, -1);
    licIn = BIO_push(b64, licIn);

    if(BIO_read(licIn, lic_encoded, CR_LIC_LEN) == CR_LIC_LEN) {

        const unsigned char* key_data = license_pub_der;
        RSA* r = d2i_RSA_PUBKEY(NULL, &key_data, sizeof(license_pub_der));

        if(r != NULL) {
            if(__cr_license_data_ != NULL) {
                free((void*)__cr_license_data_);
            }
            __cr_license_data_ = malloc(CR_LIC_LEN);
            if(RSA_public_decrypt(CR_LIC_LEN, lic_encoded,
    (unsigned char*)__cr_license_data_, r, RSA_PKCS1_PADDING) &lt= 0) {
                free((void*)__cr_license_data_);
                __cr_license_data_ = NULL;
            }
            RSA_free(r);
        }
    }
    BIO_free_all(licIn);
}

هذا الجزء من التعليمات البرمجية على ويندوز يعمل بشكل جيد، لذلك أنا أفترض أن المفتاح العمومي ليست قضية.

__cr_license_ = lic;
unsigned char lic_encoded[CR_LIC_LEN];

DWORD dwSize;
if(CryptStringToBinaryA(__cr_license_, 0/*autocalculate*/, CRYPT_STRING_BASE64, lic_encoded, &dwSize, NULL, NULL) && dwSize == CR_LIC_LEN) {
HCRYPTPROV hProv;
if(CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)) {
    PCERT_PUBLIC_KEY_INFO pki = NULL;
    DWORD dwKeySize;
    if(CryptDecodeObjectEx(X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, license_pub_der, sizeof(license_pub_der), CRYPT_ENCODE_ALLOC_FLAG, NULL, &pki, &dwKeySize)) {
        HCRYPTKEY hKey = 0;
        if(CryptImportPublicKeyInfo( hProv, X509_ASN_ENCODING, pki, &hKey)) {

ولكن بعد أن أي شيء أحاول القيام به مع رسالة يؤدي إلى CRYPT_E_ASN1_BADTAG . حاولت CryptDecodeObject مع CryptDecodeObject ، CryptVerifyMessageSignatureWithKey ، CryptVerifyMessageSignatureWithKey - لا شيء يعمل.

أساسا أعتقد أن المشكلة في pkcs1 و pkcs7 عدم التوافق كما أولستيد المذكورة. هل هناك أي شخص لديه خبرة في العمل مع تنسيق pkcs1 استيراد / تحويل / الخ مع مس كابي؟

أي مساعدة أو حتى فكرة هو محل تقدير الكثير! شكرا مقدما!


أوبنسل تصدير مفاتيح مع رأس إضافي الذي لا يتوقع من قبل كريبتوابي.

رأس المفتاح الخاص (بتسمية ASN.1):

Offset| Len  |LenByte|
======+======+=======+======================================================================
     0|   630|      3| SEQUENCE : 
     4|     1|      1|    INTEGER : 0
     7|    13|      1|    SEQUENCE : 
     9|     9|      1|       OBJECT IDENTIFIER : rsaEncryption [1.2.840.113549.1.1.1]
    20|     0|      1|       NULL : 
    22|   608|      3|    OCTET STRING : 
                             ... actual key data go here ...

رأس المفتاح العمومي (بتسمية ASN.1):

Offset| Len  |LenByte|
======+======+=======+======================================================================
     0|   159|      2| SEQUENCE : 
     3|    13|      1|    SEQUENCE : 
     5|     9|      1|       OBJECT IDENTIFIER : rsaEncryption [1.2.840.113549.1.1.1]
    16|     0|      1|       NULL : 
    18|   141|      2|    BIT STRING UnusedBits:0 : 
                              ... actual key data go here ...

هذه الرؤوس هي ما يسبب كريبتدكوديوبجيكتيكس لاختناق. وتتوقع بيانات مفتاح راو، دون أي رأس.

لذلك، في الأساس، تحتاج:

  1. (اختياري) تحويل .PEM إلى .DER مع كريبتسترينغتوبيناري.
  2. تحقق مما إذا كان دير يبدأ مع الرؤوس المذكورة أعلاه. لذلك تحتاج إلى قراءة البيانات المشفرة ASN.1.
  3. (اختياري) تخطي الرأس المذكور أعلاه والسعي مباشرة إلى بيانات المفتاح (يبدأ مع تسلسل الذي يتضمن 2 إنتيجر للمفتاح العمومي أو 9 إنتيجر للمفتاح الخاص).
  4. إطعام النتيجة إلى كريبتدكوديوبجيكتيكس (X509_ASN_ENCODING، RSA_CSP_PUBLICKEYBLOB / PKCS_RSA_PRIVATE_KEY).
  5. استيراد مفاتيح مع كريبتيمبوركي.

كنت خلط صيغ التوقيع مستوى أعلى وأدنى. أبنسل أسوميس يسس # 1 v1.5 التواقيع افتراضيا، والذي يحتوي على بيانات التوقيع فقط. ويندوز يبدو أن أسوم # 7 حاويات. قد تحتوي هذه على يسس # 1 v1.5، ولكن يتم لف هذه والبيانات الأخرى باستخدام ASN.1 بير العلامة / طول التنسيق. إذا حاولت أبي ميكروسوفت فك شفرة هذا سوف نفترض أن التوقيع الخام هو تنسيق الحاوية، وسوف تفشل فك التشفير.





cryptoapi