2

对于提出一些编程问题,我深表歉意,但我想确保我以加密方式正确使用了这个库。

除了散列签名数据之外,我已经设法实现了 ed25519-donna 。

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

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

但我无法弄清楚 *hash 是什么。我相当确定*in并且inlen是要散列的数据及其长度。

它是 SHA512 特有的吗?

如何使用 ed25519-donna 进行哈希计算?


程序挂起

我已经使用ed25519-donna-master/ed25519.oOpenSSL flags 进行了编译-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正常工作?无论是hashand inareunsigned char*还是uint8_t*s,它的工作方式都是一样的。

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

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

1 回答 1

3

“……但我不知道 *hash 是什么。”</h2>

uint8_t *hash就是调用函数后将包含结果哈希的缓冲区(无符号字符*)。

因此,您正在查看一个需要 3 个参数(也称为参数)的函数:

  1. 保存结果哈希的uint8_t *缓冲区,
  2. 要散列的输入数据,
  3. 要散列的输入数据的长度。

“它是 SHA512 特有的吗?”</h2>

不,它是常规的 C 源代码。但是我认为您对文档有些困惑。它指出……</p>

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 进行哈希计算?”</h2>

通过使用库提供的功能。

您的问题让我想知道您是否向下滚动到自述文件的“<strong>Usage”部分,因为它完全回答了您的问题并告诉您要使用哪些功能。

为了您的方便,让我指出您需要遵循的文档部分,以及在哪里可以找到使用 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;

…</p>

如您所见,一切都在其中……只需按照文档进行操作即可。

于 2014-02-24T22:19:36.500 回答