オープンソースなSHA256ハッシュを求める為のクラス(とプログラム)です.
結構前に某ソフトで使う為に書きました.
C++ディレクトリを探索してたら見つけたので公開します.
どんなソフトのどんな部分にでも,自由に使ったり参考にしていただいて構いません.
VC.NET 2003とgcc4でコンパイルできる事を確認しています.
失敗しても,(long longが使えない環境とかだと)sha256.hのコメントを読めば*1直る事があるかもです.
C++的なプログラムの書き方の勉強にはなりませんので,注意.
それと,私が最初に実装したSHA-256ライブラリも見つかったので置いておきます.
コードはこっちの方が読みやすいので,仕様をコードに落とせなくて困っている方はどうぞ.
sha256_simple.cpp
コマンドラインで使う事になります.
ファイルを読み込ませて求める
sha256 file
か,直接文字列を入力する.
sha256 -s string
になります.引数無しで実行すると,標準入力から読み込みます(テストして無いけれど...)
> ll a.out -rwxr-xr-x 1 safii safii 7120 Feb 28 19:29 a.out > ll /sbin/sha256 -r-xr-xr-x 4 root wheel 9412 Sep 14 18:50 /sbin/sha256実行ファイルのサイズはBSDの物より小さいです(ぉ.
使用報告やバグ報告,どこそこを修正すると早くなるかも等がありましたら是非教えてください.
void SHA256::CalcIntermediateHash(){
i_^=1;
i_1^=1;
u_32 x[8];
memcpy(x, H[i_1], 32);
int T1, T2;
int t;
#define ROUND(n,a,b,c,d,e,f,g,h) \
T1=x[h]+S256_1(x[e])+Ch(x[e],x[f],x[g])+K[t+n]+W[t+n]; \
T2=S256_0(x[a])+Maj(x[a],x[b],x[c]); \
x[d]=x[d]+T1; \
x[h]=T1+T2
for(t=0; t<64; t+=8){
ROUND(0,0,1,2,3,4,5,6,7);
ROUND(1,7,0,1,2,3,4,5,6);
ROUND(2,6,7,0,1,2,3,4,5);
ROUND(3,5,6,7,0,1,2,3,4);
ROUND(4,4,5,6,7,0,1,2,3);
ROUND(5,3,4,5,6,7,0,1,2);
ROUND(6,2,3,4,5,6,7,0,1);
ROUND(7,1,2,3,4,5,6,7,0);
}
H[i_][0]=x[0]+H[i_1][0];
H[i_][1]=x[1]+H[i_1][1];
H[i_][2]=x[2]+H[i_1][2];
H[i_][3]=x[3]+H[i_1][3];
H[i_][4]=x[4]+H[i_1][4];
H[i_][5]=x[5]+H[i_1][5];
H[i_][6]=x[6]+H[i_1][6];
H[i_][7]=x[7]+H[i_1][7];
}