PDA

View Full Version : کمک در الگوریتم hash



star462
شنبه 09 خرداد 1388, 11:05 صبح
سلام


من یه برنامه دارم که در قسمت includeیه فایل جدید معرفی کرده
کد اون فایل هم دارم چه کنم که برنامه اصلی من اون فایل رو بشناسه؟


بعد نوی همون فایل متغیر هایی از نوع unit8-t هست که فکر نکنم جایی تعریف کرده باشه
چه جوری میشه؟
البته یه قسمتی از برنامه اینو داره

/*

* sha1.h
*
* Description:
* This is the header file for code which implements the Secure
* Hashing Algorithm 1 as defined in FIPS PUB 180-1 published
* April 17, 1995.
*
* Many of the variable names in this code, especially the
* single character names, were used because those were the names
* used in the publication.
*
* Please read the file sha1.c for more information.
*
*/

#ifndef _SHA1_H_
#define _SHA1_H_

#include <stdint.h>
/*
* If you do not have the ISO standard stdint.h header file, then you
* must typdef the following:
* name meaning
* uint32_t unsigned 32 bit integer
* uint8_t unsigned 8 bit integer (i.e., unsigned char)
* int_least16_t integer of >= 16 bits
*
*/

#ifndef _SHA_enum_
#define _SHA_enum_
enum
{
shaSuccess = 0,
shaNull, /* Null pointer parameter */
shaInputTooLong, /* input data too long */
shaStateError /* called Input after Result */
};
#endif
#define SHA1HashSize 20




این یعنی چی؟


#define SHA1CircularShift(bits,word)
(((word) << (bits)) | ((word) >> (32-(bits))))

tdkhakpur
شنبه 09 خرداد 1388, 11:11 صبح
سلام
درمور سوال اول شما توضیح کم هست.
ولی درمورد

#define SHA1CircularShift(bits,word)
(((word) << (bits)) | ((word) >> (32-(bits))))
این یک نوع ماکرو هست که مقدار word رو با توجه به اندازه bits عملیات and و or را انجام داده و نتیجه رو برمیگردونه.
موفق باشید.

star462
یک شنبه 10 خرداد 1388, 20:40 عصر
تشکر
منظوره من از سوال اول این بود که من یه برنامه دارم که داخلش ازکد های یه برنامه دیگه استفاده میکنم
چه طور میتونم برنامه دومی را به برنامه اصلی ضمیمه کنم؟

star462
یک شنبه 10 خرداد 1388, 21:54 عصر
توی این کد sha1reset( &sha )
مقدار sha کجا مقدار دهی میشه؟

#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sha1.h"

/*
* Define patterns for testing
*/
#define TEST1 "abc"
#define TEST2a "abcdbcdecdefdefgefghfghighijhi"

#define TEST2b "jkijkljklmklmnlmnomnopnopq"
#define TEST2 TEST2a TEST2b
#define TEST3 "a"
#define TEST4a "01234567012345670123456701234567"
#define TEST4b "01234567012345670123456701234567"
/* an exact multiple of 512 bits */
#define TEST4 TEST4a TEST4b
char *testarray[4] =
{
TEST1,
TEST2,
TEST3,
TEST4
};
long int repeatcount[4] = { 1, 1, 1000000, 10 };
char *resultarray[4] =
{
"A9 99 3E 36 47 06 81 6A BA 3E 25 71 78 50 C2 6C 9C D0 D8 9D",
"84 98 3E 44 1C 3B D2 6E BA AE 4A A1 F9 51 29 E5 E5 46 70 F1",
"34 AA 97 3C D4 C4 DA A4 F6 1E EB 2B DB AD 27 31 65 34 01 6F",
"DE A3 56 A2 CD DD 90 C7 A7 EC ED C5 EB B5 63 93 4F 46 04 52"
};

int main()
{
SHA1Context sha;
int i, j, err;
uint8_t Message_Digest[20];

/*
* Perform SHA-1 tests
*/
for(j = 0; j < 4; ++j)
{
printf( "\nTest %d: %d, '%s'\n",
j+1,
repeatcount[j],
testarray[j]);

err = SHA1Reset(&sha);


با توجه به اینکه این دو قطعه کد را داریم


int SHA1Reset(SHA1Context *context)
{
if (!context)
{
return shaNull;
}

context->Length_Low = 0;
context->Length_High = 0;
context->Message_Block_Index = 0;

context->Intermediate_Hash[0] = 0x67452301;
context->Intermediate_Hash[1] = 0xEFCDAB89;
context->Intermediate_Hash[2] = 0x98BADCFE;
context->Intermediate_Hash[3] = 0x10325476;
context->Intermediate_Hash[4] = 0xC3D2E1F0;

context->Computed = 0;
context->Corrupted = 0;

return shaSuccess;
}





typedef struct SHA1Context
{
uint32_t Intermediate_Hash[SHA1HashSize/4]; /* Message Digest */

uint32_t Length_Low; /* Message length in bits */
uint32_t Length_High; /* Message length in bits */

/* Index into message block array */
int_least16_t Message_Block_Index;
uint8_t Message_Block[64]; /* 512-bit message blocks */

int Computed; /* Is the digest computed? */
int Corrupted; /* Is the message digest corrupted? */
} SHA1Context;

star462
دوشنبه 11 خرداد 1388, 13:33 عصر
لطفا جواب سوالو بدین:ناراحت:
ممنون

tdkhakpur
دوشنبه 11 خرداد 1388, 14:15 عصر
سلام
خوب تابع زیر که دارید براتون این کار رو انجام میده.

SHA1Reset(SHA1Context *context)

star462
سه شنبه 12 خرداد 1388, 19:39 عصر
با توجه به تابه زیر مقدار shaSucess چه زمانی برابر یک میشود؟

int SHA1Reset(SHA1Context *context)
{
if (!context)
{
return shaNull;
}

context->Length_Low = 0;
context->Length_High = 0;
context->Message_Block_Index = 0;

context->Intermediate_Hash[0] = 0x67452301;
context->Intermediate_Hash[1] = 0xEFCDAB89;
context->Intermediate_Hash[2] = 0x98BADCFE;
context->Intermediate_Hash[3] = 0x10325476;
context->Intermediate_Hash[4] = 0xC3D2E1F0;

context->Computed = 0;
context->Corrupted = 0;

return shaSuccess;
}




که در اول لرنامه مفدار اولیه shaSucess صفر داده



#ifndef _SHA_enum_
#define _SHA_enum_
enum
{
shaSuccess = 0,
shaNull, /* Null pointer parameter */
shaInputTooLong, /* input data too long */
shaStateError /* called Input after Result */
};
#endif


تشکر که جواب دادین

star462
سه شنبه 12 خرداد 1388, 19:43 عصر
کار stderr در کد زیر چیه؟
if (err)
{
fprintf(stderr, "SHA1Reset Error %d.\n", err );
break; /* out of for j loop */
}

tdkhakpur
چهارشنبه 13 خرداد 1388, 12:50 عصر
سلام
در تابع SHA1Reset مقدار shaSucess همیشه مقدار قبل از فراخوانی این تابع رو برخواهد گرداند و تابع جاری هیچ تاثیری بر مقدار برگشتی نخواهد داشت.
در مورد

fprintf(stderr, "SHA1Reset Error %d.\n", err );

این دستور مقدار err رو در فایل با مشخصه stderr قرار میده.
موفق باشید.

star462
چهارشنبه 13 خرداد 1388, 18:22 عصر
سلام
میشه بگید کار کد زیر چیه؟
یعنی قسمت messeage-array & 0XFF * نمیفهمم



context->Message_Block[context->Message_Block_Index++] =
(*message_array & 0xFF);

که Message-array به شکل زیر است اسمه دیگه متغیر testarray است

char *testarray[4] =
{
TEST1,
TEST2,
TEST3,
TEST4
};


و مقدار test1, test2به شکل زیر است


#define TEST1 "abc"
#define TEST2a "abcdbcdecdefdefgefghfghighijhi"

#define TEST2b "jkijkljklmklmnlmnomnopnopq"
#define TEST2 TEST2a TEST2b

star462
چهارشنبه 13 خرداد 1388, 18:23 عصر
و سوال بعدی
بالای این برنامه من که اسمtest یه header به اسم sha1 به شکل زیر است

#include "sha1.h"


حالا خود این sha1 برنامه ای است که من کدشو دارم
حالا که می خوام برنامه test کامپایل کنم error میگیره که sha1 نمیشناسه
چی کار کنم که بشناسه؟؟؟؟

البته اینم بگم که داخل sha1.h فقط یک سری اعلان تابع و متغیر هست که کد کامل تابع در فایل sha1.c
هست میشه بگین این سخ تارو چه طور به هم ربط بدم
من یه قسمت کدی از هر کدومم قرار میدم
سر فایل sha1.h

#ifndef _SHA1_H_
#define _SHA1_H_

#include <stdint.h>
int SHA1Reset( SHA1Context *);
int SHA1Input( SHA1Context *,
const uint8_t *,
unsigned int);
int SHA1Result( SHA1Context *,
uint8_t Message_Digest[SHA1HashSize]);

#endif



حالا تعریف کامل تابع و سایر چیزا داخل sha1.c هست

#include "sha1.h"

/*
* Define the SHA1 circular left shift macro
*/
#define SHA1CircularShift(bits,word) \

(((word) << (bits)) | ((word) >> (32-(bits))))
int SHA1Reset(SHA1Context *context)
{
if (!context)
{
return shaNull;
}

context->Length_Low = 0;
context->Length_High = 0;
context->Message_Block_Index = 0;

context->Intermediate_Hash[0] = 0x67452301;
context->Intermediate_Hash[1] = 0xEFCDAB89;
context->Intermediate_Hash[2] = 0x98BADCFE;
context->Intermediate_Hash[3] = 0x10325476;
context->Intermediate_Hash[4] = 0xC3D2E1F0;

context->Computed = 0;
context->Corrupted = 0;

return shaSuccess;
}




اینم ابتدای کد test من


#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "sha1.h"

/*
* Define patterns for testing
*/
#define TEST1 "abc"
#define TEST2a "abcdbcdecdefdefgefghfghighijhi"

star462
پنج شنبه 14 خرداد 1388, 00:29 صبح
لطفا جواب بدین :لبخندساده:

tdkhakpur
پنج شنبه 14 خرداد 1388, 13:47 عصر
messeage-array & 0XFF
در مورد کد بالا یک عمل منطقی and هست که مورد استفاده قرار گرفته.

tdkhakpur
پنج شنبه 14 خرداد 1388, 13:51 عصر
حالا خود این sha1 برنامه ای است که من کدشو دارم
حالا که می خوام برنامه test کامپایل کنم error میگیره که sha1 نمیشناسه
چی کار کنم که بشناسه؟؟؟؟

و اما در مورد این سوال- ببینید ممکن هست این برنامه احتیاج به کتابخونه داشته باشه و هدرها برای مشخص کردن توابع مورد استفاده قرار گیرند.

star462
پنج شنبه 14 خرداد 1388, 16:24 عصر
می دونم میگم چه طور اینو به انواع Header بزارم
باپسوند .h ذخیرش کنم؟

tdkhakpur
جمعه 15 خرداد 1388, 14:16 عصر
می دونم میگم چه طور اینو به انواع Header بزارم
باپسوند .h ذخیرش کنم؟

خوب یک فایل بساز پسوندش رو h قراتر بده

ely.teacher
دوشنبه 18 خرداد 1388, 00:29 صبح
سلام من یه برنامه با پاسکال در باره هشینگ دارم راهنمایی نیاز دارم کسی می تونه کمک کنه
program test;
uses wincrt;
type
st=^stud;
stud=record
name: string[15];
fam :string [15] ;
sho :integer;
link :st;
end;
var
n : integer;
student :text;
hash : array [1..10] of ^integer;
p,q :st;
procedure new_str ;
var
name ,fam : string[15];
sho :integer;
a :integer;
begin
write ('name : ');
readln (name);
write ('family : ');
readln (fam);
write ('shomare daneshjoee (just 1 to 100): ');
readln (sho);
assign (student,'d:\zakhireh\student.dat');
writeln (student,name:15,fam:15,sho:4);
a := sho MOD 10 ;
new(p);
if hash[a]=nil then
begin
hash[a]:=;
q:=p;
end
else
begin
q^link:=p;
q:=p;
end;
p.name=name;
p.fam=fam;
p.sho=sho;

end;

begin
writeln (' 1 -enter data for new student');
writeln (' 2 -search ');
writeln ('enter your choice :');
readln n;
case n of
1 : new_std;
2 : search_std();
end;
end.