c - readFile 和 ConvertCharToIntArray 方法影响 Sha-1 的哈希实现

标签 c hash sha1 sha

我正在尝试从txt文件“abc”中实现Sha-1的哈希实现并获取a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d ,但我得到输出 E66882F9 DF84C901 18BADCFE 90325476 C3D2E1F0 。我知道问题出在我的阅读或convertChar上方法,但我无法弄清楚我的问题是什么。

对于readfile,我需要在buffer[]数组的末尾附加1位并返回文件中的字符数。变量长度是 const unsigned int。

对于convertArrayToIntArray,我需要通过将4个字符打包到1个内部变量中,将无符号字符转换为等效的无符号整数数组。

unsigned int readFile (unsigned char buffer[])
{
    length = 0;
    int b = 0;
    int i = 0;
    char *fileName = "abc.txt";
    FILE *filePointer = fopen (fileName, "rb");

    if (filePointer != NULL) 
    {
        length = fread (buffer, sizeof (char), MAX_SIZE, filePointer);

        if (ferror (filePointer) != 0) {
            fputs ("Error", stderr);
        }

        if (length > MAX_SIZE) {
            fputs ("Input file too big for program", stderr);
        }
        i = length - 1;

        if (i < 0 && buffer[i] == '\n') {
            buffer[i] = '\0';
        }
        length++;
        buffer[length - 1] = 0x80;
    }

    fclose (filePointer);
    return length;
}

void convertCharArrayToIntArray (unsigned char buffer[], unsigned int
                                message[], unsigned int sizeOfFileInBytes)
{
    int e = 0;
    size_t buffLength = length;

    buffLength = (buffLength + 3) / 4;
    for (e = 0; e < buffLength; e++) {

        message[e] |= (buffer[e] << 24);
        message[e] |= (buffer[e + 1] << 16);
        message[e] |= (buffer[e + 2] << 8);
        message[e] |= (buffer[e + 3]);
    }
}

最佳答案

您还忘记了每 8 个字符有一个空格,这会导致字符打包时出现错误。

#define MAX_SIZE 256
unsigned int length = 0;
void convertCharArrayToIntArray(unsigned char buffer[], unsigned int message[])
{ 
    int e = 0;
    int cnt=0;
    //int d = 0; 
    //buffLength shows me how many chars are in array
    size_t buffLength= length;
    //printf("%i tot", buffLength); 
    buffLength = (buffLength+ 3)/4;
    printf("%d\n",buffLength);
    int crs=0;
    for (e=0 ; e< buffLength-1; e++)
    {
        unsigned int n=0;
        n |= (buffer[crs  ] << 24);
        n |= (buffer[crs+1] << 16);
        n |= (buffer[crs+2] << 8 );
        n |= (buffer[crs+3]      );
        printf("4 chars :>%c%c%c%c to uint=%d\n",buffer[crs  ],buffer[crs+1],buffer[crs+2],buffer[crs+3],n );

        crs+=4;
        cnt++;
        if(cnt==2)/*We can not forget that there is a space between every 8 characters ...*/
        {
            cnt=0;
            crs++;
        }

        message[e]=n;/*Save our uint in buffer*/
    }

}

unsigned int readFile(unsigned char buffer[])
{ 
    //int sizer;
    int b = 0; 
    int i = 0;
    char *fileName = "abc.txt";
    FILE *filePointer = fopen(fileName, "rb");
    if (filePointer != NULL)
    {
        length = fread(buffer, sizeof(char), MAX_SIZE , filePointer);
        if (ferror(filePointer)!= 0)
        {
            fputs("Error", stderr);
            return 0;/*error*/
        }
        if (length > MAX_SIZE )
        {
            fputs("Input file too big for program", stderr);
            return 0;/*error*/
        }
        /*
        It is not necessary to add a null at the end, the buffer is already initialized with zeros
        */
        /*Did not display the content correctly because it was in hexadecimal*/
        for (i = 0; i < length; i++) 
            printf("%c", buffer[i]);/*use %c show real data, it is rubbish but work */

        /*for (i = 0; i < length; i++) 
        printf("%08x", buffer[i]); */

    }

    /*OR print*/
    printf("\n\n%s\n",buffer);
    fclose(filePointer);
    return length;
}


void main()
{
    unsigned char szbuffer[1024]={0};/*initialized to zeroes*/
    if(readFile(szbuffer))
    {
      unsigned int message[100];
      convertCharArrayToIntArray(szbuffer,message);
    }
    else
       printf("error...\n");
    return;
}

关于c - readFile 和 ConvertCharToIntArray 方法影响 Sha-1 的哈希实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43927374/

相关文章:

c# - 在 C# 中使用 SHA1 算法进行散列

powershell - PowerShell的echo和CMD的echo的区别

c - 为什么使用无限 for 循环添加无符号整数会得到错误的结果?

c++ - 如何判断一个 float 是 SNAN 还是 QNAN

c - 当我打开 O_NONBLOCK 时,我得到 "0"和 "I/O error"

ruby-on-rails - 在 Ruby 中查询 JSON 嵌套哈希响应时出现问题

c - 递归选择排序在 C 中输出不正确的值

ruby-on-rails - 如何在 Ruby 中手动创建 JSON 结构?

PHP/MySQL : What data type to chose for encrypted passwords (bcrypt, 最大。 100 个字符)

java - Java (java.security) 中的签名是否有大小限制?