Перенести код с PHP

Доброго дня . Ребята может кто подскажет как перенести код или хотя бы комментарии к нему. Что я только не пробовал - но результата получить не могу , - должно на выходе быть что то вроде A/jdQ4oqG7M7rJ9qFnA9PYkaZKPd1UMwofDwdHQJvl0=
function createKey() {
    $data = round(microtime(true) * 1000);
    return urlencode(base64_encode(encryptData($data)));
}
 
function encryptData($data) {
    static $aes;
    include_once('aeslib.php');
    if (!$aes) {
        $iv = "1234567890123456";
        $secretKey = base64_decode("GfonMnEUuTqTjtdHXaFQ8A==");
        $aes = new Crypt_Rijndael($secretKey, $iv);
    }
    return $aes->encrypt($data);
}
14 ответов

include_once('aeslib.php');
Это крипто библиотека, откуда берется метод поблочного шифрования AES....я вот не знаю как он используется в Си, если найдете, остальное все просто.Но скажу так,если он вам не критичен, можно оставить просто base64_decode,в итоге все равно будет:
должно на выходе быть что то вроде A/jdQ4oqG7M7rJ9qFnA9PYkaZKPd1UMwofDwdHQJvl0=


Dinkin, да библиотека есть но я даже пока о переносе особо не задумываюсь , хочу в ручную получить ( с помощью онлайн сервисов с base64_encode/decode и Crypt Rijndael) что то вроде A/jdQ4oqG7M7rJ9qFnA9PYkaZKPd1UMwofDwdHQJvl0= но пока не выходит...этот код уникальный ключ для доступа к сайту на одно действие .... т.е он каждый раз разный и не дублируется а на сервере наверно обратная проверка идёт... и открывает доступ


Ddv122, А ну тогда определяетесь что вам в итоге нужно =)


Dinkin, в итоге конечно нужно тоже самое проделывать на с++, но пока хочу хотя бы сформировать код любыми другими средствами ) но пока не как не выходит..


Что то смахивает на пробу как о то взлома) Все переводить чет лень (хоть тут и немного), дам комменты. * Кидаете на форму,два основных компонента TIdDecoderMIME и IdEncoderMIME, это ваши base64_encode и base64_decode. Использовать их так:
 Edit1->Text = IdEncoderMIME1->EncodeString("Строку будем кодировать");
 Edit1->Text = IdDecoderMIME1->DecodeString("Строку будем раскодировать");
По ЭТОЙ ССЫЛКЕ вроде лежит ваша крипто библиотека для Си, подключаете ее.И собственно сам код с коментами
function createKey() { * * $data = round(microtime(true) * 1000); * * return urlencode(base64_encode(encryptData($data))); }
Функция получает текущее время вплоть до микросекунд, умножается на 1000 , округляется до целого числа $data как int тут. Дадее кодируется через IdEncoderMIME1 и в полученом результате все символы что что не вошли в алфавит ансистринг или числа заменяются на символ процента (я обычно собственную функцию использую, есть код тока на делфи, но неб труда измените)
function TForm1.URLEncode(const Url: Utf8String): string;
var
  I: Integer;
begin
  Result := '';
  for I := 1 to Length(Url) do
  begin
    if CharInSet(Url[I], ['A'..'Z', 'a'..'z', '0'..'9', '-', '=', '&', ':', '/', '?', ';', '_']) then
      Result := Result + Utf8ToAnsi(Url[I])
    else
      Result := Result + '%' + IntToHex(Ord(Url[I]), 2);
  end;
end;
 
end.
function encryptData($data) { * * static $aes; * * include_once('aeslib.php'); * * if (!$aes) { * * * * $iv = "1234567890123456"; * * * * $secretKey = base64_decode("GfonMnEUuTqTjtdHXaFQ8A=="); * * * * $aes = new Crypt_Rijndael($secretKey, $iv); * * } * * return $aes->encrypt($data); }
Тут вы создаете секретную строку через подключенную библиотеку и по ней кодируете значение из первой


Dinkin, я примерно так и делал , но вот беда в том что строка получается в раза 3 дленее
zzhcjbxOp2DBJ7XUZRo3fwItP3NhPW02g85hJjVtVOcLgmeLdtKmlr816AXy/X6iHonD6QuUzbThnv6yoH/iCX9y2OluN11xQ2KGfhjyCUVoHHdgjUeJNWJlURlUA3hJxKRdOFg4aJhxVoL6/M6jgrY7S34jmASmGhsXza04fSs=
я не когда не сталкивался с шифрованием , или я что то не так делаю или всё проще. ..


чет не нашел у вас в коде где вычисляется base64, там видимо оно как то вручную делается


Dinkin, да base64 и микротайм в ручную делал - но вот всё равно что то не то ... microtime - 1485108769622 а base64 online попробовал - но результат в 4 раза больше


Ddv122, хех, а где гарантия что вы вычисляете верно...используйте готовый компонент, там то уже все проверено. Я сам сверял сходность значений PHP и BCB для алгоритма base64...все отлично сходилось. PS на BCB6 у иди base64, проблема он не вычислял большие значения.


Скорее всего я не правильно понимаю работу алгоритма по aes 1) в переменную data ,- Получаю time в микросекундах - 1485108769622 2) в переменную secretKey с помощью base64 расшифровываю текст("GfonMnEUuTqTjtdHXaFQ8A=="); 3) вот тут не увязка по aes ( у нас как бы 3 параметра - data, iv , secretkey) а в алгоритме должно быть два (ключ , текст и размер ключа) 4) шифрую в base64 полученное число в переменной дата может кто то сможет подсказать по 3ему пункту? это не для взлома , это для просмотра видео с сайта уникальный ключ для сессии передаётся в post запросе.


3) вот тут не увязка по aes ( у нас как бы 3 параметра - data, iv , secretkey) а в алгоритме должно быть два (ключ , текст и размер ключа)
Не, Я может слегка с бадуна, но дело понял так: secretkey - секретная строка iv - это код блоков в массиве по котрому будет шифроваться data - что шифруем


Dinkin, да iv это вектор , спасибо за наводку. но вот секрет кей декодировать с base64 - нормально не получается . кракозябры одни...


но вот секрет кей декодировать с base64 - нормально не получается
Но вы же не рассчитываете что это будет читаемая строка, это вполне может быть случайно сгенерированый набор. символов


Dinkin, это я понимаю , - но получается что то не понятное. Но спасибо за помощь , - установил денвер - проверил на php . - вывел результат через echo - буду пробовать , выводить каждую переменную и попробую тоже сделать на с++. пока что то у меня есть сомнения на счет правильности работы кода на php . . Но спасибо огромное за помощь...Если что выйдет , - поделюсь