我试图为摘要生成一个大文件。 当我在openssl rand 8096下面使用时head -c 8096> rnddata,没关系。
./ hash_test sha1
摘要是:a0a4dab4a16d247fb625ca2abf07373d2123e4a5
openssl dgst -sha1 rnddata
SHA1(rnddata)= a0a4dab4a16d247fb625ca2abf07373d2123e4a5
但是当rnddata的大小等于或大于9000时,摘要结果会有所不同。
openssl rand 9000 | head -c 9000> rnddata
openssl dgst -sha1 rnddata
SHA1(rnddata)= 4ef5b73ee39f0f2ac6d341c55467c182786cab65
./hash_test sha1
摘要是:691747a97aee32ddf04b3bf5644b5d74c4b69657
以下是我的测试代码
#include <stdio.h>
#include <openssl/evp.h>
main(int argc, char *argv[])
{
EVP_MD_CTX mdctx;
const EVP_MD *md;
FILE *fr;
size_t bytes;
char mystring[32];
fr = fopen("/home/root/rnddata", "r");
if(fr == NULL)
printf("Error opening file\n");
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;
OpenSSL_add_all_digests();
//OpenSSL_add_all_algorithms();
if(!argv[1]) {
printf("Usage: mdtest digestname\n");
exit(1);
}
//md = EVP_get_digestbyname(argv[1]);
md = EVP_sha1();
if(!md) {
printf("Unknown message digest %s\n", argv[1]);
exit(1);
}
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, md, NULL);
while ((bytes = fread (mystring, 1, 32, fr)) != 0)
EVP_DigestUpdate(&mdctx, mystring, bytes);
EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
EVP_MD_CTX_cleanup(&mdctx);
printf("Digest is: ");
for(i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
fclose(fr);
}
感谢任何帮助。
答案 0 :(得分:0)
我已经测试了您的代码,它可以正常运行:
for i in $( seq 1 100 ); do
openssl rand 9000 | head -c 9000 > test
YOUR=$( ./sha1 test | cut -b 12- )
SHA1=$( openssl dgst -sha1 test | cut -b 13- )
if [ "$YOUR" == "$SHA1" ]; then
echo $YOUR OK
else
echo $YOUR $SHA1 FAIL
fi
done
也适用于长度8000,9100,10000。
测试了您的第二个代码,这似乎也能正常工作。这是我编写的修改版本,通过在命令行上提供名称来测试不同的文件:
#include <stdio.h>
#include <openssl/sha.h>
int main(int argc, char **argv)
{
unsigned char c[SHA_DIGEST_LENGTH];
int i;
FILE *inFile = fopen (argv[1], "rb");
SHA_CTX shaContext;
int bytes;
unsigned char data[1024];
if (inFile == NULL) {
printf ("%s can't be opened.\n", argv[1]);
return 0;
}
SHA1_Init (&shaContext);
while ((bytes = fread (data, 1, 1024, inFile)) != 0)
{
printf("Read %d bytes\n", bytes);
SHA1_Update (&shaContext, data, bytes);
}
SHA1_Final (c,&shaContext);
for(i = 0; i < SHA_DIGEST_LENGTH; i++)
printf("%02x", c[i]);
printf (" %s\n", argv[1]);
fclose (inFile);
return 0;
}
如何编译代码时会产生错误的结果。
我在内核3.4.6 x86_64上使用gcc version 4.7.1 20120723 [gcc-4_7-branch revision 189773] (SUSE Linux)
进行了检查。
我修改了上面的代码以打印有关其操作的一些信息。我用一个由9000个零(dd if=/dev/zero of=/tmp/zeroes bs=1 count=9000
)组成的文件进行了测试,得到了:
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 808 bytes
980eb7886d6d6ce206b9ce5371042d32c96d2714 /tmp/zeroes
如果块大小匹配,那么我们将尝试打印所有字节的总和(应该总是为零),或者一次检查一个字节的缓冲区。
如果您拥有与我相同的SHA1,我们将尝试使用9000 0x80的序列。
答案 1 :(得分:0)
我已经测试了这两个代码以及命令行。 以下是我的测试结果。
root@am335x-evm:~# openssl rand 9000 | head -c 9000 > rnddata
root@am335x-evm:~# ./hash_test sha1
Digest is: 691747a97aee32ddf04b3bf5644b5d74c4b69657
root@am335x-evm:~# ./sha1_test
691747a97aee32ddf04b3bf5644b5d74c4b69657 rnddata
root@am335x-evm:~# openssl dgst -sha1 rnddata
SHA1(rnddata)= 4ef5b73ee39f0f2ac6d341c55467c182786cab65
答案 2 :(得分:0)
我在Ubuntu 10.04上测试了我的代码。 命令行和C代码之间的结果是相同的。
gary@ubuntu:~/crypto$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.3-4ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-plugin --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
gary@ubuntu:/usr/local/ssl/bin$ ./openssl
OpenSSL> version
OpenSSL 1.0.0a 1 Jun 2010
OpenSSL> ^C
gary@ubuntu:/usr/local/ssl/bin$ ./openssl
OpenSSL> dgst -sha1 /home/gary/crypto/rnddata
SHA1(/home/gary/crypto/rnddata)= 34c7dd77ce6fbc56875bca2bd916f42464b9bab0
gcc sha1_test.c -o h1 -I/usr/local/ssl/include -L/usr/local/ssl/lib -l
gary@ubuntu:~/crypto$ ./h1 rnddata
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 1024 bytes
Read 808 bytes
34c7dd77ce6fbc56875bca2bd916f42464b9bab0 rnddata