当前位置:编程学习 > 网站相关 >>

.Net下的加密解密大全(6):玩转非对称加密

前文:.Net下的加密解密大全(5):玩转对称加密

本博文来聊聊怎么玩转非对称加密吧,这里主要介绍.NET算法下的3种非对称加密算法:DSA,RSA,ECDsa。上两篇博文分别为Hash家族和非对称加密家族找到了lead,现在我们就为非对称加密技术找个合适的lead吧。
 
   首先创建一个接口:“IEncryptAndDecrypt”,然后为上面的3中算法分别创建3个实现类并让这些类实现接口“IEncryptAndDecrypt”。它们的情况如下图:
 
\ 

 
 
   这下我们把这些哥们都召集起来了,现在我们就给他们找一个lead:“EncryptAndDecryptInvoker”。以后我们要找这些非对称加密家族的哥们的时候就可以直接联系lead啦!来瞧瞧现在的队伍吧:
 \
 
 
 看上去挺不错的,我们来看看咱们的lead是否能胜任它的工作吧:

EncryptAndDecryptInvoker lead; 
            string data = "我们是非对称加密家族!"; 
 
 
            //执行环境 
            CryptogramSetting setting = new CryptogramSetting(); 
            byte[] bData;//加密处理前 
            byte[] aData;//机密处理后 
            byte[] tmp; 
            Encoding encoding = System.Text.Encoding.UTF8; 
            sys_cryptography.DSA tmp_dsa = sys_cryptography.DSA.Create(); 
            string DSA_PublicKey = tmp_dsa.ToXmlString(false); 
            string DSA_PrivateKey = tmp_dsa.ToXmlString(true); 
            sys_cryptography.RSA tmp_rsa = sys_cryptography.RSA.Create(); 
            string RSA_PublicKey = tmp_rsa.ToXmlString(false); 
            string RSA_PrivateKey = tmp_rsa.ToXmlString(true); 
            sys_cryptography.ECDsa tmp_ecdsa = sys_cryptography.ECDsa.Create(); 
            string ECDsa_PublicKey = tmp_ecdsa.ToXmlString(false); 
            string ECDsa_PrivateKey = tmp_ecdsa.ToXmlString(true); 
 
 
 
 
            //DSA 
             
            Hashtable dsaKey = new Hashtable(); 
            dsaKey["publickey"] = DSA_PublicKey; 
            dsaKey["privatekey"] = DSA_PrivateKey; 
            setting.CryptogramType = CryptogramType.UnsymmetryEncryptAndDecrypt; 
            setting.PublicKeyAndPrivateKey = dsaKey; 
 
 
            lead = new EncryptAndDecryptInvoker(new DSA(), setting); 
             
            Console.WriteLine("DSA:"); 
            tmp = lead.Encrypt(encoding.GetBytes(data)); 
            Console.WriteLine("签名:"+Convert.ToBase64String(tmp)); 
 
            lead.SetVertifyData(encoding.GetBytes(data));//验证签名 
 
            bool isOriginal = lead.Decrypt(tmp)[0] == 1 ? true : false ; 
 
            Console.WriteLine("签名结果:" + isOriginal); 
 
 
 
            //RSA 
            Hashtable rsaKey = new Hashtable(); 
            rsaKey["publickey"] = RSA_PublicKey; 
            rsaKey["privatekey"] = RSA_PrivateKey; 
            setting.CryptogramType = CryptogramType.UnsymmetryEncryptAndDecrypt; 
            setting.PublicKeyAndPrivateKey = rsaKey; 
 
            lead = new EncryptAndDecryptInvoker(new RSA(), setting); 
            Console.WriteLine("RSA:"); 
            tmp = lead.Encrypt(encoding.GetBytes(data)); 
            Console.WriteLine("加密:" + Convert.ToBase64String(tmp)); 
            tmp = lead.Decrypt(tmp); 
            Console.WriteLine("解密:" + encoding.GetString(tmp)); 
 
 
            //ECDsa  问题:ECDsa不能到处公匙和私匙 
             
 
            Hashtable ecdsaKey = new Hashtable(); 
            ecdsaKey["publickey"] = ECDsa_PublicKey; 
            ecdsaKey["privatekey"] = ECDsa_PrivateKey; 
            setting.CryptogramType = CryptogramType.UnsymmetryEncryptAndDecrypt; 
            setting.PublicKeyAndPrivateKey = ecdsaKey; 
 
            lead = new EncryptAndDecryptInvoker(new ECDsa(), setting); 
            Console.WriteLine("ECDsa:"); <
补充:综合编程 , 安全编程 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,