如何使用ed25519-donna进行哈希处理

时间:2014-02-24 21:36:04

标签: hash ed25519

我为某些编程问题而道歉,但我想确保我正确地使用这个库加密。

我设法实现了ed25519-donna,除了哈希数据以进行签名。

据我所知,这是散列数据的函数:

void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);

但我无法弄清楚* hash是什么。我非常确定*ininlen是要散列的数据及其长度。

这是SHA512特有的吗?

如何用ed25519-donna散列?


程序挂起

我使用ed25519-donna-master/ed25519.o和OpenSSL标记-lssl -lcrypto编译。密钥生成,签名和验证功能按预期工作。

它正在运行而没有错误,但应用程序挂起在这些行上,并且核心没有以100%运行,所以我认为它没有忙于处理:

extern "C"
{
  #include "ed25519-donna-master/ed25519.h"
  #include "ed25519-donna-master/ed25519-hash.h"
}
#include <openssl/rand.h>

unsigned char* hash;
const unsigned char* in = convertStringToUnsignedCharStar( myString );
std::cout << in << std::endl;
std::cout << "this is the last portion output and 'in' outputs correctly" << std::endl;
ed25519_hash(hash, in, sizeof(in) );
std::cout << hash << std::endl;
std::cout << "this is never output" << std::endl;   

如何修改此代码以便ed25519_hash能够正常运行?无论hashinunsigned char*还是uint8_t*,它的工作方式都相同。

对于uint8_t*,我使用了以下代码:

uint8_t* hash;
const uint8_t* in = reinterpret_cast<const uint8_t*>(myString.c_str());

1 个答案:

答案 0 :(得分:3)

“......但我无法弄清楚什么是*哈希。”

uint8_t *hash是调用函数后将包含结果哈希的缓冲区(unsigned char *)。

所以,你正在寻找一个需要3个参数(也称为参数)的函数:

  1. 用于保存结果哈希的uint8_t *缓冲区,
  2. 要散列的输入数据,
  3. 要散列的输入数据的长度。
  4. “这是SHA512特有的东西吗?”

    不,这是常规的C源。但我认为你对文档有点困惑。它声明......

    If you are not compiling against OpenSSL, you will need a hash function.
    …
    To use a custom hash function, use -DED25519_CUSTOMHASH
    when compiling ed25519.c and put your custom hash implementation
    in ed25519-hash-custom.h. The hash must have a 512bit digest and
    implement
    …
    void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen);
    

    因此,除非您没有针对OpenSSL进行编译并实现自己的哈希函数,否则您将不需要此函数。看看你的代码,你正在编译OpenSSL,这意味着你正在玩错误的函数。

    “怎么能用ed25519-donna哈希?”

    使用库提供的功能。

    您的问题让我想知道您是否向下滚动到the readme的“用法”部分,因为它完全回答了您的问题并告诉您要使用哪些功能。

    为方便起见,请允许我指出您需要遵循的文档部分,以及使用ed25519-donna找到散列,签名,验证等所需功能的部分:

      

    要使用该代码,请链接ed25519.o -mbits和:

    #include "ed25519.h"
    
         

    使用OpenSSL时添加-lssl -lcrypto(有些系统没有       需要-lcrypto?这可能是反复试验。

         

    要生成私钥,只需从安全加密源生成32个字节:

    ed25519_secret_key sk;
    randombytes(sk, sizeof(ed25519_secret_key));
    
         

    要生成公钥:

    ed25519_public_key pk;
    ed25519_publickey(sk, pk);
    
         

    签署留言:

    ed25519_signature sig;
    ed25519_sign(message, message_len, sk, pk, signature);
    
         

    验证签名:

    int valid = ed25519_sign_open(message, message_len, pk, signature) == 0;
    
         

    批量验证签名:

    const unsigned char *mp[num] = {message1, message2..}
    size_t ml[num] = {message_len1, message_len2..}
    const unsigned char *pkp[num] = {pk1, pk2..}
    const unsigned char *sigp[num] = {signature1, signature2..}
    int valid[num]
    
    /* valid[i] will be set to 1 if the individual signature was valid, 0 otherwise */
    int all_valid = ed25519_sign_open_batch(mp, ml, pkp, sigp, num, valid) == 0;
    
         

    ...

    如你所见,它就在那里......只需按照文档说明。