Ich habe ein kleines Problem mit einer SHA-1 Umsetzung unter C++ bzw. C. Der unten aufgeführte Code funktioniert zwar Prima, doch bei dem hashen von z.B. "ü" kommt es zu einem Hash, der lediglich 39 Zeichen enthält. Könnt ihr mir sagen wo der Fehler liegt bzw. eine korregierte Version vorlegen? Danke!
PS:
So wird das ganze übergeben:
Code:
string SHA1(unsigned char* str1)
{
#define rotateleft(x,n) ((x<<n) | (x>>(32-n)))
#define rotateright(x,n) ((x>>n) | (x<<(32-n)))
unsigned long int h0,h1,h2,h3,h4,a,b,c,d,e,f,k,i,j,temp;
h0 = 0x67452301;
h1 = 0xEFCDAB89;
h2 = 0x98BADCFE;
h3 = 0x10325476;
h4 = 0xC3D2E1F0;
unsigned char* str;
str = (unsigned char*)malloc(strlen((const char*)str1)+100);
strcpy((char*)str,(const char*)str1);
//str = str1;
int current_length = strlen((const char*)str);
int original_length = current_length;
str[current_length] = 0x80;
str[current_length + 1] = '\0';
char ic = str[current_length];
current_length++;
int ib = current_length % 64;
if(ib<56)
ib = 56-ib;
else
ib = 120 - ib;
for(i=0;i < ib;i++)
{
str[current_length]=0x00;
current_length++;
}
str[current_length + 1]='\0';
for(i=0;i<6;i++)
{
str[current_length]=0x0;
current_length++;
}
str[current_length] = (original_length * 8) / 0x100 ;
current_length++;
str[current_length] = (original_length * 8) % 0x100;
current_length++;
str[current_length+i]='\0';
int number_of_chunks = current_length/64;
unsigned long int word[80];
for(i=0;i<number_of_chunks;i++)
{
for(j=0;j<16;j++)
{
word[j] = str[i*64 + j*4 + 0] * 0x1000000 + str[i*64 + j*4 + 1] * 0x10000 + str[i*64 + j*4 + 2] * 0x100 + str[i*64 + j*4 + 3];
}
for(j=16;j<80;j++)
{
word[j] = rotateleft((word[j-3] ^ word[j-8] ^ word[j-14] ^ word[j-16]),1);
}
a = h0;
b = h1;
c = h2;
d = h3;
e = h4;
for(int m=0;m<80;m++)
{
if(m<=19)
{
f = (b & c) | ((~b) & d);
k = 0x5A827999;
}
else if(m<=39)
{
f = b ^ c ^ d;
k = 0x6ED9EBA1;
}
else if(m<=59)
{
f = (b & c) | (b & d) | (c & d);
k = 0x8F1BBCDC;
}
else
{
f = b ^ c ^ d;
k = 0xCA62C1D6;
}
temp = (rotateleft(a,5) + f + e + k + word[m]) & 0xFFFFFFFF;
e = d;
d = c;
c = rotateleft(b,30);
b = a;
a = temp;
}
h0 = h0 + a;
h1 = h1 + b;
h2 = h2 + c;
h3 = h3 + d;
h4 = h4 + e;
}
stringstream ss;
ss << hex << h0 << h1 << h2 << h3 << h4;
cout << ss.str() << endl;
cout << ss.str().length() << endl;
return ss.str();
}
PS:
So wird das ganze übergeben:
Code:
string Password;
getline(cin, Password);
char* PW_char = const_cast<char*>(Password.c_str());
string SHA_1 = Encrypt.SHA1((unsigned char *)PW_char);