2016-12-12 16 views
3

私はsha256という最も単純な例をopenSSLライブラリを使ってC言語で書いています。opensslライブラリを使用したCのsha1の例

// compile with: gcc -o sha256 sha256.c -lcrypto 

#include <openssl/sha.h> 
#include <stdio.h> 
int main(int argc, char **argv) 
{ 
    unsigned char buffer[BUFSIZ]; 
    FILE *f; 
    SHA256_CTX ctx; 
    size_t len; 
    if (argc < 2) { 
     fprintf(stderr, "usage: %s <file>\n", argv[0]); 
     return 1; 
    } 

    f = fopen(argv[1], "r"); 
    if (!f) { 
     fprintf(stderr, "couldn't open %s\n", argv[1]); 
     return 1; 
    } 

    SHA256_Init(&ctx); 

    do { 
     len = fread(buffer, 1, BUFSIZ, f); 
     SHA256_Update(&ctx, buffer, len); 
    } while (len == BUFSIZ); 

    SHA256_Final(buffer, &ctx); 

    fclose(f); 

    for (len = 0; len < SHA256_DIGEST_LENGTH; ++len) 
     printf("%02x", buffer[len]); 
    putchar('\n'); 
    return 0; 
} 

sha1と同じものが必要ですが、実際に動作する同様の簡単な例は見つかりませんでした。上記のコードでSHA256の出現をSHA1に置き換える素朴なアプローチは(明らかに)機能しません。

SHA1のプログラムを変更するにはどうすればよいですか?

UPDATE

@dbushにより示唆されるように、私は彼のEVPコードを使用して、私のプログラムにそれを統合しています。私のプログラムは次のようになります。

#include <stdio.h> 
#include <openssl/sha.h> 
#include <openssl/evp.h> 
#include <openssl/err.h> 

int main(int argc, char **argv) 
{ 

FILE *f; 
size_t len; 
unsigned char buffer[BUFSIZ]; 

if (argc < 2) { 
    fprintf(stderr, "usage: %s <file>\n", argv[0]); 
    return 1; 
} 

f = fopen(argv[1], "r"); 

if (!f) { 
    fprintf(stderr, "couldn't open %s\n", argv[1]); 
    return 1; 
} 


EVP_MD_CTX hashctx; 
//EVP_MD *hashptr = EVP_get_digestbyname("SHA256"); 
EVP_MD *hashptr = EVP_get_digestbyname("SHA1"); 

EVP_MD_CTX_init(&hashctx); 
EVP_DigestInit_ex(&hashctx, hashptr, NULL)); 

do { 
    len = fread(buffer, 1, BUFSIZ, f); 
    EVP_DigestUpdate(&hashctx, buffer, len); 
} while (len == BUFSIZ); 

EVP_DigestFinal_ex(&hashctx, buffer, &len); 
EVP_MD_CTX_cleanup(&hashctx); 

fclose(f); 

int i; 
for (i = 0; i < len; ++i) 
    printf("%02x", buffer[i]); 

    return 0; 
} 

私はgcc -o evp evp.c -lcryptoを使用して、それをコンパイルすると、私はエラーのカップルを取得する、といった:

evp.c: In function ‘main’: 
evp.c:29:19: warning: initialization discards ‘const’ qualifier from pointer target type [enabled by default] 
evp.c:32:43: error: expected ‘;’ before ‘)’ token 
evp.c:32:43: error: expected statement before ‘)’ token 
evp.c:39:1: warning: passing argument 3 of ‘EVP_DigestFinal_ex’ from incompatible pointer type [enabled by default] 
In file included from evp.c:4:0: 
/usr/include/openssl/evp.h:574:5: note: expected ‘unsigned int *’ but argument is of type ‘size_t *’ 
+0

2つのOpenSSLの初期化関数の呼び出し*警告を、私はあなたが本当に古いバージョンを使用していると信じて、 OpenSSLのOS X上でおそらくOpnSSL 0.9.8?ライブラリの更新を検討することをお勧めします。 – jww

+0

@jww - Debianで 'libssl-dev'バージョン' 1.0.1t-1 + deb7u1'を使っています。 –

答えて

3

ではなくSHA1またはSHA256特定の機能を使用して、EVP_Digest*を使用します任意のハッシュで動作する関数ファミリ

... 

// makes all algorithms available to the EVP* routines 
OpenSSL_add_all_algorithms(); 
// load the error strings for ERR_error_string 
ERR_load_crypto_strings(); 

EVP_MD_CTX hashctx; 
//const EVP_MD *hashptr = EVP_get_digestbyname("SHA256"); 
const EVP_MD *hashptr = EVP_get_digestbyname("SHA1"); 

EVP_MD_CTX_init(&hashctx); 
EVP_DigestInit_ex(&hashctx, hashptr, NULL); 

do { 
    len = fread(buffer, 1, BUFSIZ, f); 
    EVP_DigestUpdate(&hashctx, buffer, len); 
} while (len == BUFSIZ); 

unsigned int outlen; 
EVP_DigestFinal_ex(&hashctx, buffer, &outlen); 
EVP_MD_CTX_cleanup(&hashctx); 

fclose(f); 

int i; 
for (i = 0; i < outlen; ++i) 
    printf("%02x", buffer[i]); 

簡潔さのためのエラーチェックは省略しました。エラーをチェックするには、次の手順を実行します。修正されている上記のコードでは、いくつかの誤りがありました

if (function_to_check() == 0) { 
    char errstr[1000]; 
    ERR_error_string(ERR_get_error(), errstr); 
    printf("error: %s\n", errstr; 
} 

EDITを

  • hashptrEVP_MD *宣言されましたが、今const EVP_MD *です。
  • EVP_DigestInit_ex呼び出しはEVP_DigestFinal_exに第三のパラメータは、具体的には必ずしも同じでなくてもよいunsigned int *代わりsize_t *を、与えられた端
  • に余分な括弧でした。
  • あなたは*「警告:初期化破棄 『のconst』修飾子...」が発生している場合は追加は、トップ
+0

ありがとうございます。欠落しているコードの残りを追加して、正確にコピーできるようにしてください。現時点では、プログラムにコードを貼り付けると(関連する部分を置換する)、私はいくつかのエラーが発生します。また、あなたはここに入力ミスがあると思います: 'for(i = 0; len

+0

@MartinVegter '#include 'と '#include 'が必要です。それ以外は、うまくいくはずです。そうでない場合は、関連するコードで質問を更新してください(または新しい質問を投稿してください)。 – dbush

+0

@MartinVegter私が最初に投稿したものにはいくつかの誤りがありました。私はサンプルコードを編集し、それが正しく動作することを確認しました。 – dbush

関連する問題