滴水逆向联盟
标题: vc++网络安全编程范例(14)-openssl bio编程 [打印本页]
作者: 大灰狼 时间: 2014-7-9 08:36
标题: vc++网络安全编程范例(14)-openssl bio编程
OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。
作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。
我们来用VC++实现使用各种source/sink类型bio的例子程序,请见代码实现与注释讲解
[cpp] view plaincopy
- #include "commonlib.h"
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <openssl/crypto.h>
- #include <openssl/err.h>
-
- void printBuffer(const char* msg,BUF_MEM *buffer)
- {
- if(buffer->length<buffer->max)
- {
- buffer->data[buffer->length]=0;
- }
- printf("%s:[%s]\n",msg,buffer->data);
- }
-
- #define TESTFILENAME "testfilebio.txt"
-
- int main(int argc, char *argv[])
- {
- char testdata[]="a whole new world";
- char outdata[256];
- BIO *bio,*pair_0,*pair_1;
-
- BUF_MEM *buffer=NULL;
- void *databuffer=NULL;
-
- //建立一个读/写内存BIO
- bio = BIO_new(BIO_s_mem());
- BIO_get_mem_ptr(bio, &buffer);
- BIO_puts(bio, "Hello World;");
- printBuffer("bio内容:",buffer);
-
- //write some data into it
- BIO_write(bio,testdata,(int)strlen(testdata));
- int len=BIO_read(bio,outdata,sizeof(outdata));
- outdata[len]=0;
- printf("现在的内容是:%s\n",outdata);
- //建立一个只读内存BIO
- bio = BIO_new_mem_buf("这是一个只读的缓冲区", -1);
- //获取BIO中所指向的内存地址
- BIO_get_mem_ptr(bio, &buffer);
- printBuffer("在内存中的内容",buffer);
- //阻止当bio关闭时破坏内存段
- BIO_set_close(bio, BIO_NOCLOSE);
- BIO_free(bio);
- printBuffer("释放bio对象之后",buffer);
-
- //另外一种方式建立只读内存
- databuffer = malloc(4096);
- //也可以给databuffer中写入一些数据,然后再进行下一步。
- bio = BIO_new_mem_buf(buffer, 4096);
- BIO_free(bio);
-
- //文件相关的BIO
- //创建一个和标准输出关联的bio
- bio = BIO_new(BIO_s_file());
- BIO_set_fp(bio, stdout, BIO_NOCLOSE);
- BIO_printf(bio, "来自标准输出的消息\n");
- BIO_free(bio);
- //创建一个读/写文件bio,并且,当bio被释放时,关闭此文件。
- bio = BIO_new_file(TESTFILENAME, "w+");
- BIO_puts(bio, "Hello World;\n");
- //写一些数据当文件里去
- BIO_write(bio,testdata,(int)strlen(testdata));
- BIO_printf(bio,"\ntest printf to file:%s=%d\n","length of testdata",strlen(testdata));
- //必须将文件指针重置到头部,否则后面读不到数据。
- BIO_seek(bio,0L);
- len=BIO_read(bio,outdata,sizeof(outdata));
- outdata[len]=0;
- printf("===在文件中的内容[%s]====:\n%s"
- "=====================================\n",TESTFILENAME,outdata);
- BIO_free(bio);
-
- //BIO对
- pair_0= BIO_new(BIO_s_bio());
- BIO_set_write_buf_size(pair_0, 4096);
- pair_1 = BIO_new(BIO_s_bio());
- BIO_set_write_buf_size(pair_1, 4096);
- BIO_make_bio_pair(pair_0, pair_1);//组成BIO对
- //下面方式也可以,下面的语句等价于上面四句
- //BIO_new_bio_pair(&pair_0, 4096, &pair_1, 4096);//identical to above 4 lines
- BIO_write(pair_0,testdata,(int)strlen(testdata));
- memset(outdata,0,sizeof(outdata));
- len=BIO_read(pair_1,outdata,sizeof(outdata));
- outdata[len]=0;
- printf("=====从bio对中读取的数据:===\n%s"
- "\n================================\n",outdata);
-
- printf("\n click any key to continue.");
- getchar();
-
- return 0;
- }
欢迎光临 滴水逆向联盟 (http://dtdebug.com/) |
Powered by Discuz! X3.2 |