« SPEED HACKS | トップページ | Rubyその1 »

2007年8月18日 (土)

SHA1その2

SHA1の関数でうまくいかない話ですがこの前書いたエントリでは概要だけだったので、実際に何をやったのかを書いておきます。

ソースsha1test.cは、opensslのSHA1()関数を用いて、unsigned charの配列の中身のうち、指定されたバイト分を対象にSHA1アルゴリズムに掛け、求まったハッシュ値を20byteの配列に出力します。(詳細は$ man  SHA1してみてちょ)。

以下は、sha1test.cの中身を表示し、gccを用いてコンパイル・リンクを行い、引数に"hoge"をとって実行してした結果です。最後にecho コマンドと組み合わせてsha1sumコマンドに"hoge"文字列を入力した場合の結果を乗せています。

[lucy@fedora7 sha1test]$ cat sha1test.c 
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>
int main(int argc, char **argv){
  unsigned char *p_target = (unsigned char*)"hoge";//対象文字列
  unsigned char sha1hash[SHA_DIGEST_LENGTH];       //ダイジェスト
  size_t len = 0;
  int ii  = 0;
  if (argc > 1){ // 引数が与えられれば、それを対象文字列とする
    p_target = (unsigned char *)argv[1];
  }
  len = strlen((char *)p_target);       // 対象文字列の長さを計測
  printf("str=%s\n", (char *)p_target); // 対象文字列を表示
  printf("len=%d\n", len);              // 文字列長を表示

  SHA1(p_target, len, sha1hash);        // ダイジェストを計算

  // ダイジェストの値を16進で表示
  for( ii = 0; ii < SHA_DIGEST_LENGTH;ii++ ){
    printf("%02x", sha1hash[ii]);
  }
  putc('\n', stdout);  // 最後に改行を出力
  return 0;
}
[lucy@fedora7 sha1test]$ gcc -Wall -o sha1test sha1test.c -lssl
[lucy@fedora7 sha1test]$ ./sha1test hoge
str=hoge
len=4
31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c

[lucy@fedora7 sha1test]$ echo hoge | sha1sum
eefd5bc2c547bf82b177b6259c13f7723dc876d9  -
[lucy@fedora7 sha1test]$

となります。なんで、下の赤く書いた二行が異なってしまうのでしょう。。。何が悪いのでしょうか。。。というわけで、次回はJavaのMessageDigestクラスを使って実験してみようと思います。

2009/1/2追記:結局これは、「echo がデフォルトでは改行コードを出力する」のが問題でした。改行コードを出力しないようにしたら(echo -n)一致しました。

|

« SPEED HACKS | トップページ | Rubyその1 »

コメント

SHA1関数をCから使った例を求めてたどりつきました。

$ echo -n hoge | sha1sum
31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c -
$ php

^D
31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c

となるので、プログラム間違いじゃないようですよ。

Cソースは参考にさせていただきます^^

投稿: 通りすがり | 2008年12月20日 (土) 10時39分

しまった。PHPのをエスケープしてくれないんだ、ここ。

$ php
<?php echo sha1("hoge"); ?>
^D
31f30ddbcb1bf8446576f0e64aa4c88a9f055e3c

です。

投稿: 通りすがり | 2008年12月20日 (土) 10時42分

お返事遅くなりました。見にくいレイアウトですみません。
多少なりともお役に立てたようで幸いです。
また、phpでの検証ありがとうございました。
で、"echo -n"の問題ですが、お恥ずかしい話ですが、このエントリの時点ではechoがデフォルトで改行コードを出力することに気づいておりませんでした。次のエントリにて解決しておりましたが、リンクが無かったので、貼っておきます。また、レイアウトも直したいと思います。
http://lucy.moe-nifty.com/blog/2007/11/sha14_2755.html

投稿: るー | 2009年1月 2日 (金) 18時07分

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/207693/16152083

この記事へのトラックバック一覧です: SHA1その2:

« SPEED HACKS | トップページ | Rubyその1 »