C OpenSSL:在不使用SSL\u read()/SSL\u write()的情况下执行en-/解密

C OpenSSL:在不使用SSL\u read()/SSL\u write()的情况下执行en-/解密,c,network-programming,openssl,C,Network Programming,Openssl,我已经用C编写了一个基于事件的网络库,现在我想通过OpenSSL添加SSL/TLS支持。我不想使用SSL\u read()和SSL\u write(),而是希望OpenSSL只执行传出/传入数据的加密/解密,让我自己发送/接收数据 我不熟悉SSL/TLS和OpenSSL,因此: 有没有办法让OpenSSL只对char数组执行加密/解密 像size\u t SSL\u encrypt(const char*buf\u in,size\u t size\u in,char*buf\u out)这样的

我已经用C编写了一个基于事件的网络库,现在我想通过OpenSSL添加SSL/TLS支持。我不想使用
SSL\u read()
SSL\u write()
,而是希望OpenSSL只执行传出/传入数据的加密/解密,让我自己发送/接收数据

我不熟悉SSL/TLS和OpenSSL,因此:

有没有办法让OpenSSL只对
char
数组执行加密/解密


size\u t SSL\u encrypt(const char*buf\u in,size\u t size\u in,char*buf\u out)
这样的东西会很好。

完全按照您的要求是不可能的,因为使用TLS,在应用层发送内容和在网络套接字上发送内容之间没有1对1的对应关系。重新协商之类的事件意味着有时SSL需要从网络读取数据,以便在发送数据时取得进展,反之亦然

但是,您仍然可以使用OpenSSL来执行SSL,但要自己负责网络的读写。通过在
SSL
指针上调用
SSL\u set\u bio()
,而不是
SSL\u set\u fd()
,可以实现这一点:

  • 用于创建连接的BIO对。一个BIO将由SSL例程读取和写入,而另一个BIO将由应用程序读取和写入(允许应用程序通过所需的任何方法将数据传递到另一端)

  • 在新的SSL对象上使用,将读取和写入BIO设置为生成的对中的一个BIOs

  • 在对中的另一个BIO上使用
    BIO_read()
    BIO_write()
    ,读取和写入SSL协议数据

  • 在SSL对象上正常使用
    SSL\u accept()
    SSL\u connect()
    SSL\u read()
    SSL\u write()


  • (目前还不清楚这会给您的应用程序带来什么好处:在这种情况下,除了读写OpenSSL传递给您的内容外,您不能做任何事情,因此您最好让它也读写)。

    非常感谢caf,这是我第一次得到一个可以理解的关于BIOs应该如何使用的解释!正在为此添加+1!