我的C程序在Keccak实现中打印0xE而不是0x0E

时间:2014-11-01 18:54:26

标签: c hash printing hex keccak

我正致力于Keccak(SHA-3)的实现,例如我得到了这个:

Keccak(“abc”)= 3A985DA74FE225B2 4 5C172D6BD390BD855F 8 6E3E9D525B46BFE24511431532

而不是(根据:http://www.di-mgt.com.au/sha_testvectors.html

3A985DA74FE225B2的 04 5C172D6BD390BD855F的 08 6E3E9D525B46BFE24511431532

正如您所看到的,我的程序错过了“0x00”而且我不确定我做错了什么。

对不起,伙计们,这是我的主要方法代码:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdlib.h>
#include <string.h>
#include "round.h"
#include "keccak.h"
#define TAM_MAX_ENTRADA 4096 /*Especificacion del numero de caracteres de la entrada*/
int main(int argc, char *argv[])
{

    int32_t sha3Tipo; /*Nos dice el tipo de SHA3*/
    char Mensaje[TAM_MAX_ENTRADA]; /*Array de caracteres donde guardamos el mensaje de  entrada*/
    printf("Elige el tamaño de salida (224,256,384,512): "); 
    scanf("%d",&sha3Tipo);
    if(argc == 1)
    {
        strcat(Mensaje,""); /*Si no nos han pasado argumentos significa que es un string vacio*/
    }
    else
    {
        strcpy(Mensaje,argv[1]); /*Copiamos la primera palabra en el array de caracteres*/
    }

    for(int32_t i = 2; i<argc; i++)
    {
        strcat(Mensaje," "); /*Si tenemos mas de una palabra entonces anadimos */
        strcat(Mensaje,argv[i]);
    }
    int32_t size = strlen(Mensaje);
    int32_t *psize = &size;
    uint8_t *newmessage;

    newmessage=keccak((uint8_t *)Mensaje, *psize, sha3Tipo);
    printf("Keccak(\"%s\") = ",Mensaje);
    for(int32_t i =0; i<sha3Tipo/8; i++)
    {   
        printf("%X", *(newmessage+i));
    }
    printf("\n");

    return 0;
}

1 个答案:

答案 0 :(得分:3)

在将数字转换为十六进制字符串时,也许您会丢失前导零?例如,请考虑the following code

#include <stdio.h>
int main(int argc, char *argv[])
{
    printf("Without formatting: %x and %x\n", 12, 99);
    printf("With formatting: %02x and %02x\n", 12, 99);
    return 0;
}

运行时,输出为:

  

没有格式化:c和63   格式化:0c和63

我认为您的48应该是0408,但它们的格式不正确。