zoukankan      html  css  js  c++  java
  • Linux下C语言使用openssl库进行加密

      在这里插一小节加密的吧,使用openssl库进行加密。

      使用MD5加密

      我们以一个字符串为例,新建一个文件filename.txt,在文件内写入hello ,然后在Linux下可以使用命令md5sum filename.txt计算md5值 ==> b1946ac92492d2347c6235b4d2611184  。虽然写入的是hello这5个字符,但是我们使用命令xxd filename.txt后可以看出文件结尾处会有个0x0a这个回车符。所以在下面的代码中才会有 。

     1 //打开/usr/include/openssl/md5.h这个文件我们可以看到一些函数
     2 // 初始化 MD5 Contex, 成功返回1,失败返回0
     3 int MD5_Init(MD5_CTX *c);
     4 // 循环调用此函数,可以将不同的数据加在一起计算MD5,成功返回1,失败返回0
     5 int MD5_Update(MD5_CTX *c, const void *data, size_t len);
     6 // 输出MD5结果数据,成功返回1,失败返回0
     7 int MD5_Final(unsigned char *md, MD5_CTX *c);
     8 // MD5_Init,MD5_Update,MD5_Final三个函数的组合,直接计算出MD5的值
     9 unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);
    10 // 内部函数,不需要调用
    11 void MD5_Transform(MD5_CTX *c, const unsigned char *b);

      新建一个cpp文件用于计算MD5值

     1 #include <openssl/md5.h>
     2 #include <string.h>
     3 #include <stdio.h>
     4 
     5 int main()
     6 {
     7     MD5_CTX ctx;
     8     unsigned char outmd[16];
     9     int i=0;
    10 
    11     memset(outmd,0,sizeof(outmd));
    12     MD5_Init(&ctx);
    13     MD5_Update(&ctx,"hel",3);
    14     MD5_Update(&ctx,"lo
    ",3);
    15     MD5_Final(outmd,&ctx);
    16     for(i=0;i<16;i<i++)
    17     {
    18         printf("%02X",outmd[i]);
    19     }
    20     printf("
    ");
    21     return 0;
    22 }

      编译选项为: g++ MD5test.cpp -lssl -o MD5test

      运行后的结果为: B1946AC92492D2347C6235B4D2611184

      注意这里用到openssl库,可以运行 yum install openssl  和 yum install openssl-devel 进行安装。

      下面这个代码是对文件进行MD5计算。

     1 #include <openssl/md5.h>
     2 #include <string.h>
     3 #include <stdio.h>
     4 
     5 int main()
     6 {
     7     MD5_CTX ctx;
     8     unsigned char outmd[16];
     9     char buffer[1024];
    10     char filename[32];
    11     int len=0;
    12     int i;
    13     FILE * fp=NULL;
    14     memset(outmd,0,sizeof(outmd));
    15     memset(filename,0,sizeof(filename));
    16     memset(buffer,0,sizeof(buffer));
    17     printf("请输入文件名,用于计算MD5值:");
    18     scanf("%s",filename);
    19     fp=fopen(filename,"rb");
    20     if(fp==NULL)
    21     {
    22         printf("Can't open file
    ");
    23         return 0;
    24     }
    25 
    26     MD5_Init(&ctx);
    27     while((len=fread(buffer,1,1024,fp))>0)
    28     {
    29         MD5_Update(&ctx,buffer,len);
    30         memset(buffer,0,sizeof(buffer));
    31     }
    32     MD5_Final(outmd,&ctx);
    33 
    34     for(i=0;i<16;i<i++)
    35     {
    36         printf("%02X",outmd[i]);
    37     }
    38     printf("
    ");
    39     return 0;
    40 }

      运行得到结果后,我们可以使用md5sum命令进行验证。

      使用SHA1加密

       openssl里几个函数讲解

     1 //SHA1算法是对MD5算法的升级,计算结果为20字节(160位),使用方法如下:
     2 //打开/usr/include/openssl/sha.h这个文件我们可以看到一些函数
     3 // 初始化 SHA Contex, 成功返回1,失败返回0
     4 int SHA_Init(SHA_CTX *c);
     5 // 循环调用此函数,可以将不同的数据加在一起计算SHA1,成功返回1,失败返回0
     6 int SHA_Update(SHA_CTX *c, const void *data, size_t len);
     7 // 输出SHA1结果数据,成功返回1,失败返回0
     8 int SHA_Final(unsigned char *md, SHA_CTX *c);
     9 // SHA_Init,SHA_Update,SHA_Final三个函数的组合,直接计算出SHA1的值
    10 unsigned char *SHA(const unsigned char *d, size_t n, unsigned char *md);
    11 // 内部函数,不需要调用
    12 void SHA_Transform(SHA_CTX *c, const unsigned char *data);
    13 
    14 //上面的SHA可以改为SHA1,SHA224,SHA256,SHA384,SHA512就可以实现多种加密了

      我们对上面的程序进行修改

     1 #include <openssl/sha.h>
     2 #include <string.h>
     3 #include <stdio.h>
     4 
     5 int main()
     6 {
     7     SHA_CTX stx;
     8     unsigned char outmd[20];//注意这里的字符个数为20
     9     char buffer[1024];
    10     char filename[32];
    11     int len=0;
    12     int i;
    13     FILE * fp=NULL;
    14     memset(outmd,0,sizeof(outmd));
    15     memset(filename,0,sizeof(filename));
    16     memset(buffer,0,sizeof(buffer));
    17     printf("请输入文件名,用于计算SHA1值:");
    18     scanf("%s",filename);
    19     fp=fopen(filename,"rb");
    20     if(fp==NULL)
    21     {
    22         printf("Can't open file
    ");
    23         return 0;
    24     }
    25 
    26     SHA1_Init(&stx);
    27     while((len=fread(buffer,1,1024,fp))>0)
    28     {
    29         SHA1_Update(&stx,buffer,len);
    30         memset(buffer,0,sizeof(buffer));
    31     }
    32     SHA1_Final(outmd,&stx);
    33 
    34     for(i=0;i<20;i<i++)
    35     {
    36         printf("%02X",outmd[i]);
    37     }
    38     printf("
    ");
    39     return 0;
    40 }

      MD5有128bit(16个char)*SHA1有160bit(20个char)*SHA256有256bit(32个char)*SHA244有244bit(28个char)*SHA512有512bit(64个char).所以要注意修改大小哦:-O

      

      

  • 相关阅读:
    SharePoint 2013 配置启用搜索服务
    SharePoint 2013 安装图解
    SharePoint 2013 添加Ribbon菜单
    SharePoint 入门介绍
    SharePoint 2007 管理中心TimerJob”计时器作业定义”页面报错
    SharePoint 2007 单列表模糊查询SPD定制
    SharePoint 开发TimerJob 介绍
    SharePoint 搜索爬网第三方网站配置
    SharePoint 2013 配置开发环境,需安装VS2012插件
    SharePoint 2013 中将 HTML文件转换为母版页
  • 原文地址:https://www.cnblogs.com/wunaozai/p/3887009.html
Copyright © 2011-2022 走看看