Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кодирование строки в base64 формат 
:(
    Опции темы
Fobos
Дата 25.8.2008, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Пишу программку которая должна отправлять письма, для авторизиции на почтовом сервере логин и паароль необходимо отправлять зашифрованным в base64-алгоритм. В чем собственно проблемка вроде нашел функцию для этого но никак не мгу заставить ее работать. Читал и MSDN там скупо написано, но вроде все правильно, вот код:

Код

CString m_from;
BYTE* buf = new BYTE[200];
DWORD* pcbBinary = new DWORD;
DWORD* pdwSkip = new DWORD;
DWORD* pdwFlags = new DWORD;
ret = CryptStringToBinary((LPCTSTR)m_from, m_from.GetLength(), CRYPT_STRING_BASE64HEADER,
                buf, pcbBinary, pdwSkip, pdwFlags);

эта функция функция выполняется, но код возврата 1, т.е. ошибка. GetLastError() дает 13 ERROR_INVALID_DATA
помогите пожалуйста кто знает в чем проблема
PM MAIL ICQ   Вверх
Fobos
Дата 25.8.2008, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



извиняюсь функция возвращает 0 а GetLastError() 13
PM MAIL ICQ   Вверх
vinter
Дата 26.8.2008, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Fobos, так у тя строка пустая, заполни ее чем-нибудь.


--------------------
Мой блог
PM MAIL WWW   Вверх
Fobos
Дата 26.8.2008, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Я немного не полностью написал. эта переменная m_from он через DDX получает значение это точно. Прикол в том что если написать вот так, то работать будет
WCHAR* str = L"hello this is a string";

CString m_from;
BYTE* buf = new BYTE[200];
DWORD* pcbBinary = new DWORD;
DWORD* pdwSkip = new DWORD;
DWORD* pdwFlags = new DWORD;
WCHAR* str = L"hello this is a string";
ret = CryptStringToBinary(str, 15, CRYPT_STRING_BASE64,
                buf, pcbBinary, pdwSkip, pdwFlags);
то она работаьт будет. Я смотрел дизассемблером в обоих случаях передается просто адрес строки UNICODE, но работает только во втором. Подскажите в чем проблема.
PM MAIL ICQ   Вверх
vinter
Дата 26.8.2008, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Fobos, в дебаге смотрел что содержится в строке перед вызовом ф-ии? какой размер передается?


--------------------
Мой блог
PM MAIL WWW   Вверх
Fobos
Дата 26.8.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Я же написал что проверял Олькой. В обоих случаях в функцию передается адрес строки, по этому адресу реально находится соответствующая строка(проверял). Размер я постоянный выставил. Но в первом случае не работает а во втором случае работает. 
Получаются какие-то чудеса: если адрес строки находится в области где размещаются динамические переменные функция работает, а если адрес строки находится в области где находятся статические переменные то она не работает. Как такое может быть?
PM MAIL ICQ   Вверх
vinter
Дата 26.8.2008, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56





--------------------
Мой блог
PM MAIL WWW   Вверх
Fobos
  Дата 26.8.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Да я и MSDN читал, все без толку..
PM MAIL ICQ   Вверх
vinter
Дата 26.8.2008, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Код

CString m_from = _T("превед");
DWORD* pcbBinary = new DWORD;
DWORD* pdwSkip = new DWORD;
DWORD* pdwFlags = new DWORD;

CryptStringToBinary(, m_from.GetLength(), CRYPT_STRING_BASE64HEADER,
                NULL, pcbBinary, pdwSkip, pdwFlags);
BYTE* buf = new BYTE[*pcbBinary];

ret = CryptStringToBinary((LPCTSTR)m_from, m_from.GetLength(), CRYPT_STRING_BASE64HEADER,
                buf, pcbBinary, pdwSkip, pdwFlags);


попробуй так



--------------------
Мой блог
PM MAIL WWW   Вверх
Fobos
Дата 28.8.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Не помогает никак  smile 
PM MAIL ICQ   Вверх
blackswanny
Дата 13.5.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 13.5.2011

Репутация: нет
Всего: нет



аналогичная проблема
поставили задачу перенести ПО с одного сервера на другой, нашёл исходники одной DLL, выяснил, что проблема в CryptStringToBinary, возвращает ERROR_INVALID_DATA, на входе ключ такой же, как и на работающем сервере, в общем всё кажется одинаковым, но что-то не так
PM MAIL   Вверх
Alca
Дата 23.5.2011, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

еобходимо отправлять зашифрованным в base64-алгоритм

можно OpenSSL заюзать


--------------------
PM WWW ICQ Skype Jabber   Вверх
Modul
Дата 24.5.2011, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 17.2.2006

Репутация: нет
Всего: нет



...и можно найти исходники base64  smile 
--------------------
I'll be back !
PM MAIL   Вверх
Amp
Дата 25.5.2011, 22:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 886
Регистрация: 17.2.2009

Репутация: 3
Всего: 17



Эм, алгоритм на коленке реализуется за пол-часа.
PM MAIL   Вверх
ZVano
Дата 12.8.2011, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 259
Регистрация: 11.12.2006
Где: Украина, Кривой Р ог

Репутация: нет
Всего: 4



У меня отлично работает этот код. Выковырял в нете.
Код

#include <Windows.h>
#include <Wincrypt.h>

#pragma link "crypt32.lib"

DWORD cryptMode = CRYPT_STRING_BASE64;

AnsiString Base64Encode(AnsiString s) {
    DWORD sz;
    AnsiString res;
    CryptBinaryToString((unsigned char*)s.c_str(), s.Length(), cryptMode, NULL, &sz);
    char *r;
    r = (char*)GlobalAlloc(GPTR, sz);
    CryptBinaryToString((unsigned char*)s.c_str(), s.Length(), cryptMode, r, &sz);
    res = AnsiString(r);
    GlobalFree(r);
    res = res.Delete(sz - 1, 2);
    return res;
}

AnsiString Base64Decode(AnsiString s) {
    DWORD sz;
    AnsiString res;

    CryptStringToBinary(s.c_str(), s.Length(), cryptMode, NULL, &sz, NULL, NULL);
    char *r;
    r = (char*)GlobalAlloc(GPTR, sz);
    CryptStringToBinary(s.c_str(), s.Length(), cryptMode, r, &sz, NULL, NULL);
    res = AnsiString(r);
    res.SetLength(sz);
    GlobalFree(r);
    return res;
}




--------------------
НЕ ФЛУДИМ. Пользуемся кнопками "+" или "-" для выражения своего отношения к теме или сообщению.
Гуглим "Как правильно задавать вопросы"
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.