WebService RSA加密传输示例
发布时间:2020-12-17 01:04:07 所属栏目:安全 来源:网络整理
导读:对于部分的应用,对称加密是不可行的,例如一对多的通讯加密 如果密码是对称的,将不可靠。所以要利用非对称加密 ? 所谓非对称加密,就是说,加密的是可以公开的公钥,但是解密,必须用自己私有 的私钥,简单地说,就是加密解密不是同一个密码 下面是例子,
对于部分的应用,对称加密是不可行的,例如一对多的通讯加密
如果密码是对称的,将不可靠。所以要利用非对称加密
?
所谓非对称加密,就是说,加密的是可以公开的公钥,但是解密,必须用自己私有
的私钥,简单地说,就是加密解密不是同一个密码
下面是例子,建了一个 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)); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |