Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > RSA на С++


Автор: nerdy_weirdie 15.4.2008, 17:53
Добрый день. Мне вот понадобилось шифрование на С++ сделать, раньше не приходилось, может кто знающий подскажет, а то весь день убил. Неясно куда приткнуть эту штуку "10001". Можно на WinApi, либо при помощи функций из OpenSSL.
Вот джава-скриптик, который надо переписать на C++:
var PublicKey = "87BC864F973F29EB0B2B1E7C54E1AED05228DFEB5B9C30FF34502E56DDCFE9......";
var RSA = new RSAKey();
RSA.setPublic(PublicKey, "10001");
var Res = RSA.encrypt( StringToEncrypt );

Заранее Спасибо

Автор: Mihhail 15.4.2008, 20:11
nerdy_weirdie, Вот http://netcode.ru/cpp/?lang=&katID=9&skatID=106&artID=4013 можно исходник небольшой по этому алгоритму скачать.


Автор: nerdy_weirdie 16.4.2008, 03:54
Цитата(Mihhail @ 15.4.2008,  20:11)
nerdy_weirdie, Вот http://netcode.ru/cpp/?lang=&katID=9&skatID=106&artID=4013 можно исходник небольшой по этому алгоритму скачать.

Спасибо за ответ! Вот посмотрел я этот исходник, и опять же неясно, куда приткнуть эту строку "10001". И вообще не понимаю, что она значит. Это вторая часть ключа? Справки по этому методу setPublic нигде не нашел. И все же лучше пример на проверенных библиотеках, как wincrypt, openssl.

Автор: just_geek 16.4.2008, 10:55
Код

#define KEYLENGTH  0x00800000
#define ENCRYPT_ALGORITHM CALG_RC4 
#define ENCRYPT_BLOCK_SIZE 8 

const LPTSTR pszPassword = L"my_secrey_key";

bool EncryptPassword(const QString &srcPassword, QString &dstPassword)
{
    bool result = false;
    HCRYPTPROV hCryptProv = NULL; 
    HCRYPTKEY hKey = NULL; 
    HCRYPTHASH hHash = NULL; 

    DWORD dwBlockLen; 
    DWORD dwBufferLen; 

    // Get the handle to the default provider. 
    if ( CryptAcquireContext (&hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) ) {
        // Create a hash object. 
        if ( CryptCreateHash( hCryptProv, CALG_MD5, 0, 0, &hHash) ) {
            // Hash the password. 
            if( CryptHashData( hHash, (BYTE *)pszPassword, lstrlen(pszPassword), 0) ) {
                // Derive a session key from the hash object. 
                if( CryptDeriveKey( hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey)) {
                    //---------------------------------------------------------------
                    // Determine the number of bytes to encrypt at a time. 
                    // This must be a multiple of ENCRYPT_BLOCK_SIZE.
                    // ENCRYPT_BLOCK_SIZE is set by a #define statement.
                    dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE; 

                    //---------------------------------------------------------------
                    // Determine the block size. If a block cipher is used, 
                    // it must have room for an extra block. 
                    if(ENCRYPT_BLOCK_SIZE > 1) 
                        dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE; 
                    else 
                        dwBufferLen = dwBlockLen; 

                    QByteArray qbdata = srcPassword.toAscii();
                    DWORD size = (DWORD)qbdata.size();
                    if(CryptEncrypt( hKey, NULL, TRUE, 0, (BYTE*)qbdata.data(), &size, dwBufferLen)) {
                        dstPassword = qbdata;
                        result = true;
                    }
                }
            }
        }
    }

    // Release the hash object. 
    if(hHash) 
    {
        if(!(CryptDestroyHash(hHash)))
        {
        }

        hHash = NULL;
    }

    // Release the session key. 
    if(hKey)
    {
        if(!(CryptDestroyKey(hKey)))
        {
        }
    }

    // Release the provider handle. 
    if(hCryptProv)
    {
        if(!(CryptReleaseContext(hCryptProv, 0)))
        {
        }
    }

    return result;
}

ну вот переделанный пример из мсдн (там файлы шифровались), вырезал отсюда обработку ошибок, чтоб поменьше было )

Автор: xvr 16.4.2008, 12:06
Цитата(nerdy_weirdie @ 15.4.2008,  17:53)
Добрый день. Мне вот понадобилось шифрование на С++ сделать, раньше не приходилось, может кто знающий подскажет, а то весь день убил. Неясно куда приткнуть эту штуку "10001". 

Судя по всему это public экспонента (в упомянутом nerdy_weirdie исходнике это e), и вместе с тем, что называется PublicKey они и составляют реальный Public Key для RSA. Куда ее притыкать - дело темное, Crypto API в Win работает только с ключем целиком, причем они не раскрывают подробностей, как этот ключ сделать из составляющих частей  smile 

Автор: nerdy_weirdie 16.4.2008, 13:37
Цитата(xvr @ 16.4.2008,  12:06)
Цитата(nerdy_weirdie @ 15.4.2008,  17:53)
Добрый день. Мне вот понадобилось шифрование на С++ сделать, раньше не приходилось, может кто знающий подскажет, а то весь день убил. Неясно куда приткнуть эту штуку "10001". 

Судя по всему это public экспонента (в упомянутом nerdy_weirdie исходнике это e), и вместе с тем, что называется PublicKey они и составляют реальный Public Key для RSA. Куда ее притыкать - дело темное, Crypto API в Win работает только с ключем целиком, причем они не раскрывают подробностей, как этот ключ сделать из составляющих частей  smile

 smile  О майн гот.. мрачняк.. мне как раз таки надо в точности повторить приведенное в первом посте джаваскриптовое шифрование, именно с этой экспонентой.. может, какие другие библиотеки есть?

Автор: xvr 16.4.2008, 13:45
Цитата(nerdy_weirdie @ 16.4.2008,  13:37)
Цитата(xvr @ 16.4.2008,  12:06)
Цитата(nerdy_weirdie @ 15.4.2008,  17:53)
Добрый день. Мне вот понадобилось шифрование на С++ сделать, раньше не приходилось, может кто знающий подскажет, а то весь день убил. Неясно куда приткнуть эту штуку "10001". 

Судя по всему это public экспонента (в упомянутом nerdy_weirdie исходнике это e), и вместе с тем, что называется PublicKey они и составляют реальный Public Key для RSA. Куда ее притыкать - дело темное, Crypto API в Win работает только с ключем целиком, причем они не раскрывают подробностей, как этот ключ сделать из составляющих частей  smile

 smile  О майн гот.. мрачняк.. мне как раз таки надо в точности повторить приведенное в первом посте джаваскриптовое шифрование, именно с этой экспонентой.. может, какие другие библиотеки есть?

Есть, RASEURO например.

Автор: nerdy_weirdie 16.4.2008, 14:59
Вот интересно бы узнать, что это за зверь такой new RSAKey();
COM-объект какой-то или что... и откуда он на веб страничке в джаваскрипте взялся..

Автор: jonie 17.4.2008, 08:51
а у меня такого нету... но вообще говоря это должен быть ActiveX компонент...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)