Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> проблемма с CryptoAPI CryptEncrypt, Шифрование файлов на разныых версиях Win 
:(
    Опции темы
egorowp
Дата 12.11.2010, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть код шифрования и расшифровки файлов написанный с использованием CpyptoAPI
Код

function DecryptFiless(plaintext, ciphertext, Password: String):boolean;
var
  hprov: hcryptprov;
  hash: hcrypthash;
  key: hcryptkey;
  infile, outfile: file;
  data: pbyte;
  l: dword;
begin
  CryptAcquireContext(@hprov, nil, nil, prov_rsa_full, crypt_verifycontext);
  CryptCreateHash(hprov, calg_sha, 0, 0, @hash);
  CryptHashData(hash, @password[1], length(password), 0);
  CryptDeriveKey(hprov, calg_rc4, hash, 0, @key);
  CryptDestroyHash(hash);
  AssignFile(infile, plaintext);
  AssignFile(outfile, ciphertext);
  Reset(infile, 1);
  Rewrite(outfile, 1);
  GetMem(data, 512);
  while not Eof(infile) do begin
    BlockRead(infile, data^, 512, l);
    CryptDecrypt(key, 0, eof(infile), 0, data, @l);
    //ShowMessage(IntToStr(GetLastError));
    BlockWrite(outfile, data^, l);
  end;
  FreeMem(data, 512);
  CloseFile(infile);
  CloseFile(outfile);
  CryptReleaseContext(hprov, 0);
  result := true;
end;

function EncryptFiless(plaintext, ciphertext, Password: String):boolean;
var
  hprov: hcryptprov;
  hash: hcrypthash;
  key: hcryptkey;
  infile, outfile: file;
  data: pbyte;
  l: dword;
begin
  CryptAcquireContext(@hprov, nil, nil, prov_rsa_full, crypt_verifycontext);
  CryptCreateHash(hprov, calg_sha, 0, 0, @hash);
  CryptHashData(hash, @password[1], length(password), 0);
  CryptDeriveKey(hprov, calg_rc4, hash, 0, @key);
  CryptDestroyHash(hash);
  AssignFile(infile, plaintext);
  AssignFile(outfile, ciphertext);
  Reset(infile, 1);
  Rewrite(outfile, 1);
  GetMem(data, 512);
  while not Eof(infile) do begin
    BlockRead(infile, data^, 512, l);
    CryptEncrypt(key, 0, eof(infile), 0, data, @l, l);
    //ShowMessage(IntToStr(GetLastError));
    BlockWrite(outfile, data^, l);
  end;
  FreeMem(data, 512);
  CloseFile(infile);
  CloseFile(outfile);
  CryptReleaseContext(hprov, 0);
  result := true
end;


Возникает следующий казус если шифровать в Win 2000 можно расшифровать только в Win 2000. Если шифрование происходит в XP и выше,  расшифровать можно в XP и выше (XP. Vista, 7. 2008, 2003)

код написан в BDS 2006 Architect
 smile 
PM MAIL   Вверх
Snowy
Дата 12.11.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Есть такая беда.
Дело не в коде, а в CriptoAPI.
Смени алгоритм шифрования - некоторые алгоритмы изменились, некоторые нет.

Добавлено через 5 минут и 18 секунд
Или попробуй явно указать криптопровайдера в CryptAcquireContext.
PM MAIL   Вверх
egorowp
Дата 12.11.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот блин  smile 

Я весь msdn перерыл ничего не нашел на эту тему. скиньте кто-нибудь ссылку. надо начальству обосновать необходимость конвертации большущей кучи файлов.

буду несказанно благодарен.
PM MAIL   Вверх
CodeMonkey
Дата 13.11.2010, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Так ведь это...  вы ж провайдера не указываете - т.е. выбирается провайдер по-умолчанию. В каждой системе он разный.

Вы выберите себе подходящий и используйте его.

Несовместимость идёт по той причине, что длину ключей и формат контейнера определяет провайдер. У разных провайдеров они разные.

Добавлено @ 12:36
Это кстати, в описании CryptDeriveKey указано:

Цитата
The sizes of a session key can be set when the key is generated. The key size, representing the length of the key modulus in bits, is set with the upper 16 bits of this parameter. Thus, if a 128-bit RC4 session key is to be generated, the value 0x00800000 is combined with any other dwFlags predefined value with a bitwise-OR operation. Due to changing export control restrictions, the default CSP and default key length may change between operating system releases. It is important that both the encryption and decryption use the same CSP and that the key length be explicitly set using the dwFlags parameter to ensure interoperability on different operating system platforms.


Это сообщение отредактировал(а) CodeMonkey - 13.11.2010, 12:37


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Snowy
Дата 13.11.2010, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(Snowy @  12.11.2010,  16:10 Найти цитируемый пост)
Или попробуй явно указать криптопровайдера в CryptAcquireContext.

Код
CryptAcquireContext(@hprov, 'Some', 'Microsoft Strong Cryptographic Provider', prov_rsa_full, crypt_verifycontext);


Добавлено через 58 секунд
'Microsoft Strong Cryptographic Provider' - Этот криптопровайдер дефолтовый для XP и выше
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




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


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

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