md5deep是一套跨平台的方案,计算和比较MD5等哈希加密信息的摘要(MD5, SHA-1, SHA-256, Tiger,Whirlpool)。
主要的功能:
可以递归检查整个目录树
可以接受已知的哈希值,并把它们比作一组输入文件的列表。
当处理非常大的文件时就会产生的时间估计!
散列输入文件中的任意大小的块
可以处理只有某种类型的文件
项目(release-4.0.0)目录如图:
安装方式(以Ubuntu 6.10 Edgy为例):
$ sudo apt-get install md5deep
计算aaa目录下所有档案的MD5并存成aaa.md5:
$ md5deep -l -r aaa > aaa.md5
同上, 但是以binary方式计算:
$ md5deep -k -l -r aaa > aaa.md5
比对 *.iso 挡的MD5是否跟 xxx.md5 里的MD5是否一样, 并列出比对无误的档案:
$ md5deep -m xxx.md5 *.iso
同上, 但列出比对时发现错误的档案:
$ md5deep -x xxx.md5 *.iso
同上, 但列出比对时发现错误的档案时也一并列出该档的MD5:
$ md5deep -X xxx.md5 *.iso
同上, 但比对过程中显示进度:
$ md5deep -e -X xxx.md5 *.iso
其他参数可下 md5deep -h或info md5deep查看说明.
main代码:
int main( int argc, char *argv[] ) { FILE *f; int i, j; char output[65]; context_sha256_t ctx; unsigned char buf[1000]; unsigned char sha256sum[32]; if( argc < 2 ) { printf( "\n SHA-256 Validation Tests:\n\n" ); for( i = 0; i < 3; i++ ) { printf( " Test %d ", i + 1 ); // sha256_starts( &ctx ); if( i < 2 ) { sha256_update( &ctx, (uint8_t *) msg[i], strlen( msg[i] ) ); } else { memset( buf, 'a', 1000 ); for( j = 0; j < 1000; j++ ) { sha256_update( &ctx, (uint8_t *) buf, 1000 ); } } sha256_finish( &ctx, sha256sum ); for( j = 0; j < 32; j++ ) { sprintf( output + j * 2, "%02x", sha256sum[j] ); } if( memcmp( output, val[i], 64 ) ) { printf( "failed!\n" ); return( 1 ); } printf( "passed.\n" ); } printf( "\n" ); } else { if( ! ( f = fopen( argv[1], "rb" ) ) ) { perror( "fopen" ); return( 1 ); } sha256_starts( &ctx ); while( ( i = fread( buf, 1, sizeof( buf ), f ) ) > 0 ) { sha256_update( &ctx, buf, i ); } sha256_finish( &ctx, sha256sum ); for( j = 0; j < 32; j++ ) { printf( "%02x", sha256sum[j] ); } printf( " %s\n", argv[1] ); } return( 0 ); }
学习的目标是成熟!~~~