0

我正在使用 TinyOS-2.1.2,为了实现安全技术,我正在使用 TinyECC-2.0。我想使用 tinyecc 中可用的 SHA1。但是,当我取一个值的哈希值时,

uint8_t 数据=123;

我使用 SHA1.nc 中给出的 sha 的三个函数,即 SHA1.reset、SHA1.update 和 SHA1.digest 来获取结果。但每次我运行代码,即。做“make 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]);
        }
    }
}
4

1 回答 1

0

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

但是,我看到您至少有两个严重的错误。

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

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

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

uint8_t i;
for(i = 0; i < SHA1HashSize; ++i) {
    // process Message_Digest[i], for instance print it
}
于 2014-08-04T18:19:48.963 回答