TCP socket通信如何用ssl加密技术对数据包进行加密和解密?

leihelin5201314 2010-11-08 09:13:05
linux下C语言,请问下,
在客户端想服务器发送数据包的时候需要用ssl对数据包进行加密,服务端收到包要解密

哪位大牛能通俗点介绍下ssl加密和解密技术的原理?网上查的东西对我来说有些笼统,不明白···

给一个用ssl对数据包加密和解密的例子吧,大家光这样说的话我真不知道该怎么写,

谢谢!!
...全文
5182 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
leihelin5201314 2010-11-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lukygt 的回复:]

一般做的都是RSA+RC4的,通过rsa交换rc4密钥

1 C向S发TCP请求
2 S向C返回rsa公钥
3 C用RSA公钥加密RC4密钥发给S
4 开始用RC4通信
[/Quote]
没看明白···
我在网上找到一段C代码,找高手求解释···
如果我按照代码的思路去做是否可以····
#include<stdio.h>
#include<signal.h>
#include<openssl/err.h>
#include<openssl/ssl.h>

#define CERT_FILE
BIO *in =NULL;
void close_up()
{
if( in !=NULL)
BIO_free(in);
}
int main(argc,argv)
int argc;
char *argv[];
{
char *port=NULL;
BIO *ssl_bio,*tmp;
SSL_CTX *ctx;
SSL *ssl;
char buf[512];
int ret=1,i;
if(argc<=1)
port="*:4433";
else
port=argv[1];
signal(SIGINT,close_up);
SSL_load_error_strings();
#ifdef WATT32
debug_init();
sock_init();
#endif
/* Add ciphers and message digests */
OpenSSL_add_ssl_algorithms();
ctx=SSL_CTX_new(SSLv23_server_method());
if (!SSL_CTX_use_certificate_file(ctx,CERT_FILE,SSL_FILETYPE_PEM))
goto err;
if (!SSL_CTX_use_PrivateKey_file(ctx,CERT_FILE,SSL_FILETYPE_PEM))
goto err;
if (!SSL_CTX_check_private_key(ctx))
goto err;
/* Setup server side SSL bio */
ssl=SSL_new(ctx);
ssl_bio=BIO_new_ssl(ctx,0);
if((in=BIO_new_accept(port))==NULL)
goto err;
/* This means that when a new connection is acceptede on 'in',
* The ssl_bio will be 'dupilcated' and have the new sockets
* BIO push into it. Basically it means the SSL BIO will be
* automatically setup */
BIO_set_accept_bios(in,ssl_bio);
again:
/* The first call will setup the accept socket, and the seconds
* will get a socket. In this loop, the first actual accept
* will occur in the BIO_read() function. */
if(BIO_do_accept(in)<=0)
goto err;
for( ; ; )
{
i=BIO_read(in,buf,512);
if(i==0)
{
/* If we have finished, remove the underlying
* BIO stack so the next time we call any function
* for this BIO, it will attempt to do an
* accept */
printf("Done\n");
tmp=BIO_pop(in);
BIO_free_all(tmp);
goto again;
}
if(i<0)
goto err;
fwrite(buf,1,i,stdout);
fflush(stdout);
}
ret=0;
err:
if(ret)
{
ERR_print_errors_fp(stderr);
}
if(in!=NULL)
BIO_free(in);
exit(ret);
return(!ret);
}

求高手解释下代码···
leihelin5201314 2010-11-09
  • 打赏
  • 举报
回复
没人来···自己up~
huhacn 2010-11-08
  • 打赏
  • 举报
回复
1.算法应该就是你自己所支持的算法列表,算法应该有很多,可能你只支持其中的某一些。先这样理解吧
2.回应的算法是你算法列表中的某种吧,相当于协商用这种算法。证书一般是包含公钥的的东东,这里是服务器的公钥。
3.Client收到后发过去的应该不是公钥或私钥了,而是对称加密的密钥。为什么用对称加密上面已经说了。

注:
对称加密: 加密解密用的是同一个密钥 如:DES 3DES
非对称加密: 用的不同的密钥 分公钥和私钥 如:RSA
leihelin5201314 2010-11-08
  • 打赏
  • 举报
回复
恩恩,我也觉得不好理解

//简单的说便是:SSL客户端(也是TCP的客户端)在TCP链接建立之后,发出一个ClientHello来发起握手,这个消息里面包含了自己可实现的算法列表和其它一些需要的消息,SSL的服务器端会回应一个ServerHello,这里面确定了这次通信所需要的算法,然后发过去自己的证书(里面包含了身份和自己的公钥)。Client在收到这个消息后会生成一个秘密消息,用SSL服务器的公钥加密后传过去,SSL服务器端用自己的私钥解密后,会话密钥协商成功,双方可以用同一份会话密钥来通信了。

1,ClientHello里边的算法列表是我自己定制的吗?其他需要的消息是什么?
2,ServerHello回应的算法又是什么?自己的证书就是把自己的key1和key2发过去?
3,Client在收到后把自己的key2发过去,server收到用自己的key1解密对吗?

光这样说我真的不知道该怎么写····
huhacn 2010-11-08
  • 打赏
  • 举报
回复
当然你若担心在交换公钥的过程中出现的公钥被篡改什么的,这就牵扯到公钥基础设施的东西了~
sbdt123 2010-11-08
  • 打赏
  • 举报
回复
真不好理解
huhacn 2010-11-08
  • 打赏
  • 举报
回复
公共密钥即公钥,你是不必担心被谁谁看到,因为他本身就是公开的,给所有人看的。
用A1加密A2解密那叫验签 即是为了证实A的身份。若要用rsa加密解密则需用公钥加密,私钥去解密。
但一般对比较大的问价加解密一般用对称加密,因为对称加密比公私钥加密要快。
故一般流程为:先用非对称加密去加密对称加密的密钥(对称加密的密钥比较短,可视为不怎么耗时) 然后再用对称加密去加密数据。
hai040 2010-11-08
  • 打赏
  • 举报
回复
A发包时
用a1加密是签名认证
数据加密是用b2
leihelin5201314 2010-11-08
  • 打赏
  • 举报
回复

假设通信双方分别是A, B.
A, 拥有 KEY_A1, KEY_A2, 其中KEY_A1是A的私有密钥,KEY_A2是A的公共密钥。
B, 拥有KEY_B1, KEY_B2, 其中KEY_B1是B的私有密钥,KEY_B2是B的公共密钥。
通信过程如下:

A-------->KEY_A2------------>B

A<--------KEY_B2<------------B
经过KEY_A1加密过的明文,只有KEY_A2才能够解密,A把KEY_A2给B,如果KEY_A2被人劫持了怎么办?
过程对我来说有难度,还是直接给个双方ssocket的例子吧,
还没开始学就被拉进任务里做了,不好意思,谢谢!
hai040 2010-11-08
  • 打赏
  • 举报
回复
google ssl加密算法第一条,觉得讲得挺好
http://blog.csdn.net/hj5182001/archive/2007/08/31/1767380.aspx
lukygt 2010-11-08
  • 打赏
  • 举报
回复
一般做的都是RSA+RC4的,通过rsa交换rc4密钥

1 C向S发TCP请求
2 S向C返回rsa公钥
3 C用RSA公钥加密RC4密钥发给S
4 开始用RC4通信

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧