C语言,建立SOCKET连线时,如何用socket,blind,listen,accept,connect函数?

Python014

C语言,建立SOCKET连线时,如何用socket,blind,listen,accept,connect函数?,第1张

用Socket之前,一定要先用WSAStartup初始化。

连线是两个终端的事情,所以你需要写一个服务器和一个客服端

服务器:

WSAStartup

socket 创建套接字

bind 绑定端口

listen 侦听端口,等待客户端连接请求。这是程序会在这里等着,直到客户端调用connect

accept 接受连接

recv/send 收发数据

客户端:

WSAStartup

socket

connect

recv/send

具体看这个 http://www.cnblogs.com/ayanmw/archive/2012/05/03/2480854.html

a.

1. 瞎的,盲的[Z][R]

He is blind in one eye.

他一只眼睛失明。

2. 盲人的,为了盲人的[B]

3. 视而不见的,不愿承认的[F][(+to)]

We must not be blind to the suffering of others.

我们不能对他人的痛苦视而不见。

4. 盲目的,未加思考的无目的的

He made a blind guess.

他胡猜一通。

5. 人力不能控制的

6. (飞机等)单凭仪表驾驶的

The pilot made a blind landing in the fog.

飞行员在雾天盲目着了陆。

7. 【俚】极少的[B]

8. 隐蔽的,难以察觉的

Watch out for blind intersections.

留神不易看清的道路交叉口。

9. (信件)地址未写清楚的

10. (路等)走不通的

ad.

1. 看不见地

2. 盲目地轻率地

The old man is always blind obstinate.

那个老汉总是盲目地固执。

3. 单凭仪表驾驶地

The pilot had to fly blind in this weather.

在这种天气飞行员只好盲目飞行。

vt.

1. 使看不见,使失明

2. 使失去理智(或判断力)

His anger blinded his reason.

愤怒使他失去了理智。

n.[C]

1. 百叶窗窗帘[P1]

2. 掩饰,借口

3. 【美】埋伏处

When he hunts ducks, he hides behind a blind of twigs and leaves.

他打野鸭时,总是藏身在用树枝和树叶做成的隐蔽处。

4. 单凭仪表的驾驶

5. 遮眼物

RSA算法它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字

命名:Ron Rivest, Adi Shamir 和Leonard

Adleman。但RSA的安全性一直未能得到理论上的证明。它经历了各种攻击,至今未被完全攻破。

一、RSA算法 :

首先, 找出三个数, p, q, r,

其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数

p, q, r 这三个数便是 private key

接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1)

这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了

再来, 计算 n = pq

m, n 这两个数便是 public key

编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a <n

如果 a >= n 的话, 就将 a 表成 s 进位 (s <= n, 通常取 s = 2^t),

则每一位数均小於 n, 然後分段编码

接下来, 计算 b == a^m mod n, (0 <= b <n),

b 就是编码後的资料

解码的过程是, 计算 c == b^r mod pq (0 <= c <pq),

於是乎, 解码完毕 等会会证明 c 和 a 其实是相等的 :)

如果第三者进行窃听时, 他会得到几个数: m, n(=pq), b

他如果要解码的话, 必须想办法得到 r

所以, 他必须先对 n 作质因数分解

要防止他分解, 最有效的方法是找两个非常的大质数 p, q,

使第三者作因数分解时发生困难

<定理>

若 p, q 是相异质数, rm == 1 mod (p-1)(q-1),

a 是任意一个正整数, b == a^m mod pq, c == b^r mod pq,

则 c == a mod pq

证明的过程, 会用到费马小定理, 叙述如下:

m 是任一质数, n 是任一整数, 则 n^m == n mod m

(换另一句话说, 如果 n 和 m 互质, 则 n^(m-1) == 1 mod m)

运用一些基本的群论的知识, 就可以很容易地证出费马小定理的

<证明>

因为 rm == 1 mod (p-1)(q-1), 所以 rm = k(p-1)(q-1) + 1, 其中 k 是整数

因为在 modulo 中是 preserve 乘法的

(x == y mod z and u == v mod z => xu == yv mod z),

所以, c == b^r == (a^m)^r == a^(rm) == a^(k(p-1)(q-1)+1) mod pq

1. 如果 a 不是 p 的倍数, 也不是 q 的倍数时,

则 a^(p-1) == 1 mod p (费马小定理) => a^(k(p-1)(q-1)) == 1 mod p

a^(q-1) == 1 mod q (费马小定理) => a^(k(p-1)(q-1)) == 1 mod q

所以 p, q 均能整除 a^(k(p-1)(q-1)) - 1 => pq | a^(k(p-1)(q-1)) - 1

即 a^(k(p-1)(q-1)) == 1 mod pq

=> c == a^(k(p-1)(q-1)+1) == a mod pq

2. 如果 a 是 p 的倍数, 但不是 q 的倍数时,

则 a^(q-1) == 1 mod q (费马小定理)

=> a^(k(p-1)(q-1)) == 1 mod q

=> c == a^(k(p-1)(q-1)+1) == a mod q

=> q | c - a

因 p | a

=> c == a^(k(p-1)(q-1)+1) == 0 mod p

=> p | c - a

所以, pq | c - a => c == a mod pq

3. 如果 a 是 q 的倍数, 但不是 p 的倍数时, 证明同上

4. 如果 a 同时是 p 和 q 的倍数时,

则 pq | a

=> c == a^(k(p-1)(q-1)+1) == 0 mod pq

=> pq | c - a

=> c == a mod pq

Q.E.D.

这个定理说明 a 经过编码为 b 再经过解码为 c 时, a == c mod n (n = pq)

但我们在做编码解码时, 限制 0 <= a <n, 0 <= c <n,

所以这就是说 a 等於 c, 所以这个过程确实能做到编码解码的功能

二、RSA 的安全性

RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解

RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。目前, RSA

的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。现在,人们已能分解多个十进制位的大素数。因此,模数n

必须选大一些,因具体适用情况而定。

三、RSA的速度

由于进行的都是大数计算,使得RSA最快的情况也比DES慢上倍,无论是软件还是硬件实现。速度一直是RSA的缺陷。一般来说只用于少量数据加密。

四、RSA的选择密文攻击

RSA在选择密文攻击面前很脆弱。一般攻击者是将某一信息作一下伪装( Blind),让拥有私钥的实体签署。然后,经过计算就可得到它所想要的信息。实际上,攻击利用的都是同一个弱点,即存在这样一个事实:乘幂保留了输入的乘法结构:

( XM )^d = X^d *M^d mod n

前面已经提到,这个固有的问题来自于公钥密码系统的最有用的特征--每个人都能使用公钥。但从算法上无法解决这一问题,主要措施有两条:一条是采用好的公

钥协议,保证工作过程中实体不对其他实体任意产生的信息解密,不对自己一无所知的信息签名;另一条是决不对陌生人送来的随机文档签名,签名时首先使用

One-Way HashFunction 对文档作HASH处理,或同时使用不同的签名算法。在中提到了几种不同类型的攻击方法。

五、RSA的公共模数攻击

若系统中共有一个模数,只是不同的人拥有不同的e和d,系统将是危险的。最普遍的情况是同一信息用不同的公钥加密,这些公钥共模而且互质,那末该信息无需私钥就可得到恢复。设P为信息明文,两个加密密钥为e1和e2,公共模数是n,则:

C1 = P^e1 mod n

C2 = P^e2 mod n

密码分析者知道n、e1、e2、C1和C2,就能得到P。

因为e1和e2互质,故用Euclidean算法能找到r和s,满足:

r * e1 + s * e2 = 1

假设r为负数,需再用Euclidean算法计算C1^(-1),则

( C1^(-1) )^(-r) * C2^s = P mod n

另外,还有其它几种利用公共模数攻击的方法。总之,如果知道给定模数的一对e和d,一是有利于攻击者分解模数,一是有利于攻击者计算出其它成对的e’和d’,而无需分解模数。解决办法只有一个,那就是不要共享模数n。

RSA的小指数攻击。 有一种提高 RSA速度的建议是使公钥e取较小的值,这样会使加密变得易于实现,速度有

所提高。但这样作是不安全的,对付办法就是e和d都取较大的值。

RSA算法是

第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人

们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA

的重大缺陷是无法从理论上把握它的保密性能

如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

RSA的缺点主要有:A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。B)分组长度太大,为保证安全性,n 至少也要 600

bits

以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。目

前,SET( Secure Electronic Transaction )协议中要求CA采用比特长的密钥,其他实体使用比特的密钥。

C语言实现

#include <stdio.h>

int candp(int a,int b,int c)

{ int r=1

b=b+1

while(b!=1)

{

r=r*a

r=r%c

b--

}

printf("%d\n",r)

return r

}

void main()

{

int p,q,e,d,m,n,t,c,r

char s

printf("please input the p,q: ")

scanf("%d%d",&p,&q)

n=p*q

printf("the n is %3d\n",n)

t=(p-1)*(q-1)

printf("the t is %3d\n",t)

printf("please input the e: ")

scanf("%d",&e)

if(e<1||e>t)

{

printf("e is error,please input again: ")

scanf("%d",&e)

}

d=1

while(((e*d)%t)!=1) d++

printf("then caculate out that the d is %d\n",d)

printf("the cipher please input 1\n")

printf("the plain please input 2\n")

scanf("%d",&r)

switch(r)

{

case 1: printf("input the m: ")/*输入要加密的明文数字*/

scanf("%d",&m)

c=candp(m,e,n)

printf("the cipher is %d\n",c)break

case 2: printf("input the c: ")/*输入要解密的密文数字*/

scanf("%d",&c)

m=candp(c,d,n)

printf("the cipher is %d\n",m)break

}

getch()

}