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.oとOpenSSL 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機能させるにはどうすればよいですか? hashandinがs であるunsigned char*かどうかに関係なく、同じように機能しuint8_t*ます。

について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は、関数を呼び出した後の結果のハッシュを含むバッファー (unsigned char*) です。

つまり、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>

ライブラリが提供する機能を使用する。

あなたの質問は、readmeの「<strong>使用法」の部分までスクロールしたかどうか疑問に思います。なぜなら、それはあなたの質問に完全に答え、どの機能を使用するかを教えてくれるからです。

便宜上、従う必要があるドキュメントの部分と、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 に答える