首页 > 编程知识 正文

ecdsa的公钥可以用来加密吗,rsa的加密和解密原理

时间:2023-05-06 21:31:53 阅读:170087 作者:4712

有关实现sha256的详细信息。

序言1、计算文件的摘要错了吗? 二、问题在哪里? 1 .算法问题。 2 .文件大小。 1 .数据源不同。 2 .换行有问题。 3 .大文件摘要

前篇介绍了sha256的简单使用方法,之后在实际使用中遇到了一些问题,所以追加一章。

一、计算文件的摘要错了吗? 我当时为了先应对sha256的需求,取得的sha256和网络上的一样也可以。 之后,我试着计算了一下大的文件摘要,这时出现了问题。 不管怎么操作,一直和网络的合不来,烦恼了很久。 经过长时间研究,终于想好了。

二、问题在哪里? 1 .算法问题?

2 .文件大小问题?

3 .最终计算的源数据问题?

1 .算法问题把文件计算错了,我一开始就觉得是不是安装有问题,所以我去看了网上的文章。 但是,最终的结果没有几个差异,方法都一样。 其他大人物没有遇到这个问题吗? 用EVP实现了,但不符合我们讨论的范畴。 而且通过上一篇文章,我觉得我的实现应该离不开八九十,所以先把这一点放一放,研究文件大小的问题。

2 .文件大小1 .既然数据源错了,那就从小文件开始实现吧。 首先,为一个测试文件实现sha256。 如果文件包含“1”字符,测试结果将如下所示:

./$ a.out hhh.cf1 b2f 662800122 bed 0f 255693 df 89 c 4487 FB DCF 453 d 3524 a42 d4ec 20 c 3d9c 04与此在线站点相比出现了问题。 试着在命令行上处理吧

$ sha256sum hhh.cf1 b2f 662800122 bed 0f f 255693 df 89 c 4487 FB DCF 453 d 3524 a42 d4ec 20 c 3d9c 04 hhh.c//然后, 将$ openssldgst-sha 256-hex-outgetsha 256 hhh.c $ catgetsha 256 sha 256 (hhh.c )=f1 B2 f 662800122 bed 0f 255693 bed 0f 255693 bed 0f 25693 用hexdump试试吧:

$ hex dump-chhh.c 000000310 d0a|1 .|0000003此时发现了问题。 我只是输入了“1”。 为什么后面会跟着“0d”、“0a”?

可能有几个编辑器的机制,但首先我会尝试消除这些多余的字符。

$ hex dump-chhh.c 000000031|1|00000001//这次把数据源处理干净了。 尝试继续计算sha256。

$ ./a.out hhh.c 6b 86 b 273 ff 34 FCE 19 d 6b 804 eff 5a3 f 5747 ad a4e aa 22 f1 d 49 c01 e 52 DDB 7875 b $ sha256sum hh.c 6b 86 b 273 ff 34 FCE 19 d 6b 804 eff 5a37804=6b86b 273 ff 34 FCE 19 d 6b 804 eff 5a3 f 5747 ad a4e aa 22 f1 d 49 c01 e 52 DDB 7875 b4b此处验证并反向证明了由于数据源导致的以前的sha256不匹配。 我现在的算法是正确的。

然后,研究结果显示,编辑文件时,vi或vim会自动在末尾添加换行符。 在关闭自动加换行就能避免这个问题中,如何配置读者可以自行修改配置文件vimrc。

我们的算法已经正确,将继续加大数据进行验证。

$ hex dump-chhh.c 00000003131313131313131313131313111111111|* 00000034 $./a.out hhh.ca 53234 b0C3 CCA 0a 1cd aff 4d9C2 af 30 eecb 28256 e 80 c 43 c 9707 AC 07 ADC 048 d 231 $ sha256sum hhh.ca 53234 b0C3 CCA 0a 1cd aff 4d9C2 af 30 d

这次也是正确的,开始换行吧。

2 .由于换行符出现问题,开始换行符数据源。

$ hex dump-chhh.c 000000313131313131313131313131313131311111111111|00000

10 31 31 31 31 31 31 31 31 31 31 31 0d 0a 31 31 31 |11111111111..111|00000020 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 |1111111111111111|*00000036./a.out hhh.c fdcc414611e4b0fde5e761d0701b22bb38e69b4a89beaaf2afe8060b1eb904ce $ sha256sum hhh.c fdcc414611e4b0fde5e761d0701b22bb38e69b4a89beaaf2afe8060b1eb904ce hhh.c


  又出现问题,我还是第一反应是数据源出问题了,应该线上的键入有问题,他可能没有换行之类的。。。所以我换了个读取文件的线上工具。

  与我预感结果一致。所以还是出现数据源问题,那。。我我就不用线上的工具了,直接用指令计算的sha256来进行对比比较好,大家在验证自己的算法的时候最好也用指令来验证,如下指令:

sha256sum DataSourceFileName----------------------------openssl dgst -sha256 -hex -out outfile DataSourceFileName----------------------------(选以上两条中的一条来验证即可,其中dgst的指令格式大家网上搜一下就好,有很多教程,这里不赘述)  3.大文件摘要

  接下来对一个大文件进行摘要生成,如下,文件有差不多50MB。

$ ll test.bin -rwxr--r-- 1 root root 50552832 4月 27 14:46 test.bin*$ sha256sum test.bin 7deb7b0c7e3780d896238cab8fe9363747ad66f7e8f9d0d691380d902a4f9184 test.bin$ openssl dgst -sha256 -hex -out outfile test.bin $ cat outfile SHA256(test.bin)= 7deb7b0c7e3780d896238cab8fe9363747ad66f7e8f9d0d691380d902a4f9184 $ ./a.out test.bin 7deb7b0c7e3780d896238cab8fe9363747ad66f7e8f9d0d691380d902a4f9184

  这次验证是OK的,但是后来我再对一个更大的文件验证时出现了错误,我一直找不到原因。

  我查了一些资料,各有千秋,后来我翻到了openssl库中的sha256实现.代码如下(sha.c):

int main(int argc, char **argv){ int i, err = 0; FILE *IN; if (argc == 1) { do_fp(stdin); } else { for (i = 1; i < argc; i++) { IN = fopen(argv[i], "r"); if (IN == NULL) { perror(argv[i]); err++; continue; } printf("SHA(%s)= ", argv[i]); do_fp(IN); fclose(IN); } } exit(err);}void do_fp(FILE *f){ SHA_CTX c; unsigned char md[SHA_DIGEST_LENGTH]; int fd; int i; unsigned char buf[BUFSIZE]; fd = fileno(f); SHA_Init(&c); for (;;) {//这里采用的循环方法跟我的有点差别 i = read(fd, buf, BUFSIZE); if (i <= 0) break; SHA_Update(&c, buf, (unsigned long)i); } SHA_Final(&(md[0]), &c); pt(md);}

  然后下面是我自己的算法(对比上面的do_fp)

int sha256Bigfile(const char *filepath, unsigned char *md){FILE* fp = NULL;SHA256_CTX ctx;unsigned int len = 1924;size_t gl = 0;char buf[len+1];memset(buf, 0, len);fp = fopen(filepath, "rb");if (fp == NULL) {printf("Can't openn");return -1;}SHA256_Init(&ctx);while(!feof(fp)){memset(buf, 0, len+1);gl = fread(buf, 1, 1024,fp);if (gl <= 0) break;SHA256_Update(&ctx, buf,(unsigned long)gl);}SHA256_Final(md, &ctx);fclose(fp);printf256(md);return 0;}

  两者相比其他部分都大同小异,最大的差一点在for与while循环,我将自己换成了for就没有问题了,假如你在使用过程中也概率性出现这个问题,那你可以试试调整。
  这是我自己的github代码,有兴趣的可以拉下来自己调一调,openssl的库的构建你可以看我的前面章节。代码中还涉及到算法了效率问题的验证,大家可以研究一下。

总结

1.你计算的源数据不一定是你想计算的。
2.线上的工具仅供参考,真正有意义的可以使用指令来验证。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。