java使用SSL加密来实现安全传输



java使用SSL加密来实现安全传输。

SSL(Secure Socket Layer),安全套接字层,位于HTTP层和TCP层之间,用来建立用户与服务器之间的加密通信,确保所传递信息的安全性。SSL是工作在公共密钥和私人密钥基础上的,任何用户都可以获得公共密钥来加密数据,但解密数据必须要通过相应的私人密钥。
使用SSL安全机制时,首先客户端与服务器建立连接,服务器把它的数字证书与公共密钥一并发送给客户端,客户端随机生成会话密钥,用从服务器得到的公共密钥对会话密钥进行加密,并把会话密钥在网络上传递给服务器,而会话密钥只有在服务器端用私人密钥才能解密,这样,客户端和服务器端就建立了一个惟一的安全通道。加密解密通常用RSA算法来实现分3步完成:第一步:生成密钥对;第二步:公钥加密;第三步:私钥解密。为简单起见,这里只列出密钥对的生成过程,源代码如下:
//生成密钥对的JAVA源代码
public int generateKeyPair(int length){
BigIntegerp, q, n, d, e, pSub1, qSub1, phi;
BigIntegerdP, dQ, qInv;

 

int pbitlength = (length + 1) / 2;
int qbitlength = (length- pbitlength);
e=new BigInteger(“65537″,10);

//生成素数p,并且使p-1与e互素
for (;;){
p = new BigInteger(pbitlength, 50,new SecureRandom());
if (e.gcd(p.subtract(ONE)).equals(ONE)) break;
}
for (;;){
//生成素数q,并且使q-1与e互素,与p不相等
for (;;)
{
q = new BigInteger(qbitlength,50,new SecureRandom());
if (e.gcd(q.subtract(ONE)).equals(ONE) && !p.equals(q)) break;
}
//模数n=p*q
n = p.multiply(q);
if (n.bitLength() == length) break;
p = p.max(q);
}
pSub1 = p.subtract(ONE);
qSub1 = q.subtract(ONE);
phi = pSub1.multiply(qSub1);
d = e.modInverse(phi);
dP = d.remainder(pSub1);
dQ = d.remainder(qSub1);
qInv = q.modInverse(p);
pukParam=new RSAPublicKey(n, e);
pvkParam=new RSAPrivateKey(n, e, d, p, q, dP, dQ, qInv);
return 1;
}
以上生成密钥对的代码中,生成p、q、e、d、n 等数是核心。其算法为:先找出3个数p,q,e,其中p,q是两个相异的质数,e是与(p-1)(q-1)互质的数,p,q,e这3个数便是Private Key;然后找出m,使得e m==1mod(p-1)(q-1),再计算n=p q,则m,n这两个数便是Public key。运行时,需在地址栏前面输入“https://”,而不是通常命名用的“http://”,这表明使用了SSL协议。