HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0406
ファイルのSHA1値を取得したい3解決


リンク

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



ONION software Copyright 1997-2023(c) All rights reserved.