لدي شركة P & G — كيف يمكنني استخدام Wincrypt API لإنشاء زوج مفاتيح Diffie-Hellman؟

StackOverflow https://stackoverflow.com/questions/76581

سؤال

هناك مقالة MSDN هنا, ، لكنني لا أبتعد كثيرًا:

p = 139;
g = 5;

CRYPT_DATA_BLOB pblob;
pblob.cbData = sizeof( ULONG );
pblob.pbData = ( LPBYTE ) &p;

CRYPT_DATA_BLOB gblob;
gblob.cbData = sizeof( ULONG );
gblob.pbData = ( LPBYTE ) &g;

HCRYPTKEY hKey;
if ( ::CryptGenKey( m_hCryptoProvider, CALG_DH_SF,
                    CRYPT_PREGEN, &hKey ) )
{
    ::CryptSetKeyParam( hKey, KP_P, ( LPBYTE ) &pblob, 0 );

فشل هنا مع NTE_BAD_DATA.أنا استخدم MS_DEF_DSS_DH_PROV.ما يعطي؟

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

المحلول

من الممكن أنه لا يحب المفاتيح القصيرة جدًا التي تستخدمها.

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

يحرر:

أدرك OP من المثال أنه يجب عليك إخبار CryptGenKey بطول المفاتيح، وهو ما تفعله عن طريق تعيين أعلى 16 بت من العلامات على عدد البتات التي تريد استخدامها.إذا تركت هذا كـ 0، فستحصل على طول المفتاح الافتراضي.هذا يكون موثقة في ملاحظات قسم وثائق الجهاز، ومع dwFlags المعلمة في وثائق سطح المكتب.

بالنسبة لخوارزمية تبادل مفاتيح Diffie-Hellman، يكون الموفر الأساسي هو مفاتيح 512 بت افتراضيًا والموفر المحسن (وهو الافتراضي) هو مفاتيح 1024 بت افتراضيًا، في نظام التشغيل Windows XP والإصدارات الأحدث.لا يبدو أن هناك أي وثائق للأطوال الافتراضية في CE.

ولذلك يجب أن يكون الرمز:

BYTE p[64] = { 139 }; // little-endian, all other bytes set to 0
BYTE g[64] = { 5 };

CRYPT_DATA_BLOB pblob;
pblob.cbData = sizeof( p);
pblob.pbData = p;

CRYPT_DATA_BLOB gblob;
gblob.cbData = sizeof( g );
gblob.pbData = g;

HCRYPTKEY hKey;
if ( ::CryptGenKey( m_hCryptoProvider, CALG_DH_SF,
                    ( 512 << 16 ) | CRYPT_PREGEN, &hKey ) )
{
    ::CryptSetKeyParam( hKey, KP_P, ( LPBYTE ) &pblob, 0 );

نصائح أخرى

يبدو لي ذلك KP_P, KP_G, KP_Q مخصصة لمفاتيح DSS (معيار التوقيع الرقمي؟).بالنسبة إلى Diffie-Hellman، يبدو أنه من المفترض أن تستخدمه KP_PUB_PARAMS وتمرير أ DATA_BLOB الذي يشير إلى أ DHPUBKEY_VER3 بناء.

لاحظ أن المقالة التي تشير إليها مأخوذة من Windows Mobile/Windows CE SDK.لن تكون هذه هي المرة الأولى التي يعمل فيها CE بشكل مختلف عن سطح المكتب/الخادم.

يحرر:لا ينفذ CE KP_PUB_PARAMS.لاستخدام هذه البنية على سطح المكتب، راجع Diffie-Hellman الإصدار 3 من BLOBs للمفتاح العام.

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