我正在使用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]);
}
}
}
答案 0 :(得分:0)
首先,你的代码很糟糕。它没有两个大括号,函数SHA1.context
在这个库中不存在(我认为它应该是SHA1.reset
)。此外,Message_Digest
和context
尚未声明。请提供您实际使用的完整代码。
但是,我发现你至少有两个严重的错误。
首先,您将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
}