[转]RSA非对称加密的一些非常规应用

http://mail.qq.com/zh_CN/htmledition2/js/safeauth.js, 有兴趣的可以自己去研究。使用这种方式之后,服务端的计算量大大减少,只需要在用户提交的时候进行一次解密操作就可以了。而且这个解密,可以使用C语言做 成模块,给前端展现语言调用,提高效率。如果有更高的安全性考虑,可以做一些改进,比如在客户端提交表单之前,在发送数据里面加入完整性检验等等,自由发 挥即可。

二. 独立的水印系统

现在的论坛或者blog,都需要使用水印来防范强行破解密码的攻击方式,和防范发帖机器人的破坏。但是很多水印和应用系统结合在一起,不方便扩充和给第三方提供服务。这几天想到可以使用RSA加密来实现一套独立的水印算法,并且可以方便的提供给任意的第三方安全使用。

主要思路是这样的,首先生成一对公钥和私钥。将公钥发布给需要使用水印服务的第三方,私钥保存在水印生成方。在使用方随机生成一个字符串,随后使 用水印方提供的public key,使用RSA算法进行加密,将加密后的字符串发送给生成水印方。生成方使用private key对这个字符串进行解密,画出图形,将数据传输给水印使用方。虽然加密后的字符串在水印使用方的HTML源代码中明文可见,但是同上所说的,没有 private key是无法解密的。对于安全性的一些加强,可以考虑同时在使用方与生成方之间共享一个用于对称加密的字符串。先对随机生成的水印数字进行对称加密,然后 再RSA非对称加密,这样可以在万一丢失private key的情况下,仍然不容易马上被攻破。

为了验证我的这个思路,今天写了一小段验证代码,发现还是比较好用的。我主要是把Pear里面的RSA类扒出来了,稍微改了一点点,然后做了一套测试系统。简单的代码如下,详细的见附件。

代码:

/*

Global.php  通用函数,调用RSA类提供加密解密功能。

云舒 , 2007年10月1日

*/
function encrypt( $plain_text )
{
    $public_key = 'YTozOntpOjA7czozMjoiS1vW5NNLH39farB+HPE/U0A1fs1I7ja81GJxGrrjsYEiO2k6MTtzOjM6IgEAASI7aToyO3M6NjoicHVibGljIjt9';
    
    $key = Crypt_RSA_Key::fromString($public_key);
    check_error($key);
    $rsa_obj = new Crypt_RSA;
    check_error($rsa_obj);

    $enc_text = $rsa_obj->encrypt($plain_text, $key);
    check_error($rsa_obj);
    
    return $enc_text;
}

function decrypt( $enc_text )
{
    $private_key = "YTozOntpOjA7czozMjoiS1vW5NNLH39farB+HPE/U0A1fs1I7ja81GJxGrrjsYEiO2k6MTtzOjMyOiIButTavL72eeXVEa8E5WkAJthoHqmHIyo3HblsSJG0aiI7aToyO3M6NzoicHJpdmF0ZSI7fQ==";
    
    $key = Crypt_RSA_Key::fromString($private_key);
    check_error($key);
    $rsa_obj = new Crypt_RSA;
    check_error($rsa_obj);
    $rsa_obj->setParams(array('dec_key' => $key));
    check_error($rsa_obj);

    $number = $rsa_obj->decrypt($enc_text);
    
    return $number;
}


代码:

/*

水印需求方,随机生成字符串,然后加密发送给水印生成方

云舒 , 2007年10月1日

*/
require_once 'Global.php';

$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
$str_a = $chars;
$str_b = $chars;
$str_c = $chars;
$str_d = $chars;

$str = $str_a.$str_b.$str_c.$str_d;
$enc_data = encrypt( $str );

echo 'test';


代码:

/*

水印提供方,获取需求方传递过来的参数,解密,画出图形

云舒 , 2007年10月1日

*/
require_once 'Global.php';

header('Content-type: image/gif');
if( isset( $_GET["number"] ) )
{
    $enc_number = rawurldecode( $_GET["number"] );
}
else
{
    exit;
}

$de_number = decrypt( $enc_number );
$chars = preg_split( '//', $de_number );

$im = imagecreate(75,30);

$bg = imagecolorallocate($im, 255, 255, 255);//背景
$font_color = imagecolorallocate($im, 0, 0, 0);//字

imagestring($im, mt_rand(5,9), mt_rand(0,5), mt_rand(0,5), $chars[1], $font_color);
imagestring($im, mt_rand(5,9), mt_rand(15,25), mt_rand(0,5), $chars[2],  $font_color);
imagestring($im, mt_rand(5,9), mt_rand(30,40), mt_rand(0,5), $chars[3],  $font_color);
imagestring($im, mt_rand(5,9), mt_rand(45,50), mt_rand(0,5), $chars[4],  $font_color);

// 随机点
for ($i=1; $i<=10; $i++)
{
    imagestring($im,mt_rand(0,5),mt_rand(-5,63),mt_rand(-5,23),".",imageColorAllocate($im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)));
}
    
imagegif($im);
imagedestroy ($im);



三. 防御伪造域的垃圾邮件

垃圾邮件现在也是网络上很头疼的一个问题,使用非对称算法的签名功能,可以对伪造域的垃圾邮件进行鉴别,需要邮件接收方服务器的支持。理论不多说 了,直接举例。假设我是mail.icylife.net域,我给mail.ph4nt0m.org发邮件。但是有人自己架设了mail服务器,伪装成 [email protected][email protected]发邮件,试图取得他的信任,这种问题如何处理?好办,使用非对称加密的签名验证功能。

首先,我在 http://mail.icylife.net/publickey.txt存放我的公钥文件,私钥自己保存好。然后对邮件服务器进行一些改进,对于本域发出去的所有邮件,包括邮件正文和接受者一起做一个签名,把签名附在邮件中一起发出去。而mail.ph4nt0m.org域中的邮件服务器在接收邮件时,从 http://mail.icylife.net/publickey.txt取得我的公钥,对签名进行验证,如果签名不对,马上提示用户遭受源域名伪造攻击。对于攻击者来说,他没有我的私钥,是不可能伪造出同样的签名的。

以上几个想法,一直一来有个朦胧的感觉,但是一直抓不住,前几天洗澡的时候,突然明朗起来了。或者有人说,RSA这些非对称加密是可以破解的,我只能说,地球都会毁灭,何况是加密算法。
 

你可能感兴趣的:(安全加密)