Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Delphi] Из С на Delphi, Как переделать код с С на Дэлфи 
:(
    Опции темы
Anakin
Дата 17.7.2011, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добрый вечер.
Есть вопрос к знатокам, ну к очень большим знатокам.
Имеетса код на Си как его переделать на Дэлфи.
Этот код представляет сабой метод шифрования и он очень нужен (

КТо может помочь с переводом кода ? или как это сделать ?
Проста я в Си не понимаю ничего (((

Код

unsigned 32 bit integer (dword) 
#if defined(_MSC_VER) && !defined(uint32_t) 
#if (_MSC_VER < 1300) 
typedef unsigned int uint32_t; 
#else 
typedef unsigned __int32 uint32_t; 
#endif 
#else 
#include <stdint.h> 
#endif 

const int hash_skeys[4][2] = { 
{ 213119, 2529077 }, 
{ 213247, 2529089 }, 
{ 213203, 2529589 }, 
{ 213821, 2529997 } 
}; 
const char hex_digit[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 
void encrypt(char *src, char *dst) 
{ 
int i = 0, j = 0; 
char key[0x10]; 
char buff[0x10]; 
char hexbuff[0x21]; 

uint32_t* key_dwords = (uint32_t*)key; 

memset(&key, 0, sizeof(key)); 
memset(&buff, 0, sizeof(buff)); 
memset(&hexbuff, 0, sizeof(hexbuff)); 

strncpy(key, src, sizeof(key)); 
strncpy(buff, src, sizeof(buff)); 

for(i = 0; i < 4; i++) 
key_dwords[i] = key_dwords[i] * hash_skeys[i][0] + hash_skeys[i][1]; 

buff[0] = buff[0] ^ key[0]; 
for(i = 1; i < 0x10; i++) 
buff[i] = buff[i] ^ buff[i-1] ^ key[i]; 

for(i = 0; i < 0x10; i++) { 
j = buff[i] != 0 ? buff[i] : 102; 
hexbuff[i*2] = hex_digit[j >> 4 & 0x0f]; 
hexbuff[i*2 + 1] = hex_digit[j & 0x0f]; 
} 

//hexbuff[0x20] = 0; 
sprintf(dst, "0x%s", hexbuff); 
}


Зарание Сбосибо.
PM MAIL   Вверх
Anakin
Дата 18.7.2011, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Может есть какойто софт ?
Ну подскажите хоть ктото
PM MAIL   Вверх
MetalFan
Дата 18.7.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



СОФТ? шутишь)
Берешь в руки мануал по си и переводишь. В чем проблема то?)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Keeper89
Дата 18.7.2011, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В том, что в Си автор не разбирается smile 


--------------------
PM MAIL WWW   Вверх
Anakin
Дата 18.7.2011, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Keeper89 @ 18.7.2011,  13:12)
В том, что в Си автор не разбирается smile

Прямо в точку.
Но думаюю что всёже надо искать какойто выход.
PM MAIL   Вверх
MetalFan
Дата 18.7.2011, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Выхода два:
1. Изучить и переделать самому. Благо при хорошем знании делфи разобраться в синтаксисе Си не проблема (имхо). По переводу задавать конкретные вопросы в случае, если чего не получается.
2. Найти кого-то, кто поможет перевести.
Если по п.2, то надо писать в раздел "Центр помощи", а не здесь. Могу перенести тему в ЦП для ускорения процесса)


Это сообщение отредактировал(а) MetalFan - 18.7.2011, 18:01


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Anakin
Дата 18.7.2011, 18:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(MetalFan @ 18.7.2011,  18:00)
Выхода два:
1. Изучить и переделать самому. Благо при хорошем знании делфи разобраться в синтаксисе Си не проблема (имхо). По переводу задавать конкретные вопросы в случае, если чего не получается.
2. Найти кого-то, кто поможет перевести.
Если по п.2, то надо писать в раздел "Центр помощи", а не здесь. Могу перенести тему в ЦП для ускорения процесса)

Если можно перенеси тему в ЦП что бы я не плодил кучу тем.
Нехочетса захламлять форум кучей бесмосленных копий топиков.
Зарание Спасибо.
PM MAIL   Вверх
MetalFan
Дата 18.7.2011, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Перенесено в "Центр Помощи".

Это сообщение отредактировал(а) MetalFan - 18.7.2011, 18:23


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
flashkpi
Дата 19.7.2011, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



icq: 588002847
email: [email protected]
skype: rfhfcerf
PM MAIL   Вверх
Anakin
Дата 20.7.2011, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ещё актуально.
Помогите ктото тут пару строк всего ((
Зналбы Си переписал бы 
PM MAIL   Вверх
Anakin
Дата 5.8.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Нашлась Dll и исходники данной функции на Си 
НО вот шас незадача, как мне использовать функции этой длл в Делфи, читал мануалы пробовал кучу вареантов но ничего не вышло.
Подскажите как мне использовать функции этой длл у себя для шифрования пароля.

прикладываю исходники и саму длл.
Код

#include "L2Svc.h"

BOOL APIENTRY DllMain(HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
{
    switch(ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
            break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

const int hash_skeys[4][2] = { 
    { 213119, 2529077 }, 
    { 213247, 2529089 }, 
    { 213203, 2529589 }, 
    { 213821, 2529997 } 
}; 

const char hex_digit[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 

void EncryptPass(char *src, char *dst) 
{ 
    int i = 0, j = 0; 
    char key[0x10]; 
    char buff[0x10]; 
    char hexbuff[0x21]; 
    unsigned int* key_dwords = (unsigned int*)key; 

    memset(&key, 0, sizeof(key)); 
    memset(&buff, 0, sizeof(buff)); 
    memset(&hexbuff, 0, sizeof(hexbuff)); 

    strncpy(key, src, sizeof(key)); 
    strncpy(buff, src, sizeof(buff)); 

    for(i = 0; i < 4; i++)  
        key_dwords[i] = key_dwords[i] * hash_skeys[i][0] + hash_skeys[i][1]; 

    buff[0] = buff[0] ^ key[0]; 
    for(i = 1; i < 0x10; i++)  
        buff[i] = buff[i] ^ buff[i-1] ^ key[i]; 
     
    for(i = 0; i < 0x10; i++) { 
        j = buff[i] != 0 ? buff[i] : 102; 
        hexbuff[i*2] = hex_digit[j >> 4 & 0x0f]; 
        hexbuff[i*2 + 1] = hex_digit[j & 0x0f]; 
    } 

    //hexbuff[0x20] = 0; 
    sprintf(dst, "0x%s", hexbuff); 
}

char* EncryptPass(char *src)
{
    char* pBuff = new char[0x20];
    EncryptPass(src, pBuff);
    return pBuff;
}

//?EncryptPass@@YAXPAD0@Z void
//?EncryptPass@@YAPADPAD@Z returned char



PM MAIL   Вверх
Anakin
Дата 24.8.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Ребята помогите с этой функцией.
Я заплачу 400 рублей если кто сможет переделать эту функцию с С++ на Делфи


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  L2Svc.rar 28,50 Kb
PM MAIL   Вверх
t_gran
Дата 25.8.2011, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Anakin, в общем вот что у меня получилось. Ниже код на C++ (Ваш) и портированный на fpc (режим совместимости с delphi включён, так что проблем не должно быть)
crypt.cpp
Код

#include <stdio.h>
#include <string.h>

const int hash_skeys[4][2] =
{
   {213119, 2529077},
   {213247, 2529089},
   {213203, 2529589},
   {213821, 2529997}
};

const char hex_digit[] = {'0', '1', '2', '3', '4', '5', '6', '7',
                          '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

void EncryptPass(char* src, char* dst)
{
   int i = 0, j = 0;
   char key[0x10];
   char buff[0x10];
   char hexbuff[0x21];
   unsigned int* key_dwords = (unsigned int*)key;
   memset(&key, 0, sizeof(key));
   memset(&buff, 0, sizeof(buff));
   memset(&hexbuff, 0, sizeof(hexbuff));
   strncpy(key, src, sizeof(key));
   strncpy(buff, src, sizeof(buff));

   for (i = 0; i < 4; i++)
   {
      key_dwords[i] = key_dwords[i] * hash_skeys[i][0] + hash_skeys[i][1];
   }
   
   buff[0] = buff[0] ^ key[0];
   for (i = 1; i < 0x10; i++)
   {
      buff[i] = buff[i] ^ buff[i - 1] ^ key[i];
   }

   for (i = 0; i < 0x10; i++)
   {
      j = buff[i] != 0 ? buff[i] : 102;
      hexbuff[i * 2] = hex_digit[j >> 4 & 0x0f];
      hexbuff[i * 2 + 1] = hex_digit[j & 0x0f];
   }
   hexbuff[0x20] = 0;
   sprintf(dst, "0x%s", hexbuff);
}

int main(int argc, char** argv)
{
   if (argc != 2)
   {
      printf("Usage: PROGRAM STRING\n");
      return 0;
   }

   char result[0x21];

   EncryptPass(argv[1], result);

   printf("%s", result);

   return 0;
}


crypt.pas
Код

{$mode Delphi}

procedure EncryptPass(src: string; var dst: string);
const
   hash_skeys: array [0..3, 0..1] of longint = ((213119, 2529077),
                                                (213247, 2529089),
                                                (213203, 2529589),
                                                (213821, 2529997));

   hex_digit: array [0..15] of char = ('0', '1', '2', '3', '4', '5', '6', '7',
                                       '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');

type
   arr = array [0..0] of longword;
   parr = ^arr;
   
var
   i, j, g: byte;
   key, buff: array [0..15] of byte;
   hexbuff: array [0..32] of char;
   key_dwords: parr;
begin

   for i := 0 to 15 do
   begin
      if (i < length(src)) then
         g := byte(src[i+1])
      else
         g := 0;
      key[i] := g;
      buff[i] := g;
   end;

   key_dwords := parr(@key);

   for i := 0 to 3 do
   begin
      key_dwords^[i] := key_dwords^[i] * hash_skeys[i][0] + hash_skeys[i][1];
   end;
   
   buff[0] := buff[0] xor key[0];
   for i := 1 to 15 do
   begin
      buff[i] := buff[i] xor buff[i - 1] xor key[i];
   end;

   for i := 0 to 15 do
   begin
      if (buff[i] = 0) then
         j := 102
      else
         j := buff[i];
      
      hexbuff[2*i] := hex_digit[j shr 4 and 15];
      hexbuff[2*i + 1] := hex_digit[j and 15];
   end;
   
   dst := '0x';
   for i := 0 to 31 do
   begin
      dst := dst + hexbuff[i];
   end;
end;

var
   result: string;
begin
   if (length(paramstr(1)) = 0) then
   begin
      writeln('Usage: PROGRAM STRING');
      exit;
   end;

   EncryptPass(paramstr(1), result);
   
   writeln(result);
end.


Результат выполнения:
user posted image

Исходники с бинарниками ниже:

Это сообщение отредактировал(а) t_gran - 25.8.2011, 05:53

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  crypt.7z 22,04 Kb


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

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


 




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


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

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