Re: CryptoAPI - как достать закрытый ключ RSA?
От: mkopachev  
Дата: 02.04.05 09:31
Оценка: 3 (1)
Здравствуйте, luser, Вы писали:

L>Подскажите, пожалуйста лузеру.

L>Я не могу достать закрытый ключ RSA. Экспортировал я его так:

L>
L>RSAPrivKey1024 key;
L>        DWORD dwLen=sizeof(RSAPrivKey1024);
L>    if(!CryptExportKey(hXchgKey,0,PRIVATEKEYBLOB,0,(BYTE *)&key,&dwLen)) 
L>    {
L>        return false;
L>    }
L>

L>Что не так?

Какакя ошибка-то вылезает?

Попробуй провести экспорт на каком-либо ключе (второй параметр), так как некоторые
криптопровайдеры не позволяют экспорт закрытого ключа без шифрования. А некторые
вообще не позволяют экспорта закрытого ключа.

Кроме этого возможно, что ключ создан как не эеспортируемый (при создании или
импорте не был указан флаг CRYPT_EXPORTABLE).

С уважением Михаил Копачев
... << RSDN@Home 1.1.4 @@subversion >>
Re[3]: CryptoAPI - как достать закрытый ключ RSA?
От: mkopachev  
Дата: 02.04.05 13:15
Оценка: 3 (1)
Здравствуйте, luser, Вы писали:

L>Здравствуйте, mkopachev, Вы писали:


M>>Здравствуйте, luser, Вы писали:


L>>>Подскажите, пожалуйста лузеру.

L>>>Я не могу достать закрытый ключ RSA. Экспортировал я его так:


L>Спасибо что ответили, но я не могу импортировать закрытый ключ. Экспортирование проходит нормально.

L>С уважением Леонид.

Извини не понял. Но все-таки какой код ошибки-то вылазит (если я понял он вылазит при импорте)?
... << RSDN@Home 1.1.4 @@subversion >>
Re[5]: CryptoAPI - как достать закрытый ключ RSA?
От: mkopachev  
Дата: 03.04.05 09:48
Оценка: 3 (1)
Здравствуйте, luser, Вы писали:

L>Здравствуйте, mkopachev, Вы писали:


M>>Здравствуйте, luser, Вы писали:


L>>>Здравствуйте, mkopachev, Вы писали:


M>>>>Здравствуйте, luser, Вы писали:


L>>>>>Подскажите, пожалуйста лузеру.

L>>>>>Я не могу достать закрытый ключ RSA. Экспортировал я его так:


L>>>Спасибо что ответили, но я не могу импортировать закрытый ключ. Экспортирование проходит нормально.

L>>>С уважением Леонид.

M>> Извини не понял. Но все-таки какой код ошибки-то вылазит (если я понял он вылазит при импорте)?


L>Да правильно вылетает при импорте. GetLastError() возвращает 2148073475 ни с одним флагом ошибки CryptImportKey не совпадает (перебрал вроде все).


Ошибка называется NTE_BAD_KEY (80090003). Действительно удивительно ее появление в твоем случае. Расшифровывается она так, что ключ (очевидно в данном случае ключ на котором производится импорт) не верен.

Это то что я вычитал в документации к Крипто-Про (CPImportKey):

Один или оба из ключей, указанных hKey и hImpKey, не действительны. Байты в элементах заголовка ключевого блоба типа WORD, DWORD имеют обратный порядок по отношению к данной платформе.


Т.е. проверь, то ли ты пытаешься импортировать — возможно та информация, которая
импортируется не соответсвует той, которая была экспортирована?
И последнее, возможно криптопровайдер просто не допускает импорта не зашифрованного ключа? Попробуй сделать какой-нибудь потоковый ключик (тип RC4), а затем экспортнуть и импортнуть на нем (чтобы закрытый ключ оказался зашифрованным).

З.Ы. Вообще-то использование структур фиксированного размера для ключей не есть хорошо — оно у тебя так сделано с каким-то прицелом? Лекго может оказаться резаный алгоритм (экспортные ограничения США), с меньшей длинной ключа и структуры могут съехать. Ты длинну экспортируемого ключа проверил?

С уважением Михаил Копачев
... << RSDN@Home 1.1.4 @@subversion >>
CryptoAPI - как достать закрытый ключ RSA?
От: luser  
Дата: 01.04.05 16:45
Оценка:
Подскажите, пожалуйста лузеру.
Я не могу достать закрытый ключ RSA. Экспортировал я его так:

RSAPrivKey1024 key;
        DWORD dwLen=sizeof(RSAPrivKey1024);
    if(!CryptExportKey(hXchgKey,0,PRIVATEKEYBLOB,0,(BYTE *)&key,&dwLen)) 
    {
        return false;
    }

Что не так?

HFILE hFileKey;
        if(!((hFileKey=_lopen(privkey, OF_READ))!=HFILE_ERROR))
        {
            return false;
        }
        EncFileHeader fh;
        if(!_hread(hFileKey,&fh,sizeof(fh)))
        {
            return false;
        }
        if(!CryptImportKey(hProv,(BYTE *) &fh.kb,sizeof(RSA1024KeyExchBLOB),0,CRYPT_EXPORTABLE,&hXchgKey)) 
        {
            return false;
        }


P.S



template<int bitlen> struct RSAPubKey
{
    PUBLICKEYSTRUC  publickeystruc ;
    RSAPUBKEY rsapubkey;
    BYTE modulus[bitlen/8];
};

template<int bitlen> struct RSAPrivKey
{
    RSAPubKey<bitlen> pubkey;
    BYTE prime1[bitlen/16];
    BYTE prime2[bitlen/16];
    BYTE exponent1[bitlen/16];
    BYTE exponent2[bitlen/16];
    BYTE coefficient[bitlen/16];
    BYTE privateExponent[bitlen/8];
};

typedef RSAPubKey<1024> RSAPubKey1024;
typedef RSAPrivKey<1024> RSAPrivKey1024;

template<int bitlen> struct RSAKeyExchBLOB
{
    PUBLICKEYSTRUC publickeystruc ;
    ALG_ID algid;
    BYTE encryptedkey[bitlen/8];
};

typedef RSAKeyExchBLOB<1024> RSA1024KeyExchBLOB;

typedef struct
{
    RSA1024KeyExchBLOB kb;
    unsigned __int64 fSize;
} EncFileHeader;


Заранее спасибо! (помните вы тоже, когда-то были лузерами)
Re[2]: CryptoAPI - как достать закрытый ключ RSA?
От: luser  
Дата: 02.04.05 09:57
Оценка:
Здравствуйте, mkopachev, Вы писали:

M>Здравствуйте, luser, Вы писали:


L>>Подскажите, пожалуйста лузеру.

L>>Я не могу достать закрытый ключ RSA. Экспортировал я его так:

L>>
L>>RSAPrivKey1024 key;
L>>        DWORD dwLen=sizeof(RSAPrivKey1024);
L>>    if(!CryptExportKey(hXchgKey,0,PRIVATEKEYBLOB,0,(BYTE *)&key,&dwLen)) 
L>>    {
L>>        return false;
L>>    }
L>>

L>>Что не так?

M> Какакя ошибка-то вылезает?


M> Попробуй провести экспорт на каком-либо ключе (второй параметр), так как некоторые

M> криптопровайдеры не позволяют экспорт закрытого ключа без шифрования. А некторые
M> вообще не позволяют экспорта закрытого ключа.

M> Кроме этого возможно, что ключ создан как не эеспортируемый (при создании или

M> импорте не был указан флаг CRYPT_EXPORTABLE).

M> С уважением Михаил Копачев


Спасибо что ответили, но я не могу импортировать закрытый ключ. Экспортирование проходит нормально.
С уважением Леонид.
Re[4]: CryptoAPI - как достать закрытый ключ RSA?
От: luser  
Дата: 02.04.05 13:53
Оценка:
Здравствуйте, mkopachev, Вы писали:

M>Здравствуйте, luser, Вы писали:


L>>Здравствуйте, mkopachev, Вы писали:


M>>>Здравствуйте, luser, Вы писали:


L>>>>Подскажите, пожалуйста лузеру.

L>>>>Я не могу достать закрытый ключ RSA. Экспортировал я его так:


L>>Спасибо что ответили, но я не могу импортировать закрытый ключ. Экспортирование проходит нормально.

L>>С уважением Леонид.

M> Извини не понял. Но все-таки какой код ошибки-то вылазит (если я понял он вылазит при импорте)?


Да правильно вылетает при импорте. GetLastError() возвращает 2148073475 ни с одним флагом ошибки CryptImportKey не совпадает (перебрал вроде все).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.