用RSA加密Flash与ASP.Net之间的通信

Flash与 .Net服务器之间只有HTTP连接的情况下,可以通过RSA加密来保障通信的安全。


首先服务器生成一对密钥,把公钥返回给页面. 

using System.Security.Cryptography;

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
	RSAParameters rsaParam = rsa.ExportParameters(false);

	// BA039FFB7657237FAFC78332473483D430396F7B37DD4982B78D200089CEF5738589E2D016FD8B03434DE4B67D1EC7ABF53BE4CC94A0D1E29C36F486DF1A5C6D46AF78F4E2BE1FCB0FEAD6173C7E82B788F307A0019584288A9B3F7EADCD1925CF48FC622FA80E0BC944E2F030B87BB2A2898BC03D38574302C047BB29758279
	string modulus = BitConverter.ToString(rsaParam.Modulus).Replace("-", string.Empty);

	// 010001
	string exponent = BitConverter.ToString(rsaParam.Exponent).Replace("-", string.Empty);

	// 将 modulus / exponent 传回到客户端
}

页面上加载Flash,可以采用flashvar的方式将modulus/exponent传送到flash中。

Flash工程中引入 as3crypto 这个开源的加解密开发包 http://code.google.com/p/as3crypto/


下面是示例ActionScript3代码进行加密:

import com.hurlant.crypto.rsa.RSAKey;
import flash.utils.ByteArray;


// 加密字符串
// 返回值:加密后的ByteArray
private function encrypt(toBeEncrypted:String) : ByteArray {
	var input : ByteArray = new ByteArray();
	input.writeUTFBytes(info);

	// 初始化RSAKey, 从flashvars中读取服务器生成的 modulus / exponent
	var rsa : RSAKey = RSAKey.parsePublicKey( this.loaderInfo.parameters["modulus"]
		, this.loaderInfo.parameters["exponent"]);

	// 加密
	var dest : ByteArray = new ByteArray();
	rsa.encrypt( input, dest, input.length, null);

	return dest;
}

Flash通过HTTP请求的方式将ByteArray传送到服务器。

服务器就直接使用最初生成的私钥解密:

using( RSACryptoServiceProvider rsa = new RSACryptoServiceProvider() )
{

	// 读取之前保存的密钥
	string file = HostingEnvironment.MapPath("rsa_key.xml");
	using (StreamReader sr = new StreamReader(file))
	{
		rsa.FromXmlString(sr.ReadToEnd());
	}

	// 解密
	byte [] plainTextBytes = rsa.Decrypt( info, false);
	string info = Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length);
}

为了防范报文重放攻击(Package-repeat attack),  每次都应该重新生成密钥对--一个RSA key只运行进行一次加解密。


如果需要对大数据量进行加密,则应该结合AES等对称加密算法,在密钥协商的时候采用RSA,而真正的数据采用AES加解密。


本文原始地址:http://blog.youkuaiyun.com/wangjia184/article/details/8274785


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值