使用rsa算法进行数据通信加密

RSA算法简介

它通常是先生成一对RSA 密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。这就使加密的计算量很大。为减少计算量,在传送信息时,常采用传统加密方法与公开密钥加密方法相结合的方式,即信息采用改进的DES或IDEA对话密钥加密,然后使用RSA密钥加密对话密钥和信息摘要。对方收到信息后,用不同的密钥解密并可核对信息摘要。

4

需求:

5XEYK4X8Y_0I4R[A}8WUE@H

服务端实现

1. 首先需要在服务器上生成秘钥及证书文件,如下:

#yum install openssl

#mkdir /data/ssl

#cd /data/ssl

生成证书所需要的密钥文件:

#openssl genrsa -des3 -out service.key 1024

#openssl req -new -key service.key -out service.csr

#openssl rsa -in service.key -out service.key

1

根据密钥生成证书

#openssl x509 -req -days 365 -in service.csr -signkey service.key -out service.crt

截止,/data/ssl下会有如下文件:

service.key     service.csr     service.crt

查看密钥:

openssl asn1parse -out temp.ans -i -inform PEM < service.key

3

2. 代码示例

1) JS代码

var xmlHttp;

var rsa_n = "B4B5991A359BA0BFAB36A81688909A5128309B5460859AFAEB4251726AFF0DC8455FE6364FE5BD2C6A92B88FD551E94A63CE9F086FC1146869A48D03D2F45E1F13C0DC6BA1A2AEA0B60999AB1AEA45997ABEBF9209FE27C3EB22A82CA2AAD15BEC8EC6FC8731A8BC70B1E24D6F9EABDCE45C3329BF5748A29CF251B1723DA253"; //公钥

setMaxDigits(131);

var key = new RSAKeyPair("10001", '', rsa_n);

function showResult(b) {

if (check_fno(b)) {

alert("请输入正确航班号!")

} else {

xmlHttp = GetXmlHttpObject();

if (xmlHttp == null) {

alert("Browser does not support HTTP Request");

return

}

b = encryptedString(key,b);

var host_name = encryptedString(key,window.location.host);

var a = "getstatus.php";

a = a + "?q=" + b;

a = a + "&_host=" + host_name;

a = a + "&sid=" + Math.random();

xmlHttp.onreadystatechange = stateChanged;

xmlHttp.open("GET", a, true);

xmlHttp.send(null)

}

}

2) PHP代码:

define("CRT", "/data/ssl/service.crt"); //公钥文件
define("PEM", "/data/ssl/service.key"); //私钥文件
/**
 * 私钥解密
 *
 * @param string 密文(base64编码)
 * @param string 密钥文件(.pem/.key)
 * @param string 密文是否来源于JS的RSA加密
 * @return string 明文
 */
function privatekey_decodeing($crypttext, $fileName,$fromjs = FALSE)
{
    $key_content = file_get_contents($fileName);
    $prikeyid    = openssl_get_privatekey($key_content);
    $crypttext   = base64_decode($crypttext);
    $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING;
    if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding))
    {
        return $fromjs ? rtrim(strrev($sourcestr), "\0") : "".$sourcestr;
    }
    return FALSE;
}

/**
 * 公钥加密
 *
 * @param string 明文
 * @param string 证书文件(.crt)
 * @return string 密文(base64编码)
 */
function publickey_encodeing($sourcestr, $fileName)
{
    $key_content = file_get_contents($fileName);
    $pubkeyid    = openssl_get_publickey($key_content);
    if (openssl_public_encrypt($sourcestr, $crypttext, $pubkeyid))
    {
        return base64_encode("" . $crypttext);
    }
    return False;
}

$q=strtoupper($_GET["q"]);
$q = base64_encode(pack("H*", $q));
$q = privatekey_decodeing($q, PEM, TRUE);
/*
数据处理
*/
echo $s;

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>