Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2017, 17:41   #1
Valimer
 
Регистрация: 05.11.2015
Сообщений: 9
По умолчанию Шифрование текста

Здравствуйте, столкнулся с проблемой, нужно сделать это:
есть Publickmod и exp=010001
нужно текст шифровать в RSA при помощи данных выше

Помогите кодом, думаю тема уже заезженная, поэтому функции нет, ковылял в гугле и Яндексе, но что-то или плохо искал или ничего не нашёл, буду рад если поможете кодом

Собственно есть функция:
Код:
function EncryptString(source: string): string;
  var
    DecryptedData, EncryptedData, KeyPair: TStringStream;
    RSA: HCRYPTPROV;
    HPair: HCRYPTKEY;
    DDataSize, EDataSize: DWORD;
  begin
    DecryptedData := TStringStream.Create(source);
    EncryptedData := TStringStream.Create;
    KeyPair := TStringStream.Create;
 
    // Инициализаируем CryptoAPI
    if not(CryptAcquireContext(RSA, nil, nil, PROV_RSA_FULL,
      CRYPT_VERIFYCONTEXT)) then
      ShowMessage(IntToStr(GetLastError) + ' CryptAcquireContext');
 
    // Импортируем ключ
    KeyPair.LoadFromFile('pair.dat');
    if not(CryptImportKey(RSA, PByte(KeyPair.Memory), KeyPair.Size, 0, 0,
      HPair)) then
      ShowMessage(IntToStr(GetLastError) + ' CryptImportKey');
 
    // Готовим буфер
EDataSize := SizeOf(source);
if not(CryptEncrypt(HPair, 0, true, 0, nil, EDataSize, 0)) then
ShowMessage(IntToStr(GetLastError) + ' CryptEncrypt 1');
result:=source;
SetLength(result,EDataSize);
DDataSize := length(source);
if not(CryptEncrypt(HPair, 0, true, 0, PByte(PChar(result)), DDataSize, EDataSize)) then
      ShowMessage(IntToStr(GetLastError) + ' CryptEncrypt 2');
 
    Result := DecryptedData.DataString;
 
    // Освобождаем занятые ресурсы
    FreeAndNil(DecryptedData);
    FreeAndNil(EncryptedData);
    FreeAndNil(KeyPair);
    CryptDestroyKey(HPair);
    CryptReleaseContext(RSA, 0);
  end;
Но пишет что

RSA: HCRYPTPROV;
HPair: HCRYPTKEY;
Не известные идентификаторы

пытался подключить Chilkat ActiveX, но не получилось

Кто поможет буду благодарен и возможно заплачу некую сумму

_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор

Последний раз редактировалось Вадим Мошев; 16.10.2017 в 15:46.
Valimer вне форума Ответить с цитированием
Старый 22.09.2017, 08:08   #2
PTyTb32
Форумчанин
 
Регистрация: 06.10.2013
Сообщений: 216
По умолчанию

Цитата:
Сообщение от Valimer Посмотреть сообщение
Здравствуйте, столкнулся с проблемой, нужно сделать это:
есть Publickmod и exp=010001
нужно текст шифровать в RSA при помощи данных выше

Помогите кодом, думаю тема уже заезженная, поэтому функции нет, ковылял в гугле и Яндексе, но что-то или плохо искал или ничего не нашёл, буду рад если поможете кодом

Собственно есть функция:
Код:
function EncryptString(source: string): string;
  var
    DecryptedData, EncryptedData, KeyPair: TStringStream;
    RSA: HCRYPTPROV;
    HPair: HCRYPTKEY;
    DDataSize, EDataSize: DWORD;
  begin
    DecryptedData := TStringStream.Create(source);
    EncryptedData := TStringStream.Create;
    KeyPair := TStringStream.Create;
 
    // Инициализаируем CryptoAPI
    if not(CryptAcquireContext(RSA, nil, nil, PROV_RSA_FULL,
      CRYPT_VERIFYCONTEXT)) then
      ShowMessage(IntToStr(GetLastError) + ' CryptAcquireContext');
 
    // Импортируем ключ
    KeyPair.LoadFromFile('pair.dat');
    if not(CryptImportKey(RSA, PByte(KeyPair.Memory), KeyPair.Size, 0, 0,
      HPair)) then
      ShowMessage(IntToStr(GetLastError) + ' CryptImportKey');
 
    // Готовим буфер
EDataSize := SizeOf(source);
if not(CryptEncrypt(HPair, 0, true, 0, nil, EDataSize, 0)) then
ShowMessage(IntToStr(GetLastError) + ' CryptEncrypt 1');
result:=source;
SetLength(result,EDataSize);
DDataSize := length(source);
if not(CryptEncrypt(HPair, 0, true, 0, PByte(PChar(result)), DDataSize, EDataSize)) then
      ShowMessage(IntToStr(GetLastError) + ' CryptEncrypt 2');
 
    Result := DecryptedData.DataString;
 
    // Освобождаем занятые ресурсы
    FreeAndNil(DecryptedData);
    FreeAndNil(EncryptedData);
    FreeAndNil(KeyPair);
    CryptDestroyKey(HPair);
    CryptReleaseContext(RSA, 0);
  end;
Но пишет что

RSA: HCRYPTPROV;
HPair: HCRYPTKEY;
Не известные идентификаторы

пытался подключить Chilkat ActiveX, но не получилось

Кто поможет буду благодарен и возможно заплачу некую сумму
BB - коды юзай!
PTyTb32 вне форума Ответить с цитированием
Старый 22.09.2017, 10:14   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

если я правильно понимаю, то Вы используете Windows CryptoAPI
поэтому, его нужно подключить к программе (в виде модуля).

например, так:
Цитата:
please note to compile the code above you need header files for Crypt API. for example, you may use the wcrypt2.pas unit which is available at ftp://ftp.delphi-jedi.org/api/CryptoAPI2.zip
взято отсюда (кстати, там полезно почитать статьи...)
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование текста С++ CherryBlazer Помощь студентам 1 10.12.2014 08:26
Шифрование текста ДмитрийПО Паскаль, Turbo Pascal, PascalABC.NET 3 25.06.2014 16:53
Шифрование текста Afftar Общие вопросы Delphi 4 15.01.2012 13:30
шифрование текста Lolipo Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 28.10.2010 10:10
шифрование текста Sparky Помощь студентам 2 01.06.2010 18:24