我想讨论一下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的加密和解密函数是什么?
答案 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;)