PDA

Просмотр полной версии : подскажите чуток


Кислый
13.10.2010, 11:15
подскажите:

имеем обьявленный массив k:array [0..127] of byte;
в чем разница между k[$13] и k[13] ?

J-Fobos
13.10.2010, 13:44
k[13] это 13-й элемент массива
k[$13] это 19-й элемент массива
Почему так? Десятичная система счисления и 1Шестнадцатеричная система счисления :)

Кислый
13.10.2010, 19:52
тоесть между:

for i:=0 to $13-1 do begin
k[$13 + i] := k[$13 + i] xor k;
end;


и:

for i:=0 to 18 do begin
k[19 + i] := k[19 + i] xor k[i];
end;

нет никакой разниы ?! но ведь так написали не просто так, а с какой-то целью..

[I]Добавлено через 19 минут
неужели лишь только ради прозрачности кода ?

J-Fobos
13.10.2010, 21:17
Просто при работе с типом byte удобнее (для программиста) использовать шестнадцатеричную систему счисления, но использовать или нет уже по личному выбору. :)

mikser
14.10.2010, 00:09
мне не удобно юзать хекс коды видимо хреновый из меня прогер :(

dyh9l
14.10.2010, 00:45
хех, а я вобще в кодировании нечего не понимаю почти) мучаю Breadfan'a чтоб научил меня немножко)

Кислый
27.10.2010, 10:15
вопрос из той же оперы:

например есть функции IntToHex, IntToStr тут все понятно. но блин.. какой цели может служить самописный HexToStr ? Перевод строки в строку ? из Hex в Str ?

xkor
27.10.2010, 23:40
из Hex в Str ?да

Кислый
28.10.2010, 10:01
Т.Е. функция восстанавливающая ansii строку из стоки в 16ом виде ?

xkor
28.10.2010, 10:35
Кислый, да, как и глосит её название...

Кислый
30.10.2010, 23:20
function RSAEncrypt(a,p,rsakey:string):string;
var
zSt: string;
sD,sR,sM:string;
m,e,d,r:TFGInt;
begin
//это то что добавил без этого никак
SetLength(zSt, 98);
FillChar(zSt[1], Length(zSt), 0);
zSt[95]:= #$20;
if length(a)>14 then setlength(a,14);
while length(a)<14 do a:=a+#0;
if length(p)>16 then setlength(p,16);
while length(p)<16 do p:=p+#0;
sD:=zSt+a+p+#0#0#0#0;// ну и сюда вначале добавляю свою строку
sM:=rsakey;
Base10StringToFGInt('65537',e);
Base256StringToFGInt(sD,d);
Base256StringToFGInt(sM,m);
FGIntMontgomeryModExp(d,e,m,r);
FGIntToBase256String(r,sR);
result:=sR;
end;


помогите реализовать на сях.

у самого получается только #include <cstring>
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
cout << "RSA_Encrypt" << endl;

char zSt[98];
char sD, sR, sM;
//? m, e, d, r;
char a_[14];
//out var
char a[] = "0123456789ABCDEF";//89ABCDEF";
char p[] = "0123456789ABCDEF0.123456789";

char rsakey;
//begin
int i_ =0;
while (i_<sizeof(zSt))
{ zSt[i_]=0 ; i_++; cout << i_-1<< " " << (int)zSt[i_-1] << endl;};

zSt[95] = 0x20;
cout << (int)zSt[95] << " " << (float)zSt[95] << endl;

if (strlen(a)>14)
{ char a_[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int i; for (i=0;i<15;++i){cin>>a_[i];cout<<i<<" "<<a_[i]<<endl;};
strncpy( a_, a, 14);
cout <<"a = " << a_ << " " << a << endl;
};
while(strlen(a)<14)
{
strcat(a, "0");
};

if (strlen(p)>16)
{ char p_[16];
strncpy( p_, p, 16);
cout <<"p =" << p_ << " " << p << endl;
};
while(strlen(p)<16)
{
strcat(p, "0");
cout << "while " << p << endl;
};

// ?? strcat(, "0");

return 0;
}


как видите никак ((

xkor
31.10.2010, 00:07
Кислый, для начала тебе нужен модуль для работы с огромными числами для си, а что ты тут за бред написал я хз...

Кислый
31.10.2010, 01:44
ну допустим gmp..

Добавлено через 1 час 12 минут
в принципе по ветке http://coderx.ru/archive/index.php/t-2712.html понятно, но хотелось бы увидеть так сказать код "один-в-один".

xkor
31.10.2010, 15:38
Кислый, хотеть не вредно, напиши и увидишь)

Кислый
31.10.2010, 18:55
ну на вопрос то ответите ? есть предположение о назначении

function RSAEncrypt(a,p,rsakey:string):string;
var
zSt: string;
sD,sR,sM:string;
m,e,d,r:TFGInt;
begin
//это то что добавил без этого никак
SetLength(zSt, 98);
FillChar(zSt[1], Length(zSt), 0);
zSt[95]:= #$20;
if length(a)>14 then setlength(a,14);
while length(a)<14 do a:=a+#0;
if length(p)>16 then setlength(p,16);
while length(p)<16 do p:=p+#0;
sD:=zSt+a+p+#0#0#0#0;// ну и сюда вначале добавляю свою строку
sM:=rsakey;

просто я непонимаю что предыдущий автор кода хотел этим всем сказать ((

/т.е. вначале мы задаем длинну строки, с первого символа заполняем нулями (или нулевыми анси), задаем 95й элемент строки(как массива) как $20. Далее проверяем длинну а и p, и соответсвенно убираем лишнее или дописываем нули.. только я не пойму нафиг все это ?

xkor
31.10.2010, 22:11
только я не пойму нафиг все это ?я тоже не пойму нафига эти нули ибо 000002000 = 2000, и следовательно вполне достаточно делать так:
function RSAEncrypt(a,p,rsakey:string):string;
var
sD,sR,sM:string;
m,e,d,r:TFGInt;
begin
if length(a)>14 then setlength(a,14);
while length(a)<14 do a:=a+#0;
if length(p)>16 then setlength(p,16);
while length(p)<16 do p:=p+#0;
sD:=#$20#0#0+a+p+#0#0#0#0;
sM:=rsakey;
Base10StringToFGInt('65537',e);
Base256StringToFGInt(sD,d);
Base256StringToFGInt(sM,m);
FGIntMontgomeryModExp(d,e,m,r);
FGIntToBase256String(r,sR);
result:=sR;
end;

Добавлено через 6 минут
a и p мы приводим к правильной длине затем что так положено, ибо зашифровать нам надо 37хбайтное число где первый байт это $20, байты с 4го по 17й - логин, с 18го по 33й - пароль, остальные нули)

Кислый
01.11.2010, 01:30
что-то я запутался. прошу рассказать что есть а и p.

xkor
01.11.2010, 01:53
Кислый, логин и пароль)

unknowned
01.11.2010, 02:38
помогите реализовать на сях.


Кислый, а зачем тебе си ?

Кислый
01.11.2010, 14:39
хочется мне. вообще все затевалось для последующей реализации этих алгоритмов на микроконтроллерах(а там используется С ). потом затянуло и появилось желание сделать что-то большое и красивое )))

unknowned
01.11.2010, 23:32
хочется мне. вообще все затевалось для последующей реализации этих алгоритмов на микроконтроллерах(а там используется С ). потом затянуло и появилось желание сделать что-то большое и красивое )))

бот на микроконтроллере ? делай на http://www.arduino.ru/ :D

Кислый
02.11.2010, 09:39
ололо. но на самом деле все возможно если очень захотеть ))

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

Yegor
03.11.2010, 15:39
Кислый, а чего написать ингейм бота работающего на микроконтроллере вполне реально тем более если использовать ARM, вот только зачем?

xkor
03.11.2010, 18:08
Yegor, мм,учитывая что ингейм должен работать в клиенте а клиент на ARM не работает очень интересно в чем же реальность написания такого бота)

Yegor
03.11.2010, 18:41
xkor, я имел ввиду аутгейм для фришек

Кислый
03.11.2010, 21:34
нуу.. если представить.. вы уехали в отпуск\на дачу\в лес. оставлять комп включенным - не хочется. да и с точки зрения пажарной безопасности оставлять нельзя без присмотра, или сигнализации.

А теперь представьте устройство - энергонезависимый аппаратный бот, подключенный к сети, и питающийся от неё же.
Вы отдыхаете а он работает.. работает.. и РАБОТАЕТ !! ENERGIZER!!!!!!! :)

так можно поставить бота торговать, и не париться совсем ))

Yegor
04.11.2010, 13:59
Кислый, да это беспорно очень круто. Настоящему задроту без этого никак. Только вот под сервера Л2 где можно заработать реальные деньги обычно ООГ бот не работает из за мудренных систем шифрации.

Кислый
04.11.2010, 15:13
троллить не хорошо.. тем более что я не собирался делать бота на микроконтроллере
вообще все затевалось для последующей реализации этих алгоритмов на микроконтроллерах(а там используется С )
это означает использование RSA, BlowFish, XOR..

Yegor
04.11.2010, 15:47
Кислый, если не серкет а зачем тебе эти алгоритмы шифрования на микроконтроллере?

Кислый
04.11.2010, 16:25
секрет. коммерческий проэкт )) чтобы сразу не поломали и не скопировали

Yegor
04.11.2010, 17:22
Кислый, сразу начинают лезть в голову всякие сигнализации и охранные срадства

xkor
04.11.2010, 18:02
Yegor, сигнализации для чаров в линейке?)))

Yegor
04.11.2010, 19:27
xkor, ага от угона :yahoo:

xkor
05.11.2010, 03:42
Yegor, так и вижу заголовки газет - "Вчера благодаря новой сигнализации бала обезврежена банда промышлявшая угоном чаров на серверах l2.ru"

Кислый
07.11.2010, 23:55
поехали дальше.

есть
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>

using namespace std;

//function IntToHex ( DecimalValue : Integer; MinimumWidth : Integer ) : string;
char* IntToHex(int DecimalValue, int MinimumWidth)//, char b[])
{
static char b[256];
sprintf(b, "%lX", DecimalValue);
int len = strlen(b);
int i = len;
int l = MinimumWidth-len;
while(i>=0)
{
b[i+l]=b[i];
i--;
}
while((i+l)>=0)
{
b[i+l] = '0';
i--;
}
return b;
} и #include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>

using namespace std;

//function IntToHex ( DecimalValue : Integer; MinimumWidth : Integer ) : string;
char* IntToHex(char* b[], int DecimalValue, int MinimumWidth)//, char b[])
{
sprintf(b, "%lX", DecimalValue);
int len = strlen(b);
int i = len;
int l = MinimumWidth-len;
while(i>=0)
{
b[i+l]=b[i];
i--;
}
while((i+l)>=0)
{
b[i+l] = '0';
i--;
}
return b;
}

нужно заставить работать эту функцию без внешнего буффера, т.к. иначе не получается использовать конструкцию типа
printf(" %s %s",IntToHex(125,4),IntToHex(170,8));
проблема в том что всегда возвращается результат первого вызова функции.
прошу не советовать использовать std::string.

xkor
08.11.2010, 16:32
char* IntToHex(int DecimalValue, int MinimumWidth)
{
char *ahex = "0123456789ABCDEF";
char *r = new char[9];
int p = 0;
UINT8 b;
bool show = false;

for(int i = 28; i >= 0; i -= 4){
b = (DecimalValue >> i) & 0xF;
show = show || (b > 0) || (MinimumWidth > i / 4) || (i == 0);
if(show) r[p++] = ahex[b];
}
r[p] = 0;
return r;
}

Кислый
08.11.2010, 17:37
xkor, вы суровый и немногословный человек ))

xkor
08.11.2010, 21:45
Кислый, эт вместо спасибо?)
чего там говорить то, код простой, хотя наверно в одном месте можно немного оптимизнуть избавившись от деления, сделав инкремент на единицу а не четвёрку и вместо умножения добавить сдвиг влево)

Кислый
10.11.2010, 00:45
бубны

Кислый
11.11.2010, 10:37
как перенести тип данных bytе в си ? на ум приходит только unsigned char. Но т.к. я программирую в linux, то юникод это юникод.. и я в замешательстве.

unknowned
11.11.2010, 13:22
как перенести тип данных bytе в си ? на ум приходит только unsigned char. Но т.к. я программирую в linux, то юникод это юникод.. и я в замешательстве.

BYTE

xkor
11.11.2010, 18:25
Кислый, а причем тут юникод??

Кислый
11.11.2010, 21:30
ошибсо

Добавлено через 9 минут
функции mpz_inp_str(d, sD, 10); в sD нужен ноль на конце ?

xkor
12.11.2010, 17:41
функции mpz_inp_str(d, sD, 10); в sD нужен ноль на конце ?а в числе 10000 нужен ноль на конце?)

Кислый
17.11.2010, 13:21
есть вопросы, и я спешу сюда ))

после организации сокета, приходит пакет инит.

обычно он приходит в виде (неразкодированном)
Сервер, Length: 186 (0xBA)
*-------------------------------------------------------*
0x0000| BA 00 98 F5 02 E1 91 09 D9 CF D8 90 6F 69 58 91
0x0010| 63 32 84 C4 80 43 CF 23 B6 C2 D0 7B EE 53 01 7A
0x0020| 44 A2 11 B4 4B E4 DC 31 5F 69 53 D5 08 8A 54 00
0x0030| 8A 1C D3 94 6F EB C3 FA 9E 00 68 1C 34 8B 71 2C
0x0040| 9B 3C CF 09 C3 2D F5 68 3C 99 EE 4B 09 15 B7 6E
0x0050| 9F 36 94 27 69 B7 38 2C 0C C3 F1 DD 1C B8 AD 99
0x0060| BC A6 92 99 DD BD 4E 8F 0F 36 95 1E 0C 60 ED 83
0x0070| BC 49 7F B5 24 51 8E 26 C5 99 5C 1F FB ED CB 0F
0x0080| BB 66 A4 E6 F7 6B 0C 4C E1 B5 7B 51 65 6B C4 FE
0x0090| 06 B7 27 E9 F6 AF 4A E3 49 EE EC BD 25 4D 9C BC
0x00A0| 71 48 11 31 C1 82 83 7E C1 5A 62 1C 59 72 77 D0
0x00B0| 29 59 D4 E4 8D F3 B3 3F A4 B3

у меня же
kisly@kisly-desktop:~/c++/sock1/bin/Debug$ ./sock1 95.211.81.129 2106
Установлено соединение с 95.211.81.129:2106
От сервера получено: � 186
Сервер, Length: 186 (0xBA)
-- -- -- -- -- -- --

0x0000| FFFFFFBA 00 FFFFFFE3 FFFFFFB5 1B FFFFFFB4 FFFFFFED 38 FFFFFFCA FFFFFF83 FFFFFF8A FFFFFF94 72 FFFFFFCB 52 33
0x0010| FFFFFFC3 FFFFFFB7 FFFFFFC2 FFFFFF8E 6D FFFFFF9B 7A 68 12 FFFFFF99 FFFFFF9F FFFFFFF2 08 0D FFFFFFD7 FFFFFF9E
0x0020| 5B FFFFFF86 FFFFFFAE FFFFFFA4 FFFFFFB3 7A FFFFFFE0 FFFFFFC3 FFFFFF87 6F FFFFFFC3 58 FFFFFFFF FFFFFFB9 FFFFFFD0 FFFFFF9D
0x0030| 1A 22 FFFFFFE7 77 67 FFFFFFD4 FFFFFFEC 13 12 FFFFFFC4 FFFFFFFC 17 FFFFFFC3 FFFFFFD3 78 6A
0x0040| 3E 17 FFFFFF8F 6D FFFFFFFA FFFFFF81 18 FFFFFF82 FFFFFF91 FFFFFF89 FFFFFFF1 FFFFFFF4 FFFFFF89 FFFFFFB5 FFFFFFF2 52
0x0050| FFFFFF89 FFFFFFE7 10 7C 29 FFFFFFE7 FFFFFFCE FFFFFFEF FFFFFFC3 FFFFFF9F 0A 2E FFFFFFD2 57 3A FFFFFFB2
0x0060| FFFFFFD4 FFFFFF97 69 2A 28 FFFFFFB4 49 FFFFFFA4 FFFFFFD7 6F 6A 5B 47 72 57 FFFFFFBC
0x0070| FFFFFFBD FFFFFFAF 21 FFFFFFC7 FFFFFFEE 69 FFFFFFFD FFFFFFED 0D FFFFFFBE 09 77 11 FFFFFF93 23 FFFFFFFB
0x0080| FFFFFFB7 37 39 FFFFFF91 FFFFFFFA FFFFFFB4 FFFFFFB3 67 62 5B FFFFFFC7 0E 52 FFFFFFAC FFFFFFAC 21
0x0090| 0B 41 4F 76 34 58 68 FFFFFFCD 0F 0F 7B FFFFFF8D FFFFFF94 FFFFFFE1 FFFFFFFF FFFFFFDF
0x00A0| FFFFFFF5 FFFFFFF6 FFFFFFCC FFFFFFE9 FFFFFFD1 FFFFFFA2 FFFFFFE2 FFFFFF93 FFFFFFA9 FFFFFFA2 19 79 6B FFFFFFD6 FFFFFFED FFFFFF9E
0x00B0| FFFFFFF0 FFFFFFD9 30 68 FFFFFFDA FFFFFFBA FFFFFFEC FFFFFFFA 15 FFFFFF88 00 5B FFFFFF9D FFFFFFD3 FFFFFFA5 44

прикладываю функцию view_pkt вынесенную в отдельный проэкт
http://depositfiles.com/files/falvz67jk
не могу понять, уз-за чего появляются 6xF ?

Breadfan
17.11.2010, 13:27
хех, а я вобще в кодировании нечего не понимаю почти) мучаю Breadfan'a чтоб научил меня немножко)Да я вообще не программист...Я слесарь вообще-то :) Это просто есть у меня знакомый дядя Миша...

Кислый
17.11.2010, 15:54
это здорово! а по существу ?

Добавлено через 14 минут
так я догнал, что это отрицательное число так представлятся либо если оно превышает значение переменной

тогда вопрос к xkor, как человеку который собаку сьел на этом )), данные какого типа приходят от сервера ? Byte(char), Integer(int), Word(long) ?

Добавлено через 57 минут
и еще, первый байт приходит, как 186 (BA) или как -70 ?

Добавлено через 51 минуту
я, блин, невнимательный ((
забыл что Byte это unsined char

xkor
17.11.2010, 17:53
Кислый, боже что это?! Как оно должно работать?!
Короче исправь это:void view_pkt(char buff[], int len, int from_server)
{
//var
int lines, i, i1;
char s[256];

if (from_server){strcpy(s, "Сервер");}
else {strcpy(s, "Клиент");}

sprintf(s, "%s, Length: %d (0x%.*X)\n", s, len, 2, len);

ToLog(s);
ToLog(" -- -- -- -- -- -- -- \n");
//view_pkt
lines = len / 16;
int mod = len % 16;
int il = i1 + i *16;
if (mod>0) { lines++ ;}
for (i = 0; i < lines; i++)
{
sprintf(s, "\n0x%.*X| ", 4, 16*i);
for (i1 = 0; i1 < 16; i1++)
{
if (il >= len)
{
sprintf(s, "%s ", s);
}
else sprintf(s, "%s %.*X", s, 2, buff[i1+16*i]);
sprintf(s, "%s ", s);
}
ToLog(s);
}
ToLog(" \n");
}

на это:
char * StringToHex(char * s, int len)
{
char *ahex = "0123456789ABCDEF";
char *r = new char[len*3+3];

for(int i=0; i<len; i++){
r[i*3]=ahex[(((UINT8)s[i]) >> 4) & 0xf];
r[i*3+1]=ahex[((UINT8)s[i]) & 0xf];
r[i*3+2]=' ';
}
r[len*3]='\r';
r[len*3+1]='\n';
r[len*3+2]=0;
return r;
}

void view_pkt(char buff[], int len, int from_server)
{
//var
int lines, i, i1;
char s[256];

if (from_server){strcpy(s, "Сервер");}
else {strcpy(s, "Клиент");}

sprintf(s, "%s, Length: %d (0x%.*X)\n", s, len, 2, len);

ToLog(s);
ToLog(" -- -- -- -- -- -- -- \n");
//view_pkt
lines = len / 16;
int mod = len % 16;
int il = i1 + i *16;
if (mod>0) { lines++ ;}
for (i = 0; i < lines; i++)
{
if((mod>0)&&(i+1==lines))
sprintf(s, "\n0x%.*X| %s", 4, 16*i, StringToHex(&buff[16*i],mod));
else
sprintf(s, "\n0x%.*X| %s", 4, 16*i, StringToHex(&buff[16*i],16));
ToLog(s);
}
ToLog(" \n");
}

ну или как ты сам написал
sprintf(s, "%s %.*X", s, 2, buff[i1+16*i]);
на
sprintf(s, "%s %.*X", s, 2, (unsined char)buff[i1+16*i]);

Кислый
17.11.2010, 20:55
o_0 я поменял тип переменной для буфера сообщений ( и в main, и в view_pkt) на unsigned char

xkor
18.11.2010, 00:24
Кислый, видишь сколько способов решения одной и той же проблемы)