在tinyos-2.x中使用TinyECC时出现SHA1错误

时间:2014-08-04 05:04:32

标签: sha tinyos

我正在使用TinyOS-2.1.2并实现安全技术我正在使用TinyECC-2.0。我想使用tinyecc中提供的SHA1。但是,当我拿一个值的哈希说,

uint8_t data = 123;

我使用SHA1.nc中给出的sha的三个函数,即SHA1.reset,SHA1.update和SHA1.digest来获取结果。但每次我运行代码即。做"制作micaz sim"我得到相同数据的不同哈希结果。

如何为每个采集的数据获取唯一的哈希值?

代码是:

#include "sha1.h"

module DisseminationC {
  uses {
            interface SHA1;
}
implementation{

void hash(){

uint8_t x=123;

call SHA1.context(context);
call SHA1.update(context, x, sizeof(x));
call SHA1.digest(context, Message_Digest[SHA1HashSize]);

dbg("All", "%s Hash is : %d \n", sim_time_string(), Message_Digest);
}

我在代码中进行了修改,如下所示。现在,我得到一个哈希输出。但问题是,对于输入的每个不同的数字,我得到相同的答案。我该如何解决这个问题?

请帮帮我..

#include "sha1.h"

module SecurityC{

    uses interface Boot;
    uses interface SHA1;
}

implementation{

    uint8_t Message_Digest[SHA1HashSize];
    SHA1Context context;
    uint8_t num=123;
    uint32_t length=3;
    uint8_t i;

    event void Boot.booted()
    {
        dbg("Boot", "Application booted.\n");

        call SHA1.reset(&context);
        while(length>0)
        {
            length=length/10;
            call SHA1.update(&context, &num, length);
        }
            call SHA1.digest(&context, Message_Digest);
            for(i = 0; i < SHA1HashSize; i++) {
                dbg("Boot", "%s KEY IS: %x \n", sim_time_string(), Message_Digest[i]);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先,你的代码很糟糕。它没有两个大括号,函数SHA1.context在这个库中不存在(我认为它应该是SHA1.reset)。此外,Message_Digestcontext尚未声明。请提供您实际使用的完整代码。

但是,我发现你至少有两个严重的错误。

首先,您将x的值传递给SHA1.update,但是您应该传递指向该消息的指针。因此,该函数处理位于内存中地址123的消息(您应该收到编译器警告)。如果要根据x的值计算哈希值,请尝试以下操作:

call SHA1.update(context, &x, sizeof(x));

其次,Message_Digest似乎是uint8_t大小为SHA1HashSize的数组。在最后一个语句中,您打印一个指向此数组而不是其内容的指针(同样,编译器应警告您),因此您将在内存中获得此数组的地址。您可能希望循环处理数组:

uint8_t i;
for(i = 0; i < SHA1HashSize; ++i) {
    // process Message_Digest[i], for instance print it
}