zoukankan      html  css  js  c++  java
  • openssL在linux eclipse下使用的完整过程-附截图和测试程序

    一、安装

    首先下载openssL的原始文件包,例如openssl-1.0.1f.tar.gz

    将该文件复制到工作区目录下,一般是/home下的个人文件夹

    解压文件tar zxvf  openssl-1.0.1f.tar.gz

    进入文件内 cd  openssl-1.0.1f

    配置,将生成的openssL文件复制到系统默认的文件夹下,该步骤只要复制下面的代码就可以了:”./config --prefix=/usr/local/openssl shared”

    执行make命令:make

    使用root权限,安装openssL:sudo make install

    至此,openssL安装完成。完成的目录中有两个比较重要,一个是include包,里面都是外部调用时可以查阅的.h头文件,另一个是lib包,里面有ssl和crypto的静态和共享文件包。第二步的配置,主要是配置这两个文件。

    二、在eclipse中配置的方法

    在eclipse中必须配置include和lib两个变量。

    新建一个C语言测试工程,例如openssL_test,右键-属性-C/C++ Build-设置,然后单击图中右侧第一个红框,也就是GCC  C Compiler 下的include,做如下设置,这里的path就是上面include的位置。

    然后单击GCC C  Linker 下的libraries ,做如下设置:


    ssl和crypto是用户手动加上去的,但不是随意写的,其实这两个变量对应着/usr/local/openssl/lib目录下的libssl.so和libcrypto.so文件。

    另外要注意,如果建的工程为C++类型,上图中还会有一个G++的编译器设置选项,设置方式与GCC的一样就可以。

    三,编写一个测试方法

    新建一个C测试文件.然后复制如下的代码:

    #include <stdio.h>
    #include <string.h>


    #include "openssl/evp.h"
    #include "openssl/x509.h"

    //加密函数
    int Encrypt_File()
    {
    unsignedchar key[EVP_MAX_KEY_LENGTH]; //保存密钥的数组
    unsignedchar iv[EVP_MAX_KEY_LENGTH]; //保存初始化向量的数组
    EVP_CIPHER_CTXctx; //EVP加密上下文环境
    unsignedchar out[1024]; //保存密文的缓冲区
    intoutl;
    unsignedchar in[1024]; //保存原文的缓冲区
    intinl;
    intrv;
    inti;
    FILE*fpIn;
    FILE*fpOut;
    //打开待加密文件
    fpIn= fopen("mikejin.txt","rb");
    if(fpIn==NULL)
    {
    return-1;
    }
    //打开保存密文的文件
    fpOut= fopen("mikejmw.txt","wb");
    if(fpOut==NULL)
    {
    fclose(fpIn);
    return-1;
    }
    //设置key和iv
    for(i=0;i<24;i++)
    {
    key[i]=i;
    }
    for(i=0;i<8;i++)
    {
    iv[i]=i;
    }

    //初始化ctx
    EVP_CIPHER_CTX_init(&ctx);
    //设置密码算法、key和iv
    rv= EVP_EncryptInit_ex(&ctx,EVP_des_ede3_cbc(),NULL,key,iv);
    if(rv!= 1)
    {
    printf("Err ");
    return-1;
    }
    //循环读取原文,加密后后保存到密文文件。
    for(;;)
    {
    inl= fread(in,1,1024,fpIn);
    if(inl<= 0)//读取原文结束
    break;
    rv= EVP_EncryptUpdate(&ctx,out,&outl,in,inl);//加密
    if(rv!= 1)
    {
    fclose(fpIn);
    fclose(fpOut);
    EVP_CIPHER_CTX_cleanup(&ctx);
    return-1;
    }
    fwrite(out,1,outl,fpOut);//保存密文到文件
    }
    //加密结束
    rv= EVP_EncryptFinal_ex(&ctx,out,&outl);
    if(rv!= 1)
    {
    fclose(fpIn);
    fclose(fpOut);
    EVP_CIPHER_CTX_cleanup(&ctx);
    return-1;
    }
    fwrite(out,1,outl,fpOut); //保密密文到文件
    fclose(fpIn);
    fclose(fpOut);
    EVP_CIPHER_CTX_cleanup(&ctx); //清除EVP加密上下文环境
    printf("加密已完成 ");
    return1;
    }


    //解密函数
    int Decrypt_File()
    {
    unsignedchar key[EVP_MAX_KEY_LENGTH]; //保存密钥的数组
    unsignedchar iv[EVP_MAX_KEY_LENGTH]; //保存初始化向量的数组
    EVP_CIPHER_CTXctx; //EVP加密上下文环境
    unsignedchar out[1024+EVP_MAX_KEY_LENGTH]; //保存解密后明文的缓冲区数组
    intoutl;
    unsignedchar in[1024]; //保存密文数据的数组
    intinl;
    intrv;
    inti;
    FILE*fpIn;
    FILE*fpOut;

    //打开待解密的密文文件
    fpIn= fopen("mikejmw.txt","rb");
    if(fpIn==NULL)
    {
    return-1;
    }
    //打开保存明文的文件
    fpOut= fopen("mikejout.txt","wb");
    if(fpOut==NULL)
    {
    fclose(fpIn);
    return-1;
    }
    //设置key和iv
    for(i=0;i<24;i++)
    {
    key[i]=i;
    }
    for(i=0;i<8;i++)
    {
    iv[i]=i;
    }

    //初始化ctx
    EVP_CIPHER_CTX_init(&ctx);
    //设置解密的算法、key和iv
    rv= EVP_DecryptInit_ex(&ctx,EVP_des_ede3_cbc(),NULL,key,iv);
    if(rv!= 1)
    {
    EVP_CIPHER_CTX_cleanup(&ctx);
    return-1;
    }
    //循环读取原文,解密后后保存到明文文件。
    for(;;)
    {
    inl= fread(in,1,1024,fpIn);
    if(inl<= 0)
    break;
    rv= EVP_DecryptUpdate(&ctx,out,&outl,in,inl);//解密
    if(rv!= 1)
    {
    fclose(fpIn);
    fclose(fpOut);
    EVP_CIPHER_CTX_cleanup(&ctx);
    return-1;
    }
    fwrite(out,1,outl,fpOut);//保存明文到文件
    }
    //解密结束
    rv= EVP_DecryptFinal_ex(&ctx,out,&outl);
    if(rv!= 1)
    {
    fclose(fpIn);
    fclose(fpOut);
    EVP_CIPHER_CTX_cleanup(&ctx);
    return-1;
    }
    fwrite(out,1,outl,fpOut);//保存明文到文件
    fclose(fpIn);
    fclose(fpOut);
    EVP_CIPHER_CTX_cleanup(&ctx);//清除EVP加密上下文环境
    printf("解密已完成 ");
    return1;
    }

    int main()
    {
    inti;
    intj;
    OpenSSL_add_all_algorithms();

    printf("|-------请您选择的服务类型--------| ");
    printf("| | ");
    printf("| 1:加密 2:解密 3:退出 | ");
    printf("| | ");
    printf("|---------------------------------| ");
    printf("请输入选择:");
    scanf("%d",&i);


    switch(i)
    {
    case1: Encrypt_File(); break;
    case2: Decrypt_File(); break;
    case3: exit(0); break;
    default:
    printf(" 输入错误,请重新输入");
    }

    return0;
    }


     

    要正确运行上面的代码,有几点需要注意:

    1新建三个文件mikejin.txt 、mikejmw.txt和mikejout.txt,在第一个文件里随便输入一些内容,第二个文件是执行加密后的结果,第三个文件是执行解密后的结果,比较第一个和第三个文件,可以查看加解密是否有问题。

    2.此时编译一般是可以通过的,但是eclipse会显示EVP_MAX_KEY_LENGTH等openssL自定义的变量和函数找不到,这不是错误,但是一直有红色的错号,让人很不爽。方法是将include下的openssL文件包整体复制到工程目录下,此时,eclipse根据#include "openssl/evp.h"和#include"openssl/x509.h"两个定义就会找到对应的变量,从而没有了错误。但要注意,这一部操作只是为了让自己看代码时舒服一下而已,前面的操作才是关键。

    【【附】】

    如果还不行怎么办?如果编译可以通过,但是执行Debug下的"./openssL_test" 时显示找不到两个so文件怎么办?能够编译说明openssl已经装好,而且eclipse编译时已经正确识别了。执行时找不到,是因为执行时默认的*.so.0.0.1两个文件路径为/usr/lib。因此将“/usr/local/openssl/lib”下的libcrypto和libssl的几个文件都复制到“/usr/lib”下即可
    ————————————————
    版权声明:本文为CSDN博主「纵横千里,捭阖四方」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/xueyushenzhou/article/details/22808629

    人生有些关口非狠狠的斗一下不可,不能为了混口饭吃而自甘蹉跎。
  • 相关阅读:
    dotnet core 获取 MacAddress 地址方法
    dotnet core 获取 MacAddress 地址方法
    dotnet core 发布只带必要的依赖文件
    dotnet core 发布只带必要的依赖文件
    Developing Universal Windows Apps 开发UWA应用 问答
    Developing Universal Windows Apps 开发UWA应用 问答
    cmd 如何跨驱动器移动文件夹
    cmd 如何跨驱动器移动文件夹
    C++ 驱动开发 error LNK2019
    C++ 驱动开发 error LNK2019
  • 原文地址:https://www.cnblogs.com/djiankuo/p/14674051.html
Copyright © 2011-2022 走看看