Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Из С на Delphi


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

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

Код

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); 
}


Зарание Сбосибо.

Автор: Anakin 18.7.2011, 11:59
Может есть какойто софт ?
Ну подскажите хоть ктото

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

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

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

Прямо в точку.
Но думаюю что всёже надо искать какойто выход.

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

Автор: Anakin 18.7.2011, 18:12
Цитата(MetalFan @ 18.7.2011,  18:00)
Выхода два:
1. Изучить и переделать самому. Благо при хорошем знании делфи разобраться в синтаксисе Си не проблема (имхо). По переводу задавать конкретные вопросы в случае, если чего не получается.
2. Найти кого-то, кто поможет перевести.
Если по п.2, то надо писать в раздел "http://forum.vingrad.ru/forum/Vingrad-help-center.html", а не здесь. Могу перенести тему в ЦП для ускорения процесса)

Если можно перенеси тему в ЦП что бы я не плодил кучу тем.
Нехочетса захламлять форум кучей бесмосленных копий топиков.
Зарание Спасибо.

Автор: MetalFan 18.7.2011, 18:22
Перенесено в "Центр Помощи".

Автор: flashkpi 19.7.2011, 10:22
icq: 588002847
email: flash_1989@ukr.net
skype: rfhfcerf

Автор: Anakin 20.7.2011, 19:03
Ещё актуально.
Помогите ктото тут пару строк всего ((
Зналбы Си переписал бы 

Автор: Anakin 5.8.2011, 14:04
Нашлась 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



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

Автор: t_gran 25.8.2011, 05:48
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.


Результат выполнения:
http://s1.ipicture.ru/

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)