我有一个用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