私は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 *’
2つのOpenSSLの初期化関数の呼び出し*警告を、私はあなたが本当に古いバージョンを使用していると信じて、 OpenSSLのOS X上でおそらくOpnSSL 0.9.8?ライブラリの更新を検討することをお勧めします。 – jww
@jww - Debianで 'libssl-dev'バージョン' 1.0.1t-1 + deb7u1'を使っています。 –