加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密);
相反,使用密钥B加密数据得到的密文,只有密钥A可以解密。这两个密钥分别称为私钥和公钥。私钥就是你个人保留,不能公开的密钥,而公钥则是公开给加解密操作的另一方的。
根据不同用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。非对称加密的代表算法是RSA算法。
  

    RSA算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。

  

公钥和私钥的产生:

        public static void CreatePublicAndPrivateKey(out string publicKey, out string privateKey)
{
//声明一个RSA算法的实例,由RSACryptoServiceProvider类型的构造函数指定了密钥长度为1024位
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); //实例化RSACryptoServiceProvider后,RSACryptoServiceProvider会自动生成密钥信息
publicKey = rsaProvider.ToXmlString(false);
privateKey = rsaProvider.ToXmlString(true);
}

公钥加密,私钥解密:

        public static string RSAEncryptWithPublicKey(string source, string publicKey)
{
if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(publicKey)) { return ""; }
else
{
try
{
byte[] data = Encoding.Default.GetBytes(source);
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); //将公钥导入到RSA对象中,准备加密
rsaProvider.FromXmlString(publicKey); int keySize = rsaProvider.KeySize / ;
int bufferSize = keySize - ;
byte[] buffer = new byte[bufferSize];
MemoryStream msInput = new MemoryStream(data);
MemoryStream msOuput = new MemoryStream();
int readLen = msInput.Read(buffer, , bufferSize);
while (readLen > )
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, , dataToEnc, , readLen);
byte[] encData = rsaProvider.Encrypt(dataToEnc, false);//加密
msOuput.Write(encData, , encData.Length);
readLen = msInput.Read(buffer, , bufferSize);
} msInput.Close();
byte[] result = msOuput.ToArray();//得到加密结果
msOuput.Close();
rsaProvider.Clear();
return Convert.ToBase64String(result);
}
catch (Exception ex)
{
return ex.Message;
}
}
} public static string RSADecryptWithPrivateKey(string source, string privateKey)
{
if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(privateKey)) { return ""; }
else
{
try
{
byte[] data = Convert.FromBase64String(source);
//byte[] data = Encoding.Default.GetBytes(source);
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); //将私钥导入RSA中,准备解密
rsaProvider.FromXmlString(privateKey); int keySize = rsaProvider.KeySize / ;
byte[] buffer = new byte[keySize];
MemoryStream msInput = new MemoryStream(data);
MemoryStream msOuput = new MemoryStream();
int readLen = msInput.Read(buffer, , keySize);
while (readLen > )
{
byte[] dataToDec = new byte[readLen];
Array.Copy(buffer, , dataToDec, , readLen);
byte[] decData = rsaProvider.Decrypt(dataToDec, false);//解密
msOuput.Write(decData, , decData.Length);
readLen = msInput.Read(buffer, , keySize);
}
msInput.Close();
byte[] result = msOuput.ToArray();//得到解密结果
msOuput.Close();
rsaProvider.Clear();
return Encoding.Default.GetString(result);
}
catch (Exception ex)
{
return ex.Message;
}
}
}

加解密算法二:非对称加解密及RSA算法的实现的更多相关文章

  1. 使用java实现对称加密解密(AES),非对称加密解密(RSA)

    对称加密:双方采用同样的秘钥进行加密和解密.特点是速度快,但是安全性没有非对称加密高 非对称加密:接收方生成的公有秘钥公布给发送方,发送方使用该公有秘钥加密之后,发送给接收方,然后接收方使用私有秘钥解 ...

  2. KMP算法中next数组的理解与算法的实现(java语言)

    KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧. 计算前缀 Next[i] 的值: ...

  3. Prim算法:最小生成树---贪心算法的实现

    算法图解: http://baike.baidu.com/link?url=hGNkWIOLRJ_LDWMJRECxCPKUw7pI3s8AH5kj-944RwgeBSa9hGpTaIz5aWYsl_ ...

  4. C#加解密算法

    先附上源码 加密解密算法目前已经应用到我们生活中的各个方面 加密用于达到以下目的: 保密性:帮助保护用户的标识或数据不被读取. 数据完整性:帮助保护数据不被更改. 身份验证:确保数据发自特定的一方. ...

  5. AES加解密算法Qt实现

    [声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...

  6. RSA,AES加解密算法的实现

    目录 Python实现RSA公钥加密算法 RSA公钥加密算法原理 RSA算法的Python实现 AES加解密算法实现 AES加解密算法原理 AES加解密算法Python实现 参考文献 Python实现 ...

  7. JAVA常用加密解密算法Encryption and decryption

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...

  8. .NET中常见加解密算法

    一.MD5不可逆加密 不可逆加密是指将原文加密成密文以后,无法将密文解密成原文. MD5的算法是公开的,无论是哪种语言,只要需要加密的字符串是相同的,那么经过MD5加密以后生成的结果都是一样的. .N ...

  9. C# 中使用 RSA加解密算法

    一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即 ...

随机推荐

  1. 检测 NSObject 对象持有的强指针

    在上一篇文章中介绍了 FBRetainCycleDetector 的基本工作原理,这一篇文章中我们开始分析它是如何从每一个对象中获得它持有的强指针的. 如果没有看第一篇文章这里还是最好看一下,了解一下 ...

  2. JS 笔记

    如何定义一个函数呢?基本语法如下: function 函数名() {      函数代码; } 说明: 1. function定义函数的关键字. 2. "函数名"你为函数取的名字. ...

  3. 关于jQuery源码中(function(window,undefined){//dosomething()})(window)写法解释

    一.首先是最常见的闭包 (Closure) 范式自执行函数的写法,这里用匿名函数封装(构造块级作用域),避免了匿名函数内部的代码与外部之间发生冲突(如使用了相同的变量名). (function() { ...

  4. Java 线程的状态

    Java Thread的运行周期中, 有几种状态, 在 java.lang.Thread.State 中有详细定义和说明: NEW 状态是指线程刚创建, 尚未启动 RUNNABLE 状态是线程正在正常 ...

  5. oracle中decode()函数

    简单写写,后续继续补充

  6. beanfactory与applicationcontext的区别

    ApplicationContext能够自动辨认和应用在其上部署的实现了BeanFactoryPostProcessor的bean 特性                            Bean ...

  7. Xamarin 安装体验

    1.先从官网下载https://www.xamarin.com/downloadXamarin for Visual Studio 2.MAC上下载https://store.xamarin.com/ ...

  8. 未能加载文件或程序集“App_global.asax”或它的某一个依赖项

    未能加载文件或程序集"App_global.asax"或它的某一个依赖项.生成此程序集的运行时比当前加载的运行时新,无法加载此程序集. 出现这一问题的原因是空间支持framewor ...

  9. Latex之CJK中文书签乱码[转]

    在使用CJK宏包编辑中文时,可以使用不同的编码方式,一种是UTF-8格式:另外一种是GBK编码.在使用GBK编码时,生成的PDF格式中的文本是GBK的编码方式,因此大部分不支持GBK编码的PDF阅读器 ...

  10. java包和jar包

    1.包 package  pack;                             /*定义包,放在程序的第一行,包名所以字母小写*/ class PackageDemo{    publi ...