openssl ssl加密

时间:2010-03-30 00:32:55

标签: encryption ssl openssl

我想讨论一下openssl写和读方法。
假设我有如下数据结构:

/-----------------------------------------------------\
|  my_header   |  PAYLOAD                             |
\-----------------------------------------------------/
       |                              |
      \ /                            \ /
 not encrypted                      encrypted

I think the proper algorithm would be like this :
   SEND:
   build my_header with my own header.
   encrypt PAYLOAD with encryption function
   attach my_header and PAYLOAD (encrypted) to one buffer
   send it using common POSIX function just like send or sendto
   RECV:
   using common POSIX function just like recv or recvfrom.
   extract my_header and PAYLOAD(encrypted)
   decrypt PAYLOAD with decryption function
   at last i got my_header and PAYLOAD(decrypted).

如果您遇到上述问题,您的方法如何?由于openssl加密了发送到SSL_write函数(CMIIW)的所有数据。

感谢。

也许,适当的问题是,在openssl中可以用来加密/解密PAYLOAD的加密和解密函数是什么?

4 个答案:

答案 0 :(得分:2)

你实际上可以让OpenSSL为你做很多繁重的工作。

您可以像以前一样创建网络原语,并将文件描述符与Open SSL上下文相关联,Open SSL上下文将处理SSL握手,加密和解密。我正在浏览很多细节,但是在openssl网站和本书中的示例代码:

http://www.amazon.com/Network-Security-OpenSSL-John-Viega/dp/059600270X

非常有启发性。这本书也可以在线获取,但我相信你必须付费才能访问它。

在OpenSSL的发行版中,您可以找到大量示例代码,说明如何执行此操作。

祝你好运。

答案 1 :(得分:2)

OpenSSL附带一个libcrypto库,通常用于在SSL上下文之外执行独立加密。

http://www.openssl.org/docs/crypto/evp.html

或者,库的生物部分可能更接近您想要的: http://www.openssl.org/docs/crypto/bio.html

但是如果你真的打算通过网络发送这个,那么我会质疑保留未加密标题的安全性。加密不仅仅是隐私,还涉及确保数据在传输过程中未被修改。如果某人能够监控您的流量,那么他们通常也可以篡改它。

如果您希望标头未加密,以便您可以在wireshark中读取它以进行调试,那么我建议您在应用程序中创建一个标志,以完全启用/禁用加密以在调试环境中使用。

答案 2 :(得分:0)

如果你正在构建一个加密协议,那就是我的做法,假设my_header包含足够的信息而且本身不需要保持安全,例如会话密钥。低级别的网络数据包(参见tcpdump / libpcap)只是一个char *(“字符串”),你通过沿着不同长度的数组移动来提取不同的标题 - 你建议的声音就像这样。

答案 3 :(得分:0)

当您使用TLS / DTLS时,您可以选择:您对整个帧进行加密,或者根本不加密。

如果你想在框架中有一些未加密的数据,那么你可能不需要TLS / DTLS。但是,您可以使用OpenSSL计算标头的哈希值(使用SHA或任何其他相关的哈希算法),并在帧的末尾添加它以避免篡改。

对于帧的加密部分,您必须在symetric和asymetric密码算法之间进行选择。但是在不知道你想要达到什么目标的情况下,我无法就此提出建议。

请记住,对称算法通常更快,但首先需要密钥交换。为此,您可以使用不对称算法,但是,您将重新发明TLS / DTLS;)