1

openssl/sha.h から sha1() 関数を動作させることに取り組んでいますが、ランダムな出力といくつかの警告が表示されます。かなりの量のコードを読み、いくつかのサンプル コードを試しましたが、すべてで警告が表示され、正しく表示されません。

コードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <openssl/sha.h>

int main() 
{ 
const unsigned char data[] = "Hello, World";
unsigned long length = sizeof(data);
unsigned char  hash[SHA_DIGEST_LENGTH];
SHA1(data, length, hash);
printf("%02x \n", hash);
return 0;

}

以下は私が得ている警告です:

sha.c: In function ‘main’:
sha.c:12: warning: ‘SHA1’ is deprecated (declared at /usr/include/openssl/sha.h:124)
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type   ‘unsigned char *’
sha.c:13: warning: format ‘%02x’ expects type ‘unsigned int’, but argument 2 has type ‘unsigned char *’

実行すると出力が得られます: 62652b34

どんな助けでも素晴らしいでしょう!

4

3 に答える 3

2

また、すべてを理解するまでにしばらく時間がかかりました。最善の方法は、EVP を使用することです。EVP は、ほぼすべての汎用関数を提供します。

#include <openssl/evp.h>

ハッシュ関数を呼び出す前に、この im main を呼び出す必要があります。ハッシュを初期化します。そうしないと、openssl はアルゴリズムが利用できないと文句を言います。

OpenSSL_add_all_algorithms();

modeは文字列として "SHA256"、"SHA512"、"SHA1" でなければなりません。 dataToHashは入力、dataSizeは入力のサイズ、 outHashedは既に割り当てられている必要があり、ハッシュはそこに書き込まれます

unsigned int hash(const char *mode, const char* dataToHash, size_t dataSize, unsigned char* outHashed) {
    unsigned int md_len = -1;
    const EVP_MD *md = EVP_get_digestbyname(mode);
    if(NULL != md) {
        EVP_MD_CTX mdctx;
        EVP_MD_CTX_init(&mdctx);
        EVP_DigestInit_ex(&mdctx, md, NULL);
        EVP_DigestUpdate(&mdctx, dataToHash, dataSize);
        EVP_DigestFinal_ex(&mdctx, outHashed, &md_len);
        EVP_MD_CTX_cleanup(&mdctx);
    }
    return md_len;
}

使用例 (これはテストされていません。上記のコードを C++ ラッパーで使用しています)

const char *inData = "test data2";
unsigned char outHash[20]; // output is already allocated
hash("SHA1", inData, 10, outHash);

非推奨になっている SHA1 メソッドを直接使用しないでください (次のバージョンでコードが壊れる可能性があります)。あなたのバージョンを使用したい場合は、各文字を 16 進数として出力する必要があります。

int i;
for(i=0; i<SHA_DIGEST_LENGTH; i++) {
    printf("%02x", hash[i]);
}
于 2013-01-12T07:49:13.573 に答える
1

そのようにバッファ全体をダンプすることはできません。以下のようにループする必要があります。出力に対して取得している値は、実際にはバッファーのアドレスでありhash、これは明らかに探しているものではありません。バッファ内の16進バイトをテキストとしてダンプしたい

そう...

int main()
{
    const unsigned char data[] = "Hello, World";
    unsigned long length = sizeof(data);
    unsigned char hash[SHA_DIGEST_LENGTH];
    SHA1(data, length, hash);

    int i=0;
    for (;i< sizeof(hash)/sizeof(hash[0]);++i)
        printf("%02x \n", hash[i]);

    return 0;

}

警告に関しては、試みている暗号操作 (SHA1) を実行するにはこのインターフェイスが古くなっているため、非推奨になっています。現在の OpenSSL には新しいインターフェースがあります。具体的にはEVPインターフェースを検討してください。

于 2013-01-12T07:46:03.060 に答える
0
printf("%02u \n", hash);

unsigned char を出力して警告を削除する

于 2013-01-12T07:38:13.670 に答える