Конференция "Начинающим" » криптование advapi32
 
  • stanzdor (03.04.18 16:45) [0]
    когда-то давно криптовал данные :

    uses wcrypt2;

    function CryptBuff(Buff: Pointer; lenBuff: Integer; const Password: AnsiString; ToCrypt: Boolean): Integer;
    var
     hProv: HCRYPTPROV;
     hash: HCRYPTHASH;
     key: HCRYPTKEY;
     len: 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);
     len:= lenBuff;
     if ToCrypt then CryptEncrypt(key, 0, true, 0, Buff, @len, len)
                else CryptDecrypt(key, 0, true, 0, Buff, @len);
     result:= len;
     CryptReleaseContext(hProv, 0);
    end;



    насколько понимаю подготавливается хеш SHA, далее накладывается пароль и затем по алгоритму RC4 кодируется блок.
    встала необходимость написать небольшое мобильное приложение на FM под андроид, которое должно уметь расшифровывать такие данные. найденные на просторах исходники реализующие RC4 не дали результата. вероятно с подготовкой хеша что-то не то или самим алгоритмом.
    может кто подскажет решение?
  • stanzdor (03.04.18 16:55) [1]
    была идея идти пошагово и сравнивать, тоесть после CryptCreateHash(hProv, CALG_SHA, 0, 0, @hash);
    копировать кусок памяти по адресу что в hash и затем добиться что бы и моя инициализация хеша была такой же, ну и далее смотреть key, что там будет после применения пароля.
    но что-то не вышло. почему-то там разные данные. вероятно какая-то структура и нужно глубоко разбираться.
    в System.Hash есть THashSHA. может быть его средствами создавать хеш с паролем.
    сам RC4 вроде бы пока под патентом. его реализацию уже самому делать используя полученных хеш.
  • kilkennycat © (03.04.18 18:16) [2]
    закодировать в мобильном. раскодировать в настольном. глянуть исключение.
  • stanzdor (03.04.18 18:28) [3]
    - в данном алгоритме исключения не будет. будут просто на выходе кривые данные
    - а как кодировать в мобильном? не могу найти реализацию sha хеша и самого RC4

    мобильный\настольный - мне нужно просто написать свой код, реализующий декодирование таких данных.
    может есть какие свободные библиотеки?
    смотрел TMSCrypto, там нет RC4
  • snake © (03.04.18 20:32) [4]
    зато в винде есть не только rc4
  • snake © (03.04.18 20:35) [5]
    и таки да.
    с CRYPT_VERIFYCONTEXT ты не получишь ключа умеющего в CryptEncrypt.

    он годится только для проверки или для того же CryptCreateHash которому приват не нужен
  • stanzdor (03.04.18 21:19) [6]
    snake ©, может вы неправильно меня поняли.
    то что есть в винде не только rc4 я понимаю.
    насчет CRYPT_VERIFYCONTEXT не совсем понял.
    у меня на руках большой кусок кодированных вышеуказанной функцией данных.
    мне нужен свой код, декодирующий эти данные.
    код нужен для использования в кроссплатформенном FM проекте (для мелкого андроид приложения где криптоапи винды ессно нет)
  • stanzdor (03.04.18 21:25) [7]
    However, if the CRYPT_VERIFYCONTEXT flag is specified, access to the private keys is not required and the user interface can be bypassed.
  • snake © (03.04.18 22:02) [8]
    то что есть в винде не только rc4 я понимаю.

    ну если понимаешь, то шифруй на винде тем, что есть в твоем ведроиде. логично?

    про CRYPT_VERIFYCONTEXT не надо сюда копипастить непонятные тебе слова.

    при указании этого флага у тебя никогда не будет контекста ключа пригодного для шифрования и других операций которым нужен приват.
  • snake © (03.04.18 22:05) [9]
    а флаг этот нужен потому что

    CryptCreateHash(hProv, CALG_SHA, 0, 0, @hash);

    то есть формально нужен контекст провайдера, хотя ключа хешу не надо.
    если запросить нормальный контекст без верифай, то может потребоваться доступ к контейнеру который сейчас не вставлен или на нем пароль.
    а нам всего лишь надо было хеш посчитать, да.
  • stanzdor (03.04.18 23:01) [10]
    snake ©, первым делом я подумал про декодирование и перекодировку данных каким другим макаром. но объем в пару террабайт. плюс ещё основной софт тогда нужно переписывать.
    думал быстрее найду исходник создания sha хеш пароля и алгоритм декодирования RC4.
    доступ к контейнеру мне не нужен. c CRYPT_VERIFYCONTEXT нормально всё криптует.
  • stanzdor (03.04.18 23:14) [11]
    о, надо DCPcrypt покопать!
    я что-то думал там через апи, а там всё своё..
  • snake © (04.04.18 00:15) [12]
    c CRYPT_VERIFYCONTEXT нормально всё криптует.

    да как скажешь.
    не уговаривать же тебя
  • Eraser © (04.04.18 22:07) [13]

    > stanzdor   (03.04.18 16:45) 

    я бы рекомендовал openssl, вход туда относительно сложный, зато потом проблем с переносом на другие платформы не будет.
 
Конференция "Начинающим" » криптование advapi32
Есть новые Нет новых   [134427   +34][b:0][p:0.001]