Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Функции CryptoAPI (Base64)


Автор: guest20060 1.11.2006, 21:08
Привет. Необходимо создать функции для шифрования (и расшифрования) строки по алгоритму Base64. Только важно не реализовывать алгоритм, а взять готовый из CryptoAPI. Я не знаю ни названий функций, ни способов для их импортирования из библиотек (да и откуда?). Возможно ли создать нечто типа:

function EncodeStringToBase64(Str: String): String;
begin

end;

function EncodeBase64ToString(Str: String): String;
begin

end;

Надеюсь на вашу помощь...

Автор: Romikgy 1.11.2006, 21:35
Цитата(guest20060 @  1.11.2006,  20:08 Найти цитируемый пост)
Надеюсь на вашу помощь... 

А поискать по форуму , напрячся?

Автор: guest20060 1.11.2006, 22:00
Будешь смеяться, но я не нашел здесь рабочего поиска. Не уверен, что найду решение проблемы применительно к моему случаю.

Автор: Snowy 1.11.2006, 22:26
А какая связь между CryptoAPI и Base64?
CryptoAPI - это шифрование.
Base64 - преобразование бинарных данных в текстовое представление.

Автор: guest20060 1.11.2006, 22:31
Согласен, я тоже связи не уловил... И все таки. Браузер отправляет мне сведения авторизации, зашифрованные Base64. Наверняка IE использует АПИшные функции. Уверен, что винда достаточно часто шифрует данные и необходимая функция все же есть.

Автор: Romikgy 1.11.2006, 22:32
Цитата(guest20060 @  1.11.2006,  21:00 Найти цитируемый пост)
Будешь смеяться, но я не нашел здесь рабочего поиска. 

 smile 
http://forum.vingrad.ru/act-Search/f-85.html

Автор: Snowy 1.11.2006, 23:00
угу. И в этом поиске нужно вбить "Base64".
Только искать не по этому разделу, а по Delphi/сети

Добавлено @ 23:00 
P.S. Кнопка поиска - вверху страницы - кнопка в виде лупы.

Автор: guest20060 1.11.2006, 23:10
Блин, ребята, хорош острить. Поставлен вопрос: как кодировать средствами WinAPI. Подключаемый модуль к программе только Windows и только Winsock. Я видел много кода с использованием компонентов, различных классов и др. подобного рода лабуды. Важно реализовать на API, но на худой конец подойдет и функция, не использующая другие модули и не сильно утяжеляющая размер исполнимого файла.

P. S. Пару лет назад получить корректный профессиональный ответ было гораздо проще чем сейчас. Но если нечего ответить, я прошу промолчать чтобы другие люди, действительно готовые помочь, видели, что тема до сих пор актуальна и не исчерпана. Надеюсь на ваше понимание...

Автор: Snowy 1.11.2006, 23:22
Цитата(guest20060 @  2.11.2006,  00:10 Найти цитируемый пост)
Блин, ребята, хорош острить
Даже и не пытались.
Просто указывали тебе на некорректность вопроса и место, где искать.

Цитата(guest20060 @  2.11.2006,  00:10 Найти цитируемый пост)
как кодировать средствами WinAPI
Встроенных средств нет.

Цитата(guest20060 @  2.11.2006,  00:10 Найти цитируемый пост)
 подойдет и функция, не использующая другие модули и не сильно утяжеляющая размер исполнимого файла.
 http://forum.vingrad.ru/index.php?showtopic=21411&view=findpost&p=200924
http://forum.vingrad.ru/index.php?showtopi...st&p=610684

Автор: dumb 1.11.2006, 23:43
Цитата(guest20060 @  1.11.2006,  23:10 Найти цитируемый пост)
Подключаемый модуль к программе только Windows и только Winsock

cryptoapi к этим двум не относится ни разу.

http://windowssdk.msdn.microsoft.com/en-us/library/ms724754.aspx
http://windowssdk.msdn.microsoft.com/en-us/library/ms723947.aspx

Цитата(guest20060 @  1.11.2006,  23:10 Найти цитируемый пост)
подойдет и функция, не использующая другие модули и не сильно утяжеляющая размер исполнимого файла

http://www.google.ru/search?q=base64+asm

Добавлено @ 23:45 
хотя windows - это ж солянка... там может и есть cryptoapi... user posted image

Автор: Snowy 2.11.2006, 00:08
Цитата(dumb @  2.11.2006,  00:43 Найти цитируемый пост)
CryptStringToBinary
CryptBinaryToString
Хм. Всё таки додумались встроить это в систему.
В принципе можно и хедеры для них написать.
Правда юзать их ещё рано - есть только в XP и 2003. Можно юзать только в корпоративах. Ибо далеко не универсал.

Цитата(dumb @  2.11.2006,  00:43 Найти цитируемый пост)
хотя windows - это ж солянка... там может и есть cryptoapi...
CryptoAPI естественно есть. advapi32.dll.
Но мне совершенно непонятно, как можно Base64 называть Crypt.
Кокой это нафиг крипт, когда банальный конверт.

Автор: dumb 2.11.2006, 01:35
Цитата(Snowy @  2.11.2006,  00:08 Найти цитируемый пост)
Правда юзать их ещё рано - есть только в XP и 2003

моя бы свою написало: делов-то - на пол-кило...

Цитата(Snowy @  2.11.2006,  00:08 Найти цитируемый пост)
CryptoAPI естественно есть. advapi32.dll

эм. я имел ввиду юнит дельфевый... smile (btw: таки Crypt32.dll)

Цитата(Snowy @  2.11.2006,  00:08 Найти цитируемый пост)
Но мне совершенно непонятно, как можно Base64 называть Crypt.
Кокой это нафиг крипт, когда банальный конверт.

думаю, что в данном случае приставка означает принадлежность к библиотеке.
а в составе криптографических функций imho она действительно необходима(как утилитарная), ибо достаточно часто используется передача именно кодированных base64 данных.

Автор: Snowy 2.11.2006, 01:51
Цитата(dumb @  2.11.2006,  02:35 Найти цитируемый пост)
эм. я имел ввиду юнит дельфевый...  (btw: таки Crypt32.dll)
В штатных хедерах CryptoAPI вообще не значится.

Цитата(dumb @  2.11.2006,  02:35 Найти цитируемый пост)
в составе криптографических функций imho она действительно необходима(как утилитарная), ибо достаточно часто используется передача именно кодированных base64 данных.
Это да.
Я имею ввиду отношение к Crypto. Base64 - это не криптование, а всего лишь преобразование из одного формата в другой.
Это не болшее криптование, чем IntToHex.
Именно этим вызвано моё недоумение.
Криптографией тут и не пахнет.

По данным функциям сделал хедеры и пример.
Хедеры:
Код

unit XPBase64;

interface

uses Windows;

const
  crypt32 = 'crypt32.dll';

  // Flags:
  CRYPT_STRING_BASE64HEADER = 0;
  // Base64, with certificate beginning and ending headers
  CRYPT_STRING_BASE64 = 1;
  // Base64, without headers
  CRYPT_STRING_BINARY = 2;
  // Pure binary copy
  CRYPT_STRING_BASE64REQUESTHEADER = 3;
  // Base64, with request beginning and ending headers
  CRYPT_STRING_HEX = 4;
  // Hexadecimal only
  CRYPT_STRING_HEXASCII= 5;
  // Hexadecimal, with ASCII character display
  CRYPT_STRING_BASE64X509CRLHEADER = 9;
  // Base64, with X.509 CRL beginning and ending headers
  CRYPT_STRING_HEXADDR = 10;
  // Hexadecimal, with address display
  CRYPT_STRING_HEXASCIIADDR = 11;
  // Hexadecimal, with ASCII character and address display
  CRYPT_STRING_HEXRAW = 12;
  // A raw hex string.

function ToBase64(s: string; Flags: dword = CRYPT_STRING_BASE64REQUESTHEADER): string;
function FromBase64(s: string; Flags: dword = CRYPT_STRING_BASE64REQUESTHEADER): string;

function CryptStringToBinary(pszString: PChar; cchString: dword; dwFlags: dword;
         pbBinary: pointer; var pcbBinary: dword; var pdwSkip: dword;
         var pdwFlags: dword): boolean; stdcall;

function CryptBinaryToString(pbBinary: pointer; cbBinary: dword; dwFlags: dword;
         pszString: PChar; var pcchString: dword): boolean; stdcall;

function CryptStringToBinaryA(pszString: PChar; cchString: dword; dwFlags: dword;
         pbBinary: pointer; var pcbBinary: dword; var pdwSkip: dword;
         var pdwFlags: dword): boolean; stdcall;

function CryptBinaryToStringA(pbBinary: pointer; cbBinary: dword; dwFlags: dword;
         pszString: PChar; var pcchString: dword): boolean; stdcall;

function CryptStringToBinaryW(pszString: PWideChar; cchString: dword; dwFlags: dword;
         pbBinary: pointer; var pcbBinary: dword; var pdwSkip: dword;
         var pdwFlags: dword): boolean; stdcall;

function CryptBinaryToStringW(pbBinary: pointer; cbBinary: dword; dwFlags: dword;
         pszString: PWideChar; var pcchString: dword): boolean; stdcall;

implementation

function CryptStringToBinary; external crypt32 name 'CryptStringToBinaryA';
function CryptBinaryToString; external crypt32 name 'CryptBinaryToStringA';
function CryptStringToBinaryA; external crypt32 name 'CryptStringToBinaryA';
function CryptBinaryToStringA; external crypt32 name 'CryptBinaryToStringA';
function CryptStringToBinaryW; external crypt32 name 'CryptStringToBinaryW';
function CryptBinaryToStringW; external crypt32 name 'CryptBinaryToStringW';

function ToBase64(s: string; Flags: dword = CRYPT_STRING_BASE64REQUESTHEADER): string;
var sz: dword;
begin
  CryptBinaryToString(pointer(s), Length(s), Flags, nil, sz);
  SetLength(result, sz);
  CryptBinaryToString(pointer(s), Length(s), Flags, pointer(result), sz);
end;

function FromBase64(s: string; Flags: dword = CRYPT_STRING_BASE64REQUESTHEADER): string;
var sz, skip: dword;
begin
  CryptStringToBinary(pointer(s), Length(s), Flags, nil, sz, skip, Flags);
  SetLength(result, sz);
  CryptStringToBinary(pointer(s), Length(s), Flags, pointer(result), sz, skip, Flags);
end;

end.

Пример:
Код

uses XPBase64;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo2.Text := ToBase64(Memo1.Text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo3.Text := FromBase64(Memo2.Text);
end;

Автор: guest20060 2.11.2006, 04:32
Спасибо

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