PDA

View Full Version : اجرا یک کد و برخورد با خطا



mammad_asir
شنبه 10 اسفند 1392, 01:49 صبح
با سلام کد یه برنامه رو در زیر قرار میدم کسی میدونه چطور میشه اونو اجرا کرد هر کار میکنم اجرا نمیشه من به کدبلاک و ویژوال استدیو اجرا کردم خطا میداد
کسی میدونه با چه کامپایلری اجرا کنم که خطا نده یا چطور میشه این خطاها را برطرف کرد؟
در ضمن این برنامه شامل یک فایل .c و یک فایل .h است.

http://www.uplooder.net/cgi-bin/dl.cgi?key=92511b17767256c61f6f969f7ff8b285

rahnema1
شنبه 10 اسفند 1392, 06:59 صبح
سلام بعضی جاها بک اسلش می خواست

rahnema1
شنبه 10 اسفند 1392, 07:00 صبح
سلام بعضی جاها بک اسلش می خواست

http://mihanbit.com/download/53115b42bdf2d/RC6.zip

mammad_asir
شنبه 10 اسفند 1392, 13:59 عصر
http://mihanbit.com/download/53115b42bdf2d/RC6.zipسلام از جوابت متشکردم ولی میدونی چطور میشه یه اجرا بگیریم از این الگوریتم میخوام یه ورودی و. یک کلید بدم و الگوریتم اینو رمز کنه میدونید تا بع encrypt چطور کار میکنه او آرایه in-blok چیه متشکر

rahnema1
شنبه 10 اسفند 1392, 20:50 عصر
in_blk یک آرایه شامل 4 عضو هست. شما در آخر فایل rc6.c این کد را بذارید اول آرایه in_blk را رمزنگاری سپس دو باره رمزگشایی می کنه و هر دو را هم چاپ می کنه

#include <stdio.h>
int main()
{
int i;
u4byte in_key[]={2,4,3,5,7,3,98,3};
u4byte in_blk[]={200,300,400,500};
u4byte out_blk[4];
u4byte *l_key=set_key(in_key, sizeof in_key/ sizeof in_key[0]);
encrypt(in_blk, out_blk);
printf("encrypted:\n");
for (i=0;i<4;i++) printf("%hu\n",out_blk[i]);
decrypt(out_blk, in_blk);
printf("decrypted:\n");
for (i=0;i<4;i++) printf("%hu\n",in_blk[i]);
}

mammad_asir
شنبه 10 اسفند 1392, 23:54 عصر
in_blk یک آرایه شامل 4 عضو هست. شما در آخر فایل rc6.c این کد را بذارید اول آرایه in_blk را رمزنگاری سپس دو باره رمزگشایی می کنه و هر دو را هم چاپ می کنه

#include <stdio.h>
int main()
{
int i;
u4byte in_key[]={2,4,3,5,7,3,98,3};
u4byte in_blk[]={200,300,400,500};
u4byte out_blk[4];
u4byte *l_key=set_key(in_key, sizeof in_key/ sizeof in_key[0]);
encrypt(in_blk, out_blk);
printf("encrypted:\n");
for (i=0;i<4;i++) printf("%hu\n",out_blk[i]);
decrypt(out_blk, in_blk);
printf("decrypted:\n");
for (i=0;i<4;i++) printf("%hu\n",in_blk[i]);
}




بسیار متشکر از جوابی که میدید
ولی من این کار رو انجام دادم و این ارور زیر را میده
یعنی در واقع یه فایل خالی باز کردم و هر دو تا رو اضافه کردم

انگار تو اجرا کردن کد مشکل دارم اگه میشه کن با جزئیات راهنمایی کنید.
http://upload7.ir/imgs/2014-03/87755502193615905235.jpg

http://upload7.ir/imgs/2014-03/65464475957703303905.jpg

در مورد دو خط زیر میگید که چیه؟
u4byte in_key[]={2,4,3,5,7,3,98,3};
u4byte *l_key=set_key(in_key, sizeof in_key/ sizeof in_key[0]);

در ضمن مثلا آرایه in-blk 4 مقدار 32 بیتی میگیرد آیا میتوان این مقادیر را به طور مبنار 2 یا مبنای 16 داد؟

rahnema1
یک شنبه 11 اسفند 1392, 06:33 صبح
من با gcc اجرا کردم جواب داد. شما با کد بلاک کامپایل کنید. یک اصلاح در کد کردم. با مبنای 16 هم میشه کار کرد که به جای 200 معادل هگز قرار داده شده است. در ضمن inkey هم همون کلید رمزه که یک آرایه با طول دلخواهه. در مورد sizeof فکر کنم باید طول آرایه inkey به بایت داده می شد نه تعدد اعضای آن که اون هم اصلاح شد

#include <stdio.h>
int main()
{
int i;
u4byte in_key[]={2,4,3,5,7,3,98,3,345,51,7654};
u4byte in_blk[]={0xC8,300,400,500};
u4byte out_blk[4];
u4byte out_blk1[4];
u4byte *l_key=set_key(in_key, sizeof in_key);
encrypt(in_blk, out_blk);
printf("encrypted:\n");
for (i=0;i<4;i++) printf("%u\n",out_blk[i]);
decrypt(out_blk, out_blk1);
printf("decrypted:\n");
for (i=0;i<4;i++) printf("%u\n",out_blk1[i]);
}

mammad_asir
یک شنبه 11 اسفند 1392, 14:27 عصر
من با gcc اجرا کردم جواب داد. شما با کد بلاک کامپایل کنید. یک اصلاح در کد کردم. با مبنای 16 هم میشه کار کرد که به جای 200 معادل هگز قرار داده شده است. در ضمن inkey هم همون کلید رمزه که یک آرایه با طول دلخواهه. در مورد sizeof فکر کنم باید طول آرایه inkey به بایت داده می شد نه تعدد اعضای آن که اون هم اصلاح شد

#include <stdio.h>
int main()
{
int i;
u4byte in_key[]={2,4,3,5,7,3,98,3,345,51,7654};
u4byte in_blk[]={0xC8,300,400,500};
u4byte out_blk[4];
u4byte out_blk1[4];
u4byte *l_key=set_key(in_key, sizeof in_key);
encrypt(in_blk, out_blk);
printf("encrypted:\n");
for (i=0;i<4;i++) printf("%u\n",out_blk[i]);
decrypt(out_blk, out_blk1);
printf("decrypted:\n");
for (i=0;i<4;i++) printf("%u\n",out_blk1[i]);
}


دوست عزیز بسیار سپاسگزارم از جوابی که میدید و وقتی که میگزارید و همچنین حسن نیتتان واقعا متشکر
تقریبا مشکلم حل شد خیلی وقت بود کد سی نزده بودم.
سوالم اینه که چطور میتونم تمام ورودی ها واسه همه آرایه ها رو به صورت مبنای 2 بدم یعنی مثلا از یه فایل مبنای 2 واسه کلید ویکی دیگه مبنای دو واسه متن اصلی روبدم وجواب به صورت مبنای 2 واسه خروجی چاپ بشه. یعنی مثلا در کد u4byte in_key[]={2,4,3,5,7,3,98,3,345,51,7654 یک فایل برای ورودی درست کنیم که به این شکل باشد(به صورت 11 عدد 32 بیتی مبنای 2 وارد کنیم):
00000000000000000000000000000010
00000000000000000000000000000100
00000000000000000000000000000011
00000000000000000000000000000101
و.....
و همین طوز برای متن اصلی به صورت 4 عدد 32 بیتی در مبنای 2 با یک فایل داده شود.
و خروجی هم به صورت مبنای 2 در یک فایل نمایش داده شود.

این لینک مقاله اصلی هست: http://www.uplooder.net/cgi-bin/dl.cgi?key=2b09d9875e0fde5b08579453ce3bc7f2

سولی که دارم اینه که در آخر این مقاله چند مثال زده شده که من plain tex و کلید رو مطابق اون مقاله میدم ولی متن رمز شده فرق داره چرا ؟ احتمالا جایی دچار مشکل هست درسته؟
واینکه وقتی آرایه u4byte in_key[] کمتر از 8 مقدار داشته باشه دوباره همون پنجره خطا مطابق شکل قبل ظاهر میشه . ولی در داخل مقاله گفته که این مقدار دلخواه اولیه برای کلید (b) میتونه بین 0 تا 255 بایت باشه.
متشکر از وقتی که صرف کردید
موفق باشید

rahnema1
یک شنبه 11 اسفند 1392, 20:51 عصر
فکر کنم کلیدها باید 8 بیتی باشند. یه برنامه دیگه گیر آوردم این را امتحان کنید. 2 تا فایل ورودی داریم inblk.txt و inkey.txt که اولی به صورت صفرو یک 32 بیتی و دومی صفر و یک 8 بیتی حالا توی برنامه فرض کردم طول کلید 11 تا باشه شما می تونید بسته به مورد تغییر بدید. نهایتا یک فایل خروجی ایجاد میشه که مقادیر رمز شده در اون هست

/* rc6 (TM)
* Unoptimized sample implementation of Ron Rivest's submission to the
* AES bakeoff.
*
* Salvo Salasio, 19 June 1998
*
* Intellectual property notes: The name of the algorithm (RC6) is
* trademarked; any property rights to the algorithm or the trademark
* should be discussed with discussed with the authors of the defining
* paper "The RC6(TM) Block Cipher": Ronald L. Rivest (MIT),
* M.J.B. Robshaw (RSA Labs), R. Sidney (RSA Labs), and Y.L. Yin (RSA Labs),
* distributed 18 June 1998 and available from the lead author's web site.
*
* This sample implementation is placed in the public domain by the author,
* Salvo Salasio. The ROTL and ROTR definitions were cribbed from RSA Labs'
* RC5 reference implementation.
*/
#include <iostream>
#include <fstream>
#include <bitset>
using namespace std;
#include <stdio.h>

/* RC6 is parameterized for w-bit words, b bytes of key, and
* r rounds. The AES version of RC6 specifies b=16, 24, or 32;
* w=32; and r=20.
*/

#define w 32 /* word size in bits */
#define r 20 /* based on security estimates */

#define P32 0xB7E15163 /* Magic constants for key setup */
#define Q32 0x9E3779B9

/* derived constants */
#define bytes (w / 8) /* bytes per word */
#define c ((b + bytes - 1) / bytes) /* key in words, rounded up */
#define R24 (2 * r + 4)
#define lgw 5 /* log2(w) -- wussed out */

/* Rotations */
#define ROTL(x,y) (((x)<<(y&(w-1))) | ((x)>>(w-(y&(w-1)))))
#define ROTR(x,y) (((x)>>(y&(w-1))) | ((x)<<(w-(y&(w-1)))))

unsigned int S[R24 - 1]; /* Key schedule */

void rc6_key_setup(unsigned char *K, int b)
{
int i, j, s, v;
unsigned int L[(32 + bytes - 1) / bytes]; /* Big enough for max b */
unsigned int A, B;

L[c - 1] = 0;
for (i = b - 1; i >= 0; i--)
L[i / bytes] = (L[i / bytes] << 8) + K[i];

S[0] = P32;
for (i = 1; i <= 2 * r + 3; i++)
S[i] = S[i - 1] + Q32;

A = B = i = j = 0;
v = R24;
if (c > v) v = c;
v *= 3;

for (s = 1; s <= v; s++)
{
A = S[i] = ROTL(S[i] + A + B, 3);
B = L[j] = ROTL(L[j] + A + B, A + B);
i = (i + 1) % R24;
j = (j + 1) % c;
}
}

void rc6_block_encrypt(unsigned int *pt, unsigned int *ct)
{
unsigned int A, B, C, D, t, u, x;
int i, j;

A = pt[0];
B = pt[1];
C = pt[2];
D = pt[3];
B += S[0];
D += S[1];
for (i = 2; i <= 2 * r; i += 2)
{
t = ROTL(B * (2 * B + 1), lgw);
u = ROTL(D * (2 * D + 1), lgw);
A = ROTL(A ^ t, u) + S[i];
C = ROTL(C ^ u, t) + S[i + 1];
x = A;
A = B;
B = C;
C = D;
D = x;
}
A += S[2 * r + 2];
C += S[2 * r + 3];
ct[0] = A;
ct[1] = B;
ct[2] = C;
ct[3] = D;
}

void rc6_block_decrypt(unsigned int *ct, unsigned int *pt)
{
unsigned int A, B, C, D, t, u, x;
int i, j;

A = ct[0];
B = ct[1];
C = ct[2];
D = ct[3];
C -= S[2 * r + 3];
A -= S[2 * r + 2];
for (i = 2 * r; i >= 2; i -= 2)
{
x = D;
D = C;
C = B;
B = A;
A = x;
u = ROTL(D * (2 * D + 1), lgw);
t = ROTL(B * (2 * B + 1), lgw);
C = ROTR(C - S[i + 1], t) ^ u;
A = ROTR(A - S[i], u) ^ t;
}
D -= S[1];
B -= S[0];
pt[0] = A;
pt[1] = B;
pt[2] = C;
pt[3] = D;
}

typedef bitset<32> bit32;
typedef bitset<8> bit8;
int main()
{
int i=0;
unsigned int inblk[4],outblk[4];
unsigned char inkey[11];
bit32 Bit32;
bit8 Bit8;
ifstream fileblk;
fileblk.open("inblk.txt");
while(!fileblk.eof())
{
fileblk>>ws>> Bit32>>ws;
inblk[i++]=Bit32.to_ulong();
}
fileblk.close();
ifstream filekey;
filekey.open("inkey.txt");
i=0;
while(!filekey.eof())
{
filekey>>ws>> Bit8>>ws;
inkey[i++]= (unsigned char)( Bit8.to_ulong());
}
filekey.close();
rc6_key_setup(inkey, 11);
rc6_block_encrypt(inblk, outblk);
ofstream fileout;
fileout.open("outblk.txt");
for(i=0; i<4; i++)
fileout<<(bit32) outblk[i] <<' ';
fileout.close();
return 0;
}

mammad_asir
یک شنبه 11 اسفند 1392, 23:09 عصر
فکر کنم کلیدها باید 8 بیتی باشند. یه برنامه دیگه گیر آوردم این را امتحان کنید. 2 تا فایل ورودی داریم inblk.txt و inkey.txt که اولی به صورت صفرو یک 32 بیتی و دومی صفر و یک 8 بیتی حالا توی برنامه فرض کردم طول کلید 11 تا باشه شما می تونید بسته به مورد تغییر بدید. نهایتا یک فایل خروجی ایجاد میشه که مقادیر رمز شده در اون هست


}


شما فرمود شاید کلید 8 بیتی باشد ولی خو آرایه به صورت
u4byte in_key[]
تعریف شده که یعنی هر خونه 32 بیتی هست مگه این طور نیست؟
میتونید دقیق بگید چطور این برنامه رو اجرا کنم ؟
یعنی فایل ورودی و فایل کلید باید چطور باشه؟ یعنی فرمت قرار گیریش چطور باشه؟ و اینکه این دو فایل باید کجا کپی بشه؟ میشه یه نمونه بزارید یعنی آپلود کنید؟
من هر کار میکنم اجرا نمیشه.
البته در کد بالا قسمت های کار با فایل رو غیر فعال کردم مثل زیر شد:



int main()

{

int i=0;

unsigned int inblk[4],outblk[4];

unsigned char inkey[11];

bit32 Bit32;

bit8 Bit8;

ifstream fileblk;

/* fileblk.open("G:\arshad\term1\CRYPT\project1\taghire\asli visual studio\asl 3\asl 3\inblk.txt");

while(!fileblk.eof())

{

fileblk>>ws>> Bit32>>ws;

inblk[i++]=Bit32.to_ulong();

}*/

inblk[0]=00000000;
inblk[1]=00000000;
inblk[2]=00000000;
inblk[3]=00000000;
inblk[4]=00000000;
inblk[5]=00000000;
inblk[6]=00000000;
inblk[7]=00000000;
inblk[8]=00000000;
inblk[9]=00000000;
inblk[10]=00000000;
inblk[11]=00000000;
inblk[12]=00000000;
inblk[13]=00000000;
inblk[14]=00000000;
inblk[15]=00000000;
//inblk[0]=00000000;

// inblk[1]=00000000000000000000000000000000;
// inblk[2]=00000000000000000000000000000000;
// inblk[3]=00000000000000000000000000000000;

inkey[0]=00000000000000000000000000000000;
inkey[1]=00000000000000000000000000000000;
inkey[2]=00000000000000000000000000000000;
inkey[3]=00000000000000000000000000000000;



/* fileblk.close();

ifstream filekey;

filekey.open("G:\arshad\term1\CRYPT\project1\taghire\asli visual studio\asl 3\asl 3\inkey.txt");

i=0;

while(!filekey.eof())

{

filekey>>ws>> Bit8>>ws;

inkey[i++]= (unsigned char)( Bit8.to_ulong());

}

filekey.close();
*/
rc6_key_setup(inkey, 11);

rc6_block_encrypt(inblk, outblk);




/* ofstream fileout;

fileout.open("G:\arshad\term1\CRYPT\project1\taghire\asli visual studio\asl 3\asl 3\outblk.txt");

for(i=0; i<4; i++)

fileout<<(bit32) outblk[i] <<' ';

fileout.close();
*/
return 0;

}
[/QUOTE]

حالا تو این کد من ورودی ها رو مطابق با مثال اول در همون مقاله اصلی که به شما دادم قرار دادم حال اگه رو خط آخر بریک پوینت بزاریم و اجرا کنیم و نتایج رو در مقدار outblk مشاهده کنیم میبینیم جواب رمز شده با جواب رمز در مقاله متفاوت هست و این یعنی یه اشتباهی هست تو کار.
احتمالا مشکل از قسمت کلید باشه .


در ضمن در برنامه قبلی هم نمیتونستم ورودی 32 بیتی صفر و یک بدهیم

rahnema1
دوشنبه 12 اسفند 1392, 08:12 صبح
حرف شما درسته کلید 32 بیتی هم میشه داد اما یک نکته وجود داره چون سیستم ها معمولا little endian هستند ترتیب بایتها معکوس میشه مثلا اگر عدد مورد نظر 0x02132435 باشه باید به این صورت وارد بشه :0x35241302 حالا همون برنامه اولی اصلاح شده را گذاشتم تا خودتون امتحان کنید http://mihanbit.com/download/53140f17d6c9c/RC6-1.zip

mammad_asir
دوشنبه 12 اسفند 1392, 15:06 عصر
حرف شما درسته کلید 32 بیتی هم میشه داد اما یک نکته وجود داره چون سیستم ها معمولا little endian هستند ترتیب بایتها معکوس میشه مثلا اگر عدد مورد نظر 0x02132435 باشه باید به این صورت وارد بشه :0x35241302 حالا همون برنامه اولی اصلاح شده را گذاشتم تا خودتون امتحان کنید http://mihanbit.com/download/53140f17d6c9c/RC6-1.zip




[/QUOTE]
واقعا متشکر از کمک شما
کار با فایلش یه خورده خطا میده حالا خارج از بحث کار با فایل در دادن ورودی معمولی مثلا وقتی in_blk[3]=00110101001001000001001100000010; را میدهم خطا میدهد و برای این آرایه مقدار بیشتر از 20 بیت را قبول نمیکند چرا؟
داخل مقاله اصلی نوشته که مقداری که برای طول کلید به بایت وارد میکنیم که اختیاری است میتواند بین 0 تا 255 باشد.
بحث لیتل ایندین یعنی چی دقیقا؟ مثلا ما در برنامه اصلی ورودی دسیمال یا باینری میدهیم و خروجی میگیریم یا هگز یا هر چی.
داخل اون مقاله با ورودی و خروجی هگز کار کرده من هر کار میکنم نمیتونم یه ورودی و یک کلید مطابق مقاله بدم و همون جواب رو بده . جوابی که میده با جواب اون سیستم فرق داره. اگه میشه ببینید میتونید یه نمونه مطابق اون مقاله بدید و جواب مطابق بگیرید؟

مثلا کد زیر رو نگاه کنید من ورودها رو طبق نمونه اول از مثال های داده شده در آخر مقاله دادم ولی جوابی که در مبنای 10 میدهد بعد از اینکه به مبنای 16 تبدیل میکنم با جواب داده شده در مقاله فرق دارد در ضمن مثلا اگز از این 32 بیت ورودی از بیت بیست به بعد را یک کنیم خطا میگیرد این یعنی بیشتر از 20 بیت را قبول نمیکند چرا؟



#include <stdio.h>


int main()


{


int i;
//01 23 45 67 89 ab cd ef 01 12 23 34 45 56 67 78
//89 9a ab bc cd de ef f0 10 32 54 76 98 ba dc fe
//u4byte in_key[]={0x01234567,0x89abcdef,0x01122334,0x45566778,0x89 9aabbc,0xcddeeff0,0x10325476,0x98badcfe};
// 02 13 24 35 46 57 68 79 8a 9b ac bd ce df e0 f1
//u4byte in_blk[]={0x02132435,0x46576879,0x8a9bacbd,0xcedfe0f1};




u4byte in_key[]={0000000000000000000000000000000,0000000000000000 000000000000000,0000000000000000000000000000000,00 00000000000000000000000000000};


u4byte in_blk[]={0000000000000000000000000000000,0000000000000000 000000000000000,0000000000000000000000000000000,00 00000000000000000000000000000};


u4byte out_blk[4];


u4byte out_blk1[4];
int kkk=sizeof in_key;
u4byte *l_key=set_key(in_key, sizeof in_key);

encrypt(in_blk, out_blk);


printf("encrypted:\n");


for (i=0;i<4;i++) printf("%u\n",out_blk[i]);


decrypt(out_blk, out_blk1);


printf("decrypted:\n");


for (i=0;i<4;i++) printf("%u\n",out_blk1[i]);

///////////////////////////////////////////////
int c;
c = getchar();
}


[/QUOTE]

اینم هم گزارش مقاله هست دوست دارین نگاه کنید
http://www.uplooder.net/cgi-bin/dl.cgi?key=fbe6b817ef4ebed0b4abda004e430c33

خیلی از لطفتون متشکرم

rahnema1
دوشنبه 12 اسفند 1392, 19:34 عصر
من مقاله نوشته RonaldL.Rivest را قبلا دیدم ببینید توی اون فایل زیپ rc6-1 یک فایل cpp و یک فایل h و دو تا فایل txt قرار دادم دقیقا مشابه با آخرین مثال اون مقاله هست دقیقا همین فایلها را که به شما دادم کامپایل کنید فایل های تکست باید توی اون فولدری باشند که فایل exe ایجاد شده قرار داره. نتیجه اجرای برنامه ایجاد یک فایله که مقادیر رمز شده در اون قرار داره همچنین در خروجی کنسول هم چاپ میشه. در مورد اینکه endian چیه توضیح مختصر دادم که ترتیب بایتها معکوس میشه توضیح بیشتر را میتونید از این لینک مطالعه کنید:
http://fa.wikipedia.org/wiki/%D8%A7%D9%86%D8%AF%DB%8C%D8%A7%D9%86
http://en.wikipedia.org/wiki/Endianness
مثال مورد استفاده من این بود که در فایل پی دی اف هست:
plaintext 02 13 24 35 46 57 68 79 8a 9b ac bd ce df e0 f1
userkey 01 23 45 67 89 ab cd ef 01 12 23 34 45 56 67 78
89 9a ab bc cd de ef f0 10 32 54 76 98 ba dc fe
ciphertext c8 24 18 16 f0 d7 e4 89 20 ad 16 a1 67 4e 5d 48

rahnema1
دوشنبه 12 اسفند 1392, 20:05 عصر
یک نکته دیگه بگم که اینجوری وارد کردن صفر و یک به داخل آرایه صحیح نیست
in_blk[1]=00110101001001000001001100000010
در فایل cpp که فرستادم از هدر bitset استفاده کردم و برنامه اول رشته صفر و یک را تبدیل به عدد می کنه بعد روی عدد عملیات انجام میده

mammad_asir
دوشنبه 12 اسفند 1392, 22:13 عصر
متشکر دوست عزیز از پیگیریتون
ولی میدونید چطور میشه مشکل endian را برطرف کرد که در خروجی درست نشون داده بشه چون من میخوام یه سری تست هایی روی اون انجام بدم.

کاری که میخوام انجام بدم اینه:
کل میخواهیم بدانیم وقتی یه ورودی را رمز کردیم حال اگر یه بیت را در این ورودی عوض کنیم چه تعداد بیت در خروجی عوض میشود و در واقع این کار را روی مثلا 100 ورودی اعمال میکنیم و در واقع برای هر ورودی 128 حالت داریم چون ورودی ها 128 بیتی است و مامیاییم و دونه دونه بیت ها را عوض میکنیم یعنی در واقع 100 ورودی داریو و برای هر ورودی 128 مقایسه
که شبه کدش مثل زیره

mat[128][128](mat yek matris ba 128 satr va 128 soton ast ba meghdar avalie sefr)
for i = 1 to 100
{
a=tolide yek adade 128 biti be sorate sefr va yek(hamon 4 adade 32 biti)
ramz_a=encrypt(a)
for i=1 to 128
{
a1=teghire bit shomare i az a
ramz_a1=encrypt(a1)
hal meghdare ramz_a ra ba ramz_a1 be sorat bit be bit moghayese mikonim(bithaye motenazer ra moghayese mikonim)
va on shomare bithaii ke fargh darand ra bedast miavarim va dar sotone shomare i satrhayii ke on shomare bitha ba ham fargh
dashtan ro bealave yek mikonim .
}
}
[/QUOTE]






خیلی متشکر از لطف شما

rahnema1
سه شنبه 13 اسفند 1392, 04:59 صبح
این برنامه تعداد 100 ورودی رندوم ایجاد می کنه اما کلید را از فایل ورودی می خونه که می تتونید کلید را در فایل تغییر بدید. ترتیب بایتها و endian هم درست شده. لطفا با کد بلاکس کمپایل کنید. فایل exe هم گذاشتم.
http://mihanbit.com/download/531532fbdf8ec/RC6-3.7z

mammad_asir
سه شنبه 13 اسفند 1392, 20:23 عصر
این برنامه تعداد 100 ورودی رندوم ایجاد می کنه اما کلید را از فایل ورودی می خونه که می تتونید کلید را در فایل تغییر بدید. ترتیب بایتها و endian هم درست شده. لطفا با کد بلاکس کمپایل کنید. فایل exe هم گذاشتم.
http://mihanbit.com/download/531532fbdf8ec/RC6-3.7z

بعضی جاها انگار منظور سوالمو درست نرسوندم . در ضمن من تو ویؤوال استدیو زدم این خط خطا میده (__builtin_bswap32) اصلا این واسه چیه؟
حالا باهاش ور میرم بینم چی میشه.
در ضمن مگه نباید اینجا تعداد بایت ها ارسال شود u4byte *l_key1= set_key(in_key,32* i ); پس 32* I باید بر 8 تقسیم شود درسته؟
ویه سوال دیگه اینکه چطور میشه آرایه in_blk را که یک آرایه 4 خانه ای و هر خانه 32 بیت است را بعد از تبدیل کردن به مقدار صفر و یک در یک آرایه 128 خانه ای که هر خونش صفر و یک هست بریزم

rahnema1
سه شنبه 13 اسفند 1392, 21:24 عصر
اشاره کردم که با کد بلاکس کامپایل کنید این __builtin_bswap32 فقط توسط کامپایلر gcc استفاده میشه که کدبلاکس هم از همین استفاده می کنه و کارش اینه که ترتیب بایتها را معکوس کنه. چون خودتون گفتید مشکل endian حل بشه. حالا اون برنامه را که فرستادم جواب داد؟ اگه ممکنه منظور سوالتون را بگید. شما خواستید یک ماتریس 128در 128 تشکیل بشه و تعداد تغییرات در اون شمرده بشه. که جواب در فایل hist.txt ذخیره میشه. اگه این جواب منظور نظرتان نیست دقیقا بگید کجا اشکال داره؟ ببینید i تعداد اعضای آرایه رمز هست که هر کدوم 32 بیتی هستند بنابراین طول کلید باید به بیت باشه در نتیجه i ضرب در 32 میشه.

mammad_asir
سه شنبه 13 اسفند 1392, 22:27 عصر
مشکل معکوس کردن بیت ها را در ویژوال استدیو با تابع زیر حل کردم
u4byte rev (u4byte in) {
char *high,*low;

high = ((char*)&in)+sizeof(unsigned int)-1;
low = ((char*)&in);

while(high>low) {
char temp = *low;

*low = *high;
*high = temp;
++low;
--high;
}

return in;
}



اون مقدار 63 چیه که برای آرایه کلید نوشتین؟
من میخوام یه تابع داشته باشم که مثلا 100 مقدار 128 بیتی تصادفی درست کنه و در یک فایل ذخیره کنه(مثلا هر خط یک مقدار 128 بیتی به صورت صفر و یک).
حالا در قسمت اصلی برنامه بیاد دونه دونه این 128 بیتی ها رو بخونه و ابتدا رمز کنه (فایل کلید همون مقدار ثابت هست) و حالا بیاد اون 128 بیتی که خوند رو بیت اولشو تغییر بده دو باره رمز کنه و حالا این مقادر رمز شده حاصل از تغییر یک بیت ذر ورودی را با همان مقدار رمز شده ورودی اصلی مقایسه کنه و یک ماتریس 128*128 داریم (با مقدار اولیه صفر)که بعد از مقایسه میاد در ستون اول ماتریس سطر مربوط به بیت هایی که تغییر کردند رو با یک جمع میکنه(یعنی مثلا اگر متن اصلی که از فایل خواندیم 0000 باشد و رمز شده آن 1100 باشد حال میاییم متن 1000 که یه بیت اولشو عوض کردی را رمز میکنیم و مثلا میشه 0101 که وقتی چک میکنیم میبینیم شماره بیت هایی که 0101 و 1100 با هم فرق میکنند بیت شماره 1و4 است و حال میاییم در ماتریسمان در ستون اول سطر شماره 1 و شماره 4 را به اضافه یک میکنیم.)(این ماتریس مسلمه که از نوع int هست.). در ادامه کار همون ورودی اصلی 128 بیتی که از فایل خوند رو بیت دومشو عوض میکنه و رمز میکنه و حاصل رمز را با رمز شده همون مقدار اصلی ورودی داخل فایل مقایسه میکنه و حالا میاد در ستون دوم سطر مربوط با بیتهایی که تغییر کردند را با یک جمع میکند و ادامه میدهد تا بیت 128 ام که مربوط به ستون 128 ام از ماتریس است. حال در ادامه میایم مقدار دوم 128 بیتی را از فایل ورودی اصلی میخونیم همین کارها رو دقیقا تکرار میکنیم وقتی تمام شد مقدار سوم و ... تا 100 ام را از ورودی میخونیم و این عملیات را تکرار میکنیم. این ماتریس را در یک فایل چاب میکنیم.

متشکر از لطفتون

rahnema1
سه شنبه 13 اسفند 1392, 22:34 عصر
من هم که همین کار رو کردم. الان اشکال کجاست؟

mammad_asir
سه شنبه 13 اسفند 1392, 23:06 عصر
من هم که همین کار رو کردم. الان اشکال کجاست؟

پس چرا اون ماتریس رو از نوع int نگرفتین؟
اون عدد 63 واسه کلید واسه چیه؟
چرا مقاد 100 تا ورودی که رندوم که میدید در فایل جداگانه نمینویسه؟
بعد اینکه من میخوام با همون تابع که براتون فرستادم کار کنم که تو ویژوال استدیو اجرا بشه.
و یه سوال دیگه ایکه چطور میشه مقدار in_blk[1] تا in_blk[4] که کلا 128 بیت میشه رو تو یه آرایه 128 خونه ای از نوع int گذاشت.

بعد اینکه to_ulong()چه کار میکنه؟

rahnema1
سه شنبه 13 اسفند 1392, 23:32 عصر
اگه حتما می خواهید با ویژوال استادیو کار کنید می تونید برای ترتیب بایتها از تابع

_byteswap_ulong

استفاده کنید.
مگه قرار نیست کلید از 255 بایت بیشتر نشه؟
255 ضربدر 8 میشه 2040. حالا 2040 تقسیم بر 32 میشه 63 بنابراین بیشتر از 63 تا عدد 32 بیتی نمیتونه آرایه رمز باشه.
مساله دیگه اینه که اون bit32 که گذاشتم می تونه یک رشته از صفر و یک و یا یک عدد صحیح مثبت را بگیره اون را به bitset تبدیل کنه که بشه روش عملیات بیتی انجام داد. چون الگوریتم رمز گذاری اون 128 بیت را به صورت 4 تا 32 بیت می گرفت مجبور شدم اون 128 بیت را به 4 تکه تقسیم کنم تا وارد الگوریتم بشه. بنابراین شما می تونید یک رشته متنی از صفر و یک درست کنید و به bit32 بدهید تا 128 عدد 0 و 1 قابل استفاده جهت عملیات داشته باشید. و بعد با حلقه for بیت های موجود اون را تک به تک بخونید و توی یک آرایه int که می گویید بذارید آرایه mat هم از نوع u4byte هست یعنی عدد صحیح مثبت 32 بیتی . اشکالی هست؟
در مورد اینکه اعداد رندوم در فایل ذخیره بشه خب قبلا نگفته بودید و گرنه این که دیگه کاری نداره الان می فرستم

rahnema1
سه شنبه 13 اسفند 1392, 23:48 عصر
دو تا فایل cpp هست یک برای ویژوال استادیو vs یکی هم با gcc . اون مورد vs را تست نکردم فقط gcc تست کردم. فایل exe هم هست
http://mihanbit.com/download/53163c0432d2c/RC6-4.7z

rahnema1
چهارشنبه 14 اسفند 1392, 00:16 صبح
برای vs این را هم include کنید intrin.h

mammad_asir
چهارشنبه 14 اسفند 1392, 01:42 صبح
خط matBit1=bswp(in_blk[i]); مگه قرار نیست وارون کنه مقادیر رو؟
چرا وقتی با بریک پوینت جلو میرم و چک میکنم اصلا یه مقدار دیگه رو میده و اصلا وارون شده نیست؟

یه کار دیگه که میخوام بکنم اینه که تابع رمز که بیست دوری هست و این ماتریس خروجی واسه اون هست حالا واسه هر کدوم از دورها جدا جدا یه خروجی چاب بشه مثلا در ابتدا فرض میکنیم کل الگوریتم رمز یه دوری باشه و این مقادیر را چاپ میکنیم و بعد فرض میکنیم دو دوری و......
من یه تغییر تو تابع رمز و برنامه دادم آپلود کردم ببینید.
ولی تو خروجی اعداد ماتریس بالای 100 میشه که مثلما نباید بشه لطف میکنید ایراد رو بگید
http://www.uplooder.net/cgi-bin/dl.cgi?key=38e87da0d106451500d7f1c75511eb0a

rahnema1
چهارشنبه 14 اسفند 1392, 08:47 صبح
در مورد سوال اول احتمالا شما دارید matBit1 را با out_blk مقایسه می کنید مثلا بایتهای این دو تا عدد معکوس هم هستند
01101000101011000111110111101011
11101011011111011010110001101000
که از همین برنامه تست گرفتم
اگه می خواهید در مرحله اول دور1 اجرا بشه، در مرحله دوم دور 1و2 اجرا بشه ، در مرحله سوم دور 1و2و3 اجرا بشه ... باید switch را به یک صورت دیگه بنویسید که اون را اصلاح کردم. وگرنه همون طور که نوشته بودید را بذارید در ضمن بعضی جا ها break را نگذاشته بودید. همچنین شما باید در پایان هر مرحله ماتریس mat را برابر صفر قرار می دادید تا مقادیر اون به صورت تجمعی زیاد نشه و بیشتر از 100 نشه
http://mihanbit.com/download/5316b942bccb4/Source1.zip

mammad_asir
چهارشنبه 14 اسفند 1392, 23:07 عصر
خیلی متشکر از کمک هاتون بسیار لطف کردید

mammad_asir
جمعه 16 اسفند 1392, 19:25 عصر
ببخشید دوست عزیز من میخوام برای هر دور وقتی ماتریس کاملا پر شد و چاپ شد توفایل حالا در اینجا یه ماتریس 128*128 داریم که مقادیر خونه هاش بین 0 تا 100 هست حالا من میخوام در هر مرحله یک نمودار هیستوگرام درست کنم که در نمودار افقی اون اعداد بین صفر تا 100 نوشته باشه و در نمودار عمودی اون تعداد تکرار این اعداد در ماتریس*128* 128 رو نشون بده و این عکسو(نمودار هیستو گرام) رو تو خروجی چاپ کنم. البته چون میخوام برنامه به زبون سی باشه و ازتوابع دات نت استفاده نشه به جای رسم شکل میشه تو فایل این شکل رو با مثلا نقطه گزاری کشید.

rahnema1
شنبه 17 اسفند 1392, 15:16 عصر
هیستوگرام ها توی فایل pdf ذخیره میشه تغییراتی دادم مناسب vs باشه اما تست نکردم . توی gcc کار می کنه
http://mihanbit.com/download/531b0a1fdb18b/src2.7z

rahnema1
شنبه 17 اسفند 1392, 15:51 عصر
یه اصلاح انجام دادمhttp://mihanbit.com/download/531c1d23588df/src2-3.7z با پایینی یکی هست

rahnema1
یک شنبه 18 اسفند 1392, 10:49 صبح
یک اصلاح دیگه
http://mihanbit.com/download/531c1d23588df/src2-3.7z