ファイルのSHA1値を取得したい
亜 2013/4/6(Sat) 12:52:26|NO.53471
HSPにはMD5値を取得できる命令がありますが、衝突する可能性のあるものを作っているため
ファイルのSHA1を取得したいです。
http://d.hatena.ne.jp/As_hsp/20091205/1259992330
上を参考にして作ってみたのですが、わからないことが2つあります。
1. コメントの「%X」→「%08X」 「先頭が0が来た場合、0が消えてしまい」
なぜ、"0"ではなく、"08"なのか。
2. 以下が作ってみたコードですが、7MBのMP3ファイルを選択してみたところ
結果が全く間違っていました。
#module
#uselib "advapi32.dll"
#cfunc CryptAcquireContext "CryptAcquireContextA" sptr,sptr,sptr,sptr,sptr
#cfunc CryptCreateHash "CryptCreateHash" sptr,sptr,sptr,sptr,sptr
#cfunc CryptHashData "CryptHashData" sptr,sptr,sptr,sptr
#cfunc CryptGetHashParam "CryptGetHashParam" sptr,sptr,sptr,sptr,sptr
#func CryptDestroyHash "CryptDestroyHash" sptr
#func CryptReleaseContext "CryptReleaseContext" sptr,sptr
#define HP_HASHVAL $00000002
#define PROV_RSA_FULL $00000001
#define CRYPT_VERIFYCONTEXT $F0000000
#define CRYPT_MACHINE_KEYSET $00000020
#define global ctype GetHash_SHA1(%1, %2) GetHash(%1, %2, $00008004)
#defcfunc GetHash var _pData, int _dwLen, int _Algid, local l1, local l2, local l3, local Algid, local hProv, local hHash, local pbHash, local dwHashLen
if CryptAcquireContext(varptr(hProv), 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET) {
if CryptCreateHash(hProv, _Algid, 0, 0, varptr(hHash)) {
if CryptHashData(hHash, varptr(_pData), _dwLen, 0) {
if CryptGetHashParam(hHash, HP_HASHVAL, 0, varptr(dwHashLen), 0) {
dim pbHash, dwHashLen/4
if CryptGetHashParam(hHash, HP_HASHVAL, varptr(pbHash), varptr(dwHashLen), 0) {
l3 = ""
foreach pbHash
l1 = strf("%08X", pbHash(cnt))//とりあえず修正
l2 = ""
repeat strlen(l1)/2
l2 = strmid(l1, cnt*2, 2) + l2
loop
l3 += l2
loop
CryptDestroyHash Hhash
CryptDestroyHash hProv
return l3
}
}
}
}
}
CryptDestroyHash Hhash
CryptDestroyHash hProv
return 0
#global
//↑ SHA1取得命令
//ファイル読み込み
dialog "",16
notesel myfiledata:noteload refstr:noteunsel
//結果表示
mes "SHA1 : "+GetHash_SHA1(myfiledata,strlen(myfiledata))
stop
何がおかしいのでしょうか?
ご教授をよろしくお願いします。
# むしろHSPに標準命令としてほしい気がします
どこぞのだれか 2013/4/6(Sat) 13:09:07|NO.53472
GetHash_SHA1(myfiledata,strlen(myfiledata))
^^^^^^
↑ですが、strlenだとファイルサイズを取得出来ません。(ヌル文字(00)までのサイズになる)
そのため、strsizeを使用してください。
http://hsp.tv/play/pforum.php?mode=pastwch&num=8201#8221
のellerさんが詳しく書かれています。
どこぞのだれか 2013/4/6(Sat) 13:17:18|NO.53473
1.について
hspのstrf関数の機能で、8桁に揃えるために%08Xとします。
0xABCD20が、
%Xだと、ABCD20に、
%08Xだと、00ABCD20になります。
詳しくは、
・http://www.google.co.jp/search?q=hsp+strf にアクセスする
・エディタにstrfと入力してF1キーを押す
などして調べてください。
亜 2013/4/6(Sat) 13:38:39|NO.53474
なるほど、16進を最小文字数8で出力するためなのですね。
どこぞのだれかさん、ありがとうございました。
以下でできました
dialog "",16:myfile_path=refstr
exist myfile_path:myfile_size=strsize
notesel myfiledata:noteload myfile_path:noteunsel
dialog "SHA1 : "+GetHash_SHA1(myfiledata,myfile_size)
#strsizeのことすっかり忘れていました、ドジですw