散列程序从C转换为Java,给出了不正确的值

时间:2017-04-02 19:23:41

标签: java hash

我有一个用C编写的程序,如果我提供两个十六进制值,它会生成一个哈希值。这在C中工作正常,但是当我们尝试在Java中执行相同的操作时,C和Java的输出不匹配。 Java程序中唯​​一的变化是变量类型。 C中的uint8_t在Java中更改为byte,而C中的uint32_t在Java中更改为int。程序正在执行但没有得到相同的结果。有人可以帮忙吗?我包括Java和C程序以供参考。

C程序:

#include <Stdint.h>
#include <stdio.h>


int main(void)
{
    uint8_t Z;

    // Volatile meaning the number can change at any time, we can creating varables and sending the final value to g_sha_gen_hash[20]

    volatile uint32_t tA;
    volatile uint32_t tB;
    volatile uint32_t tC;
    volatile uint32_t tD;
    volatile uint32_t tE;
    volatile uint8_t  g_sha_gen_hash[20];
    uint32_t data1[5];
    const uint8_t rnum1[20] = {
    0x67,0x96,0x01,0x9F,0x2F,0xFB,0xD3,0xBF,0x2C,0x13,0x99,0x80,0x50,0x41,0x45,0x81,0x6B,0xC8,0x8A,0x4F
    };

    const uint8_t rnum2[20] = {
0x23,0x89,0xB3,0xBD,0xBD,0x9A,0xEC,0x84,0xAC,0x34,0x4F,0x68,0xDD,0x6F,0x02,0x12,0x23,0x6A,0x5B,0x8F


};



/*for(Z=0;Z<20;Z++)
    {
        rnum1[Z] = Z;
        rnum2[Z] = Z + 1;
    }*/

void genSHA(uint8_t * vec1, uint8_t * vec2)
{
    uint32_t tmp, tmp1,tmp2,ft,wtt,kt;

    uint8_t k, m;

    uint32_t wt[16];

    uint32_t data1[5];

    m = 0;

    for(k=0;k<5;k++)
    {
        data1[k] = ((uint32_t)vec1[m])<<24;
        m++;
        data1[k] = ((uint32_t)vec1[m])<<16;
        m++;
        data1[k] = ((uint32_t)vec1[m])<<8;
        m++;
        data1[k] = ((uint32_t)vec1[m]);
        m++;
    }

    tA = ((uint32_t)vec2[0])<<24;
    tA |= ((uint32_t)vec2[1])<<16;
    tA |= ((uint32_t)vec2[2])<<8;
    tA |= ((uint32_t)vec2[3]);

    tB = ((uint32_t)vec2[4])<<24;
    tB |= ((uint32_t)vec2[5])<<16;
    tB |= ((uint32_t)vec2[6])<<8;
    tB |= ((uint32_t)vec2[7]);

    tC = ((uint32_t)vec2[8])<<24;
    tC |= ((uint32_t)vec2[9])<<16;
    tC |= ((uint32_t)vec2[10])<<8;
    tC |= ((uint32_t)vec2[11]);

    tD = ((uint32_t)vec2[12])<<24;
    tD |= ((uint32_t)vec2[13])<<16;
    tD |= ((uint32_t)vec2[14])<<8;
    tD |= ((uint32_t)vec2[15]);

    tE = ((uint32_t)vec2[16])<<24;
    tE |= ((uint32_t)vec2[17])<<16;
    tE |= ((uint32_t)vec2[18])<<8;
    tE |= ((uint32_t)vec2[19]);



    for (k=0;k<5;k++)
    {
        wt[k]=data1[k];
        wt[k+5]=data1[k];
        wt[k+10]=data1[k];
    }
    wt[15]=data1[4];

for(k=0;k<80;k++)
    {

        tmp1=tA>>27;
        tmp2=tA<<5;
        tmp2|=tmp1;

        if(k<20)
        {
            ft=(tB&tC)|((~tB)&tD);
        }
        else if((k>=20) && (k<40))
        {
            ft=tB^tC^tD;
        }
        else if((k>=40) && (k<60))
        {
            ft=(tB&tC)|(tB&tD)|(tC&tD);
        }
        else
        {
            ft=tB^tC^tD;
        }

        if(k<16)
        {
            wtt=wt[k];
        }
        else
        {
            wtt=wt[13]^wt[8]^wt[2]^wt[0];

            if(wtt&0x80000000)
            {
                wtt=wtt<<1;
                wtt|=0x00000001;
            }

            else
            {
                wtt=wtt<<1;
            }

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

            //for (n=1;n<16;n++)
            //{
                //wt[n-1]=wt[n];
            //}
            //wt[15]=wtt;
        }

        if(k==0)
        {
            kt=0x5A827999;
        }
        else if(k==20)
        {
            kt=0x6ED9EBA1;
        }
        else if(k==40)
        {
            kt=0x8F1BBCDC;
        }
        else if(k==60)
        {
            kt=0xCA62C1D6;
        }

        tmp=tmp2+ft+wtt+kt+tE;

        tE=tD;
        tD=tC;
        tC=(tB>>2)|(tB<<30);
        tB=tA;
        tA=tmp;

    }


    g_sha_gen_hash[0] = (uint8_t)((tA>>24)&0x000000FF);
    g_sha_gen_hash[1] = (uint8_t)((tA>>16)&0x000000FF);
    g_sha_gen_hash[2] = (uint8_t)((tA>>8)&0x000000FF);
    g_sha_gen_hash[3] = (uint8_t)(tA&0x000000FF);
    g_sha_gen_hash[4] = (uint8_t)((tB>>24)&0x000000FF);
    g_sha_gen_hash[5] = (uint8_t)((tB>>16)&0x000000FF);
    g_sha_gen_hash[6] = (uint8_t)((tB>>8)&0x000000FF);
    g_sha_gen_hash[7] = (uint8_t)(tB&0x000000FF);
    g_sha_gen_hash[8] = (uint8_t)((tC>>24)&0x000000FF);
    g_sha_gen_hash[9] = (uint8_t)((tC>>16)&0x000000FF);
    g_sha_gen_hash[10] = (uint8_t)((tC>>8)&0x000000FF);
    g_sha_gen_hash[11] = (uint8_t)(tC&0x000000FF);
    g_sha_gen_hash[12] = (uint8_t)((tD>>24)&0x000000FF);
    g_sha_gen_hash[13] = (uint8_t)((tD>>16)&0x000000FF);
    g_sha_gen_hash[14] = (uint8_t)((tD>>8)&0x000000FF);
    g_sha_gen_hash[15] = (uint8_t)(tD&0x000000FF);
    g_sha_gen_hash[16] = (uint8_t)((tE>>24)&0x000000FF);
    g_sha_gen_hash[17] = (uint8_t)((tE>>16)&0x000000FF);
    g_sha_gen_hash[18] = (uint8_t)((tE>>8)&0x000000FF);
    g_sha_gen_hash[19] = (uint8_t)(tE&0x000000FF);

extern volatile uint8_t g_sha_gen_hash[20];
}

printf("\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n");
printf("w Authorization Key Generation App");
printf("\nwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww\n");


    printf("-> KEY1: First number\n\t");
    for(Z=0;Z<20;Z++)
    {
        printf("%02X",rnum1[Z]);
    }



    printf("\n-> KEY2: Second number\n\t");
    for(Z=0;Z<20;Z++)
    {
        printf("%02X",rnum2[Z]);
    }

    genSHA(rnum1, rnum2);

    printf("\n-> HASH: Result number\n\t");

    for(Z=0;Z<20;Z++)
    {
        printf("%02X",g_sha_gen_hash[Z]);
    }

    printf("\n\n");

    return 0;

}

Java代码:

public class Main
 {public static void main(String[] args) 
{
byte[] rnum1 = new byte[]{
(byte)0x67, (byte)0x96, (byte)0x01, (byte)0x9F, (byte)0x2F, (byte)0xFB, (byte)0xD3, (byte)0xBF, (byte)0x2C, (byte)0x13, (byte)0x99, (byte)0x80, (byte)0x50, (byte)0x41, (byte)0x45, (byte)0x81, (byte)0x6B, (byte)0xC8, (byte)0x8A, (byte)0x4F
};

byte[] rnum2 = new byte[]{
(byte)0x23, (byte)0x89, (byte)0xB3, (byte)0xBD, (byte)0xBD, (byte)0x9A, (byte)0xEC, (byte)0x84, (byte)0xAC, (byte)0x34, (byte)0x4F, (byte)0x68, (byte)0xDD, (byte)0x6F, (byte)0x02, (byte)0x12, (byte)0x23, (byte)0x6A, (byte)0x5B, (byte)0x8F
};

byte[] expected = new byte[]{
(byte)0xE7, (byte)0x68, (byte)0xD3, (byte)0xA8, (byte)0x43, (byte)0xC0, (byte)0x88, (byte)0x40, (byte)0xB0, (byte)0x5B, (byte)0x89, (byte)0x19, (byte)0x06, (byte)0x37, (byte)0x9F, (byte)0x45, (byte)0xBE, (byte)0x3D, (byte)0xB5, (byte)0xA2
};

 byte[] result = genSHA(rnum1, rnum2);

        System.out.println(result.equals(expected));
    }

    static byte[] genSHA(byte[] vec1, byte[] vec2)
 {
        int tmp, tmp1, tmp2, ft, wtt, kt = 0;
        byte k, m;
        int[] wt = new int[16];
        int[] data1 = new int[5];
        m = 0;

        for (k = 0; k < 5; k++)
 {
            data1[k] = ((int) vec1[m]) << 24;
            m++;
            data1[k] = ((int) vec1[m]) << 16;
            m++;
            data1[k] = ((int) vec1[m]) << 8;
            m++;
            data1[k] = ((int) vec1[m]);
            m++;
        }


        int tA = ((int) vec2[0]) << 24;
        tA |= ((int) vec2[1]) << 16;
        tA |= ((int) vec2[2]) << 8;
        tA |= ((int) vec2[3]);
        int tB = ((int) vec2[4]) << 24;
        tB |= ((int) vec2[5]) << 16;
        tB |= ((int) vec2[6]) << 8;
        tB |= ((int) vec2[7]);
        int tC = ((int) vec2[8]) << 24;
        tC |= ((int) vec2[9]) << 16;
        tC |= ((int) vec2[10]) << 8;
        tC |= ((int) vec2[11]);
        int tD = ((int) vec2[12]) << 24;
        tD |= ((int) vec2[13]) << 16;
        tD |= ((int) vec2[14]) << 8;
        tD |= ((int) vec2[15]);
        int tE = ((int) vec2[16]) << 24;
        tE |= ((int) vec2[17]) << 16;
        tE |= ((int) vec2[18]) << 8;
        tE |= ((int) vec2[19]);


        for (k = 0; k < 5; k++) 

       {
            wt[k] = data1[k];
            wt[k + 5] = data1[k];
            wt[k + 10] = data1[k];
        }

          wt[15] = data1[4];

        for (k = 0; k < 80; k++) 
               `enter code here`
        {

            tmp1 = tA >> 27;
            tmp2 = tA << 5;
            tmp2 |= tmp1;

            if (k < 20) {
                ft = (tB & tC) | ((~tB) & tD);
            } else if ((k >= 20) && (k < 40)) {
                ft = tB ^ tC ^ tD;
            } else if ((k >= 40) && (k < 60)) {
                ft = (tB & tC) | (tB & tD) | (tC & tD);
            } else {
                ft = tB ^ tC ^ tD;
            }

            if (k < 16) {
                wtt = wt[k];
            } else {
                wtt = wt[13] ^ wt[8] ^ wt[2] ^ wt[0];
                if ((wtt&0x80000000) > 1) {
                    wtt = wtt << 1;
                    wtt |= 0x00000001;
                } else {
                    wtt = wtt << 1;
                }

                wt[0] = wt[1];
                wt[1] = wt[2];
                wt[2] = wt[3];
                wt[3] = wt[4];
                wt[4] = wt[5];
                wt[5] = wt[6];
                wt[6] = wt[7];
                wt[7] = wt[8];
                wt[8] = wt[9];
                wt[9] = wt[10];
                wt[10] = wt[11];
                wt[11] = wt[12];
                wt[12] = wt[13];
                wt[13] = wt[14];
                wt[14] = wt[15];
                wt[15] = wtt;
            }

            if (k == 0) {
                kt = 0x5A827999;
            } else if (k == 20) {
                kt = 0x6ED9EBA1;
            } else if (k == 40) {
                kt = 0x8F1BBCDC;
            } else if (k == 60) {
                kt = 0xCA62C1D6;
            }

            tmp = tmp2 + ft + wtt + kt + tE;

            tE = tD;
            tD = tC;
            tC = (tB >> 2) | (tB << 30);
            tB = tA;
            tA = tmp;

        }

        byte[] g_sha_gen_hash = new byte[20];

        g_sha_gen_hash[0] = (byte) ((tA >> 24) & 0x000000FF);
        g_sha_gen_hash[1] = (byte) ((tA >> 16) & 0x000000FF);
        g_sha_gen_hash[2] = (byte) ((tA >> 8) & 0x000000FF);
        g_sha_gen_hash[3] = (byte) (tA & 0x000000FF);

        g_sha_gen_hash[4] = (byte) ((tB >> 24) & 0x000000FF);
        g_sha_gen_hash[5] = (byte) ((tB >> 16) & 0x000000FF);
        g_sha_gen_hash[6] = (byte) ((tB >> 8) & 0x000000FF);
        g_sha_gen_hash[7] = (byte) (tB & 0x000000FF);

        g_sha_gen_hash[8] = (byte) ((tC >> 24) & 0x000000FF);
        g_sha_gen_hash[9] = (byte) ((tC >> 16) & 0x000000FF);
        g_sha_gen_hash[10] = (byte) ((tC >> 8) & 0x000000FF);
        g_sha_gen_hash[11] = (byte) (tC & 0x000000FF);

        g_sha_gen_hash[12] = (byte) ((tD >> 24) & 0x000000FF);
        g_sha_gen_hash[13] = (byte) ((tD >> 16) & 0x000000FF);
        g_sha_gen_hash[14] = (byte) ((tD >> 8) & 0x000000FF);
        g_sha_gen_hash[15] = (byte) (tD & 0x000000FF);

        g_sha_gen_hash[16] = (byte) ((tE >> 24) & 0x000000FF);
        g_sha_gen_hash[17] = (byte) ((tE >> 16) & 0x000000FF);
        g_sha_gen_hash[18] = (byte) ((tE >> 8) & 0x000000FF);
        g_sha_gen_hash[19] = (byte) (tE & 0x000000FF);

        return g_sha_gen_hash;
    }

}

C程序输出:

-> KEY1: First number 6796019F2FFBD3BF2C139980504145816BC88A4F
-> KEY2: Second number 2389B3BDBD9AEC84AC344F68DD6F0212236A5B8F
-> HASH: Result number E768D3A843C08840B05B891906379F45BE3DB5A2

0 个答案:

没有答案