Шифрование / дешифрование из C # в C ++ - PullRequest
1 голос
/ 10 января 2012

Я работаю над приложением, которое использует сервер C # и клиент C ++, и данные лицензирования передаются между двумя приложениями.Я, очевидно, хочу зашифровать эти лицензии по соображениям безопасности, но у меня возникли некоторые проблемы с поиском библиотеки, которая будет соответствовать моим целям для C ++.А именно, я пробовал как Crypto ++, так и CryptoAPI.Crypto ++ выглядит как приятная и простая в использовании библиотека, но результаты шифрования Crypto ++ и C # отличаются.CryptoAPI может справиться с этой задачей, поскольку поддерживается Microsoft, но API сбивает с толку и его трудно понять.Кроме того, как ни странно, C # генерирует один и тот же зашифрованный вывод при каждом запуске, хотя я не касаюсь случайного генерирования IV.Crypto ++ этого не делает (выходные данные меняются с каждым временем выполнения при случайных IV).

У кого-нибудь есть какие-либо предложения или рекомендации?Я использую режимы CBC для Crypto ++ и C #, поэтому я не думаю, что это проблема.В настоящее время я использую TripleDES, чтобы программа работала первой.Должен ли я использовать другой алгоритм (наверняка, когда закончу)?

Код, как было запрошено (извините за это):

public static string Encrypt(string ToEncrypt, string Key)
{
    byte[] keyArray = UTF8Encoding.UTF8.GetBytes(Key);
    byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(ToEncrypt);
    TripleDESCryptoServiceProvider tDes = new TripleDESCryptoServiceProvider();

    tDes.Key = keyArray;
    tDes.Mode = CipherMode.CBC;
    tDes.Padding = PaddingMode.PKCS7;
    ICryptoTransform cTransform = tDes.CreateEncryptor();
    byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
    tDes.Clear();
    return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}

И расшифровка (C ++):

std::string Decrypt(std::string ToDecrypt, string Key)
{
    const byte *byteKey = (byte*) Key.c_str();
    CryptoPP::SecByteBlock key(CryptoPP::DES_EDE2::DEFAULT_KEYLENGTH);
    key.Assign(byteKey, Key.length());
    byte iv[8] = { 1, 1, 1, 1, 1, 1, 1, 1 };

    try {
        std::string recovered, cipher;
        CryptoPP::CBC_Mode<CryptoPP::DES_EDE2>::Decryption d;
        d.SetKeyWithIV(key, key.size(), iv);

        CryptoPP::StringSource(ToDecrypt, true, new CryptoPP::Base64Decoder(new CryptoPP::StringSink(cipher)));
        CryptoPP::StringSource(cipher, true, new CryptoPP::StreamTransformationFilter(d, new CryptoPP::StringSink(recovered)));

        std::cout << "Recovered: " << recovered << std::endl;
        return recovered;
    } catch (const CryptoPP::Exception &e) {
        std::cout << e.what() << std::endl;
        exit(1);
    }
}

1 Ответ

1 голос
/ 22 сентября 2012

//Decryption Dll

extern "C"

{
__declspec(dllexport)  char* Parse(LPSTR Data)
{
    CString decryptString;  //ccrpyt is a c++ encryption and decryption library
    CCrypt crypt;
    char* sUser = new char[200];
    char* sURL = new char[200];
        strcpy(sUser, Data);
     CString sEncryptedUser= crypt.DecryptStrFromHex(sUser);  
    strcpy(sURL, sEncryptedUser.GetBuffer());
    return sURL ;
}
}


{
    __declspec(dllexport)  char* Parse(LPSTR Data)
{
    CString decryptString;  //ccrpyt is a c++ encryption and decryption library
    CCrypt crypt;
    char* sUser = new char[200];
    char* sURL = new char[200];
        strcpy(sUser, Data);
     CString sEncryptedUser= crypt.DecryptStrFromHex(sUser);  
    strcpy(sURL, sEncryptedUser.GetBuffer());
    return sURL ;
}
}

Я называю это C # как ...

public static extern IntPtr Parse([MarshalAs(UnmanagedType.LPStr)] string s1);
            string s = Request.QueryString.Get("U");
            IntPtr i;
            {
                i = Parse(s);
            }
            string jj =Marshal.PtrToStringAnsi(i);
            Response.Write(jj);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...