当前位置:编程学习 > VC++ >>

vc++网络安全编程范例(14)-openssl bio编程

 

OpenSSL整个软件包大概可以分成三个主要的功能部分:密码算法库、SSL协议库以及应用程序。OpenSSL的目录结构自然也是围绕这三个功能部分进行规划的。

 

   作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

 

BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。

 

 

 

我们来用VC++实现使用各种source/sink类型bio的例子程序,请见代码实现与注释讲解

 

 

#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; 

#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

 &n

补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,