对于部分的应用,对称加密是不可行的,例如一对多的通讯加密
如果密码是对称的,将不可靠。所以要利用非对称加密
所谓非对称加密,就是说,加密的是可以公开的公钥,但是解密,必须用自己私有
的私钥,简单地说,就是加密解密不是同一个密码
下面是例子,建了一个 webservice,这个是提供公钥的一端
public class secureServices : System.Web.Services.WebService
{
public secureServices()
{
//如果使用设计的组件,请取消注释以下行
//InitializeComponent();
}
[WebMethod()]
//公开的方法 ,返回加密的公钥,xml的形式
public string GetPublicKey()
{
RSACryptoServiceProvider cryot = GetKeyFromState();
return cryot.ToXmlString(false );
}
//生成一个 RSA算法的对象,该对象生成的时候,就自动生成出公钥,私钥
private RSACryptoServiceProvider GetKeyFromState()
{
RSACryptoServiceProvider crypt = null;
if (Application["Key"] == null)
{
//把RSA对象放置在全局的缓冲区,方便解密时使用
CspParameters param = new CspParameters();
param.Flags = CspProviderFlags.UseMachineKeyStore;
crypt = new RSACryptoServiceProvider(param);
Application["Key"] = crypt;
}
else
{
crypt = (RSACryptoServiceProvider)Application["Key"];
}
return crypt;
}
[WebMethod(Description = "Parameters to this method must be encrypted with the web service public key")]
public string DepositFunds(byte[] encryptedAccountNumber, byte[] encryptedAmount)
{
//模拟的一个公开的方法,给客户传递加密的用户名和钱的数量
RSACryptoServiceProvider crypt = GetKeyFromState();
string decryptedAccountNumber;
decimal decryptedAmount;
System.Text.UnicodeEncoding ncd = new System.Text.UnicodeEncoding();
//解密过程
decryptedAccountNumber = ncd.GetString(crypt.Decrypt(encryptedAccountNumber, false));
decryptedAmount = Decimal.Parse(ncd.GetString(crypt.Decrypt(encryptedAmount, false)));
//向调用客户返回一个字符串,明文,带有解密信息
return decryptedAccountNumber + "has used" + decryptedAmount.ToString();
}
private void DESCryptoNotes()
{
}
}
客户端来说,必须添加这个 webservice引用
然后生成一个服务器的代理对象,通过服务器的公钥加密要传递的数据
private void button1_Click(object sender, EventArgs e)
{
WindowsApplication1.localhost.secureServices proxy =new WindowsApplication1.localhost.secureServices();
RSACryptoServiceProvider crypt = new RSACryptoServiceProvider();
//加密数据,使用服务器传递的公钥,由于是非对称加密的公钥,所以可以公开
给任何人,通过公钥来构造加密对象
crypt.FromXmlString(proxy.GetPublicKey());
string accountName = textBox1.Text;
string amount = textBox2.Text;
byte[] encryptedAccountName, encryptedAmount;
System.Text.UnicodeEncoding uce=new UnicodeEncoding ();
encryptedAccountName = crypt.Encrypt(uce.GetBytes(accountName),false );
encryptedAmount = crypt.Encrypt(uce.GetBytes(amount), false);
//把加密信息发送给服务器,然后吧返回值显示出来
MessageBox.Show(proxy.DepositFunds(encryptedAccountName, encryptedAmount));
}