最近信息安全的老师布置了一个基于openssl的实验给我们,虽然之前我写过一篇博客,讲的是如何不经过编译直接使用openssl.exe获取ssl证书,不过这次的实验的要求是输入明文,输出经过加密后的密码,所以感觉还是有些内容可以讲,于是就在这里分享给大家。
我选择的平台是乌班图16.04 64位。首先是openssl库的下载、编译。由于liunx自带了openssl,所以我们只需要查看自带的openssl库的版本,并记下它所在的位置,输入openssl version -a,结果如下
在输出内容的末尾我们可以看到openssl库所在的位置
接下来安装codeblocks,先进入管理员身份,然后依次进行下面的操作
第一步,安装基本的编译环境
apt-get install build-essential
apt-get install gdb
第二步,安装codeblocks
apt-get install codeblocks
apt-get install codeblocks-dbg
接下来,有些教程上有apt-get install wxformbuilder这一步,但又有一些教程上说这一步不是必要的,如果你想要执行这一步的话,直接运行之前的安装代码是没有用的,至少在我这里是这样子的,命令行提示定位不到软件包,
所以我就选择去百度wxformbuilder,然后找到了wxformbuilder的github,github上的提示如下
可以根据这上面的提示进行操作,不过我在make config=release这一步时,先出现了下面这个错误
它提示ticpp.h不存在,这时,我们可以去网上找ticpp.h,之后我也会把它上传到csdn,获得到ticpp.h后,我们把它放到/usr/include和/usr/local/include这两个路径下面,第一个问题就解决了。不过之后又会报一个/usr/local/include/x86_64-linux-gun不是目录的错误,解决这个错误的办法是在对于的目录下新建对应名称的文件夹。不过我到这里就没有继续了,相当于我还是跨过了安装wxformbuilder这步
接下来是安装wxWidgets,这一步中途出来很多的问题,大部分是apt-get找不到教程上的安装包,我老师给我的教程这一步是这样子的
$sudo apt-get install libwxbase2.8
$sudo apt-get install libwxbase2.8-dev
$sudo apt-get install libwxgtk2.8-0
$sudo apt-get install libwxgtk2.8-dev
$sudo apt-get install libwxgtk2.8-dbg
$sudo apt-get install wx-common
$sudo apt-get install wx2.8-headers
$sudo apt-get install wx2.8-i18n
经过我的摸索,直接像下面几张图片上所示进行操作就可以了,我就直接上图了,毕竟,有图有真相
接下来就可以打开codeblocks连接openssl了
首先在新建一个空白项目
建立完成之后,会在左侧的workspace中看到,这里我对项目命名为openssl
右键点击项目,选择build options,之后会出现如示对话框
左侧选择Debug,右侧点击Linker settings
在Linker settings的左下方点击add
在里面输入dl后确定。同样的方式添加ssl,crypto。然后将三个全部选中,点击右下方Copy selected to,选择Release后确定
再选择Search directories—>Compiler,点击左下方的Add
点击右侧的…,这里要选择之前查看openssl版本时看到的openssl路径,然后点击确定。选中之前添加的路径,点击右侧Copy to,如下图,再选择Release然后确定。再点击Search directories –>Linker
点击左下方add,分别添加/usr/local/ssl/lib和usr/lib,添加完后全部选中点击右侧下方Copy to …,选择release后确定。在最后确定之后,链接完毕。
接下来,我们在openssl项目上新建一个c文件,点击右上角有加号的按钮
选择project,选择files,建立一个c源码文件
文件中的代码如下所示
#include <openssl/des.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv)
{
unsigned char *keystring = "需要加密的内容";
DES_cblock key;
DES_key_schedule key_schedule;
#if 1 //生成一个 key
DES_string_to_key(keystring, &key);
if (DES_set_key_checked(&key, &key_schedule) != 0) {
printf("convert to key_schedule failed.\n");
return -1;
}
#else
//生成一个key,但不检查key
memcpy(key, "password", 8);
DES_set_key_unchecked(&key, &key_schedule);
#endif
//需要加密的字符串
unsigned char input[] = "this is a text being encrypted by openssl";
size_t len = (sizeof(input)+7)/8 * 8;
unsigned char *output = malloc(len+1);
//IV
DES_cblock ivec;
//IV设置为0x0000000000000000
memset((char*)&ivec, 0, sizeof(ivec));
//加密
DES_cbc_encrypt(input, output, sizeof(input), &key_schedule, &ivec, DES_ENCRYPT);
//输出加密以后的内容
int i;
for (i = 0; i < len; ++i)
printf("%02x", output[i]);
printf("\n");
memset((char*)&ivec, 0, sizeof(ivec));
//解密
DES_cbc_encrypt(output, input, len, &key_schedule, &ivec, 0);
printf("%s\n", input);
free(output);
return EXIT_SUCCESS;
}
点击build & run 如果提示什么路径不存在的话,到对应路径下去新建对应的目录。我遇到的问题是”/usr/local/include/x86_64-linux-gun”
不是一个 目录。这个问题在之前安装wxformbuilder时就遇到过,看了是祸躲不过。。。但/usr/local/下有一个文件也叫include,而且貌似还是一个比较重要的配置文件,如果直接新建一个同名文件夹的话,会报错,所以我的解决方案是先把它隐藏起来,再建立include/x86_64-linux-gun路径就不会有问题了,最后运行结果如示
至此,大功告成。
或许上面的步骤看起来很繁琐,实际操作起来也会出现各种各样文章中没有提到的问题,不过遇见问题多多百度总会解决的。如有纰漏或者不清楚的地方欢迎大家在下方评论区中指出,阿里嘎多。