RSA非对称式加解密笔记
1、服务器生成【公钥】和【私钥】,成对生成;
2、客户端生成证书信息,使用【公钥】进行加密,前提是有公钥,并生成证书信息;
3、客户端发送自身的计算机名、MAC、用户名、证书内容给服务器;
4、服务器使用【私钥】对证书内容进行解密,并验证证书信息中的计算机名、MAC、用户名是否一致,首先是能否解密,其次是信息是否一致。
能解决表明客户端拥有相应公钥;
----------------------
备注:签名信息需要使用私钥生成,用于客户端验证数据是否来自服务器,这种情况下,客户端可以使用公钥对签名进行验证,签名正确的情况下,
则可以认为密文没有被修改,可以将密文解密得到目标信息。
-----------------------
上面,在服务器端生成【公钥】和【私钥】密钥对;
然后,客户端使用公钥,生成证书,生成后即删除公钥,确保不会后期更换电脑被重新生成;即无公钥的情况下,客户端无法生成有效的证书。
服务器使用【私钥】进行解密,得到明文信息,并做校验。
-----------------------------------------------------------------
公私钥可以互相加解密,由公钥加密私钥解密,或者由私钥加密公钥解密,相当来说,加密使用公钥,解密使用私钥,因为私钥长度更长,不容易被破解。
通常服务器一方掌握私钥,而公钥提供给多个客户端,客户端可以使用公钥来进行解密和验证,而服务器使用私钥来加密和生成签名;
生成签名的形式通常用于对明文,进行签名;防止明文数据被修改,若产生签名,通常就不产生密文。
------------------------------------------------------------------------------------------------------------------
签名和验签也是使用公私钥一一对应的,签名和验证执行效率相对较高,加解密比较耗资源。签名和加解密文没有必然联系;
/// <summary>
/// 基于RSA公私钥的加密解密验证算法
/// </summary>
public class RSA
{
public class KeyGenerator
{
/// <summary>
/// 随机生成秘钥(对称算法)
/// </summary>
/// <param name="key">秘钥(base64格式)</param>
/// <param name="iv">iv向量(base64格式)</param>
/// <param name="keySize">要生成的KeySize,每8个byte是一个字节,注意每种算法支持的KeySize均有差异,实际可通过输出LegalKeySizes来得到支持的值</param>
public static void CreateSymmetricAlgorithmKey<T>(out string key, out string iv, int keySize) where T : SymmetricAlgorithm, new()
{
using (T t = new T())
{
t.KeySize = keySize;
t.GenerateIV();
t.GenerateKey();
iv = Convert.ToBase64String(t.IV);
key = Convert.ToBase64String(t.Key);
}
}
/// <summary>
/// 随机生成秘钥(非对称算法)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="publicKey">公钥(Xml格式)</param>
/// <param name="privateKey">私钥(Xml格式)</param>
/// <param name="provider">用于生成秘钥的非对称算法实现类,因为非对称算法长度需要在构造函数传入,所以这里只能传递算法类</param>
public static void CreateAsymmetricAlgorithmKey<T>(out string publicKey, out string privateKey, T provider = null) where T : AsymmetricAlgorithm, new()
{
if (provider == null)
{
provider = new T();
}
using (provider)
{
publicKey = provider.ToXmlString(false);
privateKey = provider.ToXmlString(true);
}
}
} public class AsymmetricAlgorithmHelper<T> where T : AsymmetricAlgorithm, new()
{
protected static TResult Execute<TResult>(string key, Func<T, TResult> func)
{
using (T algorithm = new T())
{
algorithm.FromXmlString(key);
return func(algorithm);
}
}
/// <summary>
/// 按默认规则生成公钥、私钥
/// </summary>
/// <param name="publicKey">公钥(Xml格式)</param>
/// <param name="privateKey">私钥(Xml格式)</param>
public static void Create(out string publicKey, out string privateKey)
{
KeyGenerator.CreateAsymmetricAlgorithmKey<T>(out publicKey, out privateKey);
}
} public class RSAHelper : AsymmetricAlgorithmHelper<RSACryptoServiceProvider>
{
//加密、解密、签名和验证示例代码
//using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider(2048))
//{
// KeyGenerator.CreateAsymmetricAlgorithmKey<RSACryptoServiceProvider>(out string publicKey, out string privateKey, provider);
// Console.WriteLine(privateKey);
// Console.WriteLine(publicKey);
// //测试定义需要加密的字符串
// var test = "abc";
// //执行加密
// var ends = Encrypt.RSA.RSAHelper.Encrypt(publicKey, test, true);
// //获得签名
// var sign = Encrypt.RSA.RSAHelper.SignData(privateKey, test, null);
// //执行验证
// var verify = Encrypt.RSA.RSAHelper.VerifyData(publicKey, test, sign, null);
// //执行解密
// var des = Encrypt.RSA.RSAHelper.Decrypt(privateKey, ends, true);
// Console.ReadLine();
//} /// <summary>
/// RSA加密
/// </summary>
/// <param name="publickey">公钥</param>
/// <param name="content">加密前的原始数据</param>
/// <param name="fOAEP">如果为 true,则使用 OAEP 填充(仅在运行 Microsoft Windows XP 或更高版本的计算机上可用)执行直接的 System.Security.Cryptography.RSA加密;否则,如果为 false,则使用 PKCS#1 1.5 版填充。</param>
/// <returns>加密后的结果(base64格式)</returns>
public static string Encrypt(string publickey, string content, bool fOAEP = false)
{
return Execute(publickey,
algorithm => Convert.ToBase64String(algorithm.Encrypt(Encoding.UTF8.GetBytes(content), fOAEP)));
}
/// <summary>
/// RSA解密
/// </summary>
/// <param name="privatekey">私钥</param>
/// <param name="content">加密后的内容(base64格式)</param>
/// <param name="fOAEP">如果为 true,则使用 OAEP 填充(仅在运行 Microsoft Windows XP 或更高版本的计算机上可用)执行直接的 System.Security.Cryptography.RSA加密;否则,如果为 false,则使用 PKCS#1 1.5 版填充。</param>
/// <returns></returns>
public static string Decrypt(string privatekey, string content, bool fOAEP = false)
{
return Execute(privatekey,
algorithm => Encoding.UTF8.GetString(algorithm.Decrypt(Convert.FromBase64String(content), fOAEP)));
}
/// <summary>
/// RSA签名
/// </summary>
/// <param name="privatekey">私钥</param>
/// <param name="content">需签名的原始数据(utf-8)</param>
/// <param name="halg">签名采用的算法,如果传null,则采用MD5算法</param>
/// <returns>签名后的值(base64格式)</returns>
public static string SignData(string privatekey, string content, object halg = null)
{
return Execute(privatekey,
algorithm => Convert.ToBase64String(algorithm.SignData(Encoding.UTF8.GetBytes(content), GetHalg(halg))));
}
/// <summary>
/// RSA验签
/// </summary>
/// <param name="publicKey">公钥</param>
/// <param name="content">需验证签名的数据(utf-8)</param>
/// <param name="signature">需验证的签名字符串(base64格式)</param>
/// <param name="halg">签名采用的算法,如果传null,则采用MD5算法</param>
/// <returns></returns>
public static bool VerifyData(string publicKey, string content, string signature, object halg = null)
{
return Execute(publicKey,
algorithm => algorithm.VerifyData(Encoding.UTF8.GetBytes(content), GetHalg(halg), Convert.FromBase64String(signature)));
}
private static object GetHalg(object halg)
{
if (halg == null)
{
halg = "MD5";
}
return halg;
}
/// <summary>
/// 生成公钥、私钥
/// </summary>
/// <param name="publicKey">公钥(Xml格式)</param>
/// <param name="privateKey">私钥(Xml格式)</param>
/// <param name="keySize">要生成的KeySize,支持的MinSize:384 MaxSize:16384 SkipSize:8</param>
public static void Create(out string publicKey, out string privateKey, int keySize = )
{
RSACryptoServiceProvider provider = new RSACryptoServiceProvider(keySize);
KeyGenerator.CreateAsymmetricAlgorithmKey(out publicKey, out privateKey, provider);
}
}
public class DSAHelper : AsymmetricAlgorithmHelper<DSACryptoServiceProvider>
{
/// <summary>
/// DSA签名
/// </summary>
/// <param name="privatekey">私钥</param>
/// <param name="content">需签名的原始数据(utf-8)</param>
/// <returns>签名后的值(base64格式)</returns>
public static string SignData(string privatekey, string content)
{
return Execute(privatekey,
algorithm => Convert.ToBase64String(algorithm.SignData(Encoding.UTF8.GetBytes(content))));
}
/// <summary>
/// DSA验签
/// </summary>
/// <param name="publicKey">公钥</param>
/// <param name="content">需验证签名的数据(utf-8)</param>
/// <param name="signature">需验证的签名字符串(base64格式)</param>
/// <returns></returns>
public static bool VerifyData(string publicKey, string content, string signature)
{
return Execute(publicKey,
algorithm => algorithm.VerifyData(Encoding.UTF8.GetBytes(content), Convert.FromBase64String(signature)));
}
/// <summary>
/// 生成公钥、私钥
/// </summary>
/// <param name="publicKey">公钥(Xml格式)</param>
/// <param name="privateKey">私钥(Xml格式)</param>
/// <param name="keySize">要生成的KeySize,支持的MinSize:512 MaxSize:1024 SkipSize:64</param>
public static void Create(out string publicKey, out string privateKey, int keySize = )
{
DSACryptoServiceProvider provider = new DSACryptoServiceProvider(keySize);
KeyGenerator.CreateAsymmetricAlgorithmKey(out publicKey, out privateKey, provider);
}
}
}
RSA非对称式加解密笔记的更多相关文章
- Java中RSA非对称密钥加解密使用示例
一.简介: RSA加密算法是最常用的非对称加密算法,CFCA在证书服务中离不了它.RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.这个算法经受住了多年深入的密码分析,虽然密码分 ...
- [转]RSA,DSA等加解密算法介绍
From : http://blog.sina.com.cn/s/blog_a9303fd90101cgw4.html 1) MD5/SHA MessageDigest是一个数据的数字指纹. ...
- 【加解密专辑】对接触到的PGP、RSA、AES加解密算法整理
先贴代码,有空再整理思路 PGP加密 using System; using System.IO; using Org.BouncyCastle.Bcpg; using Org.BouncyCastl ...
- RSA—非对称加密算法
RSA:非对称加密算法加解密原理如下:已知:p,q,n,e,d,m,c其中:p与q互为大质数,n=p*q 公钥Pk(n,e):加密使用,是公开的 私钥Sk(n,d):解密使用,不公开 c:明文 m:密 ...
- 9.Java 加解密技术系列之 RSA
Java 加解密技术系列之 RSA 序 概念 工作流程 RSA 代码实现 加解密结果 结束语 序 距 离上一次写博客感觉已经很长时间了,先吐槽一下,这个月以来,公司一直在加班,又是发版.上线,又是新项 ...
- JAVA加解密 -- 对称加密算法与非对称加密算法
对称加密算法:双方必须约定好算法 DES 数据加密标准:由于不断地被破解 自98年起就已经逐渐放弃使用 AES 目前使用最多的加密方式,官方并未公布加密方式已被破解,替代DES 实现和DES非常接近 ...
- 银联手机支付(.Net Csharp),3DES加密解密,RSA加密解密,RSA私钥加密公钥解密,.Net RSA 3DES C#
前段时间做的银联支付,折腾了好久,拼凑的一些代码,有需要的朋友可以参考,本人.Net新手,不保证准确性! 这个银联手机支付没有SDK提供,技术支持也没有.Net的,真心不好搞! RSA加解密,这里有个 ...
- C#加解密算法
先附上源码 加密解密算法目前已经应用到我们生活中的各个方面 加密用于达到以下目的: 保密性:帮助保护用户的标识或数据不被读取. 数据完整性:帮助保护数据不被更改. 身份验证:确保数据发自特定的一方. ...
- java加解密算法
什么是加密算法?百度百科给出的解释如下: 数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,使其只能在输入相应的密钥之后才能显示出本来内容, ...
随机推荐
- jsbridge与通信模型
三层通信模型: 应用层.解释层.会话层: 通信协议: 通信原语: 报文格式: 网络层: _evaluateJavascript 会话层: #define kQueueHasMessage @&qu ...
- Spring的三大核心思想:IOC(控制反转),DI(依赖注入),AOP(面向切面编程)
Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧) 1.IoC是什么? IoC(Inversion of Control)控制反转,IoC是一种新的Java编程模式,目前很多 ...
- MySQL binlog2sql实现MySQL误操作的恢复
对于MySQL数据库中的误操作删除数据的恢复问题,可以使用基于MySQL中binlog做到类似于闪回或者生成反向操作的SQL语句来实现,是MySQL中一个非常实用的功能.原理不难理解,基于MySQL的 ...
- 面向开发人员的Windows错误报告(WER)
Windows错误报告是更新的Windows XP上Dr.Watson的替代品.它监视故障并收集可以发送到要分析的服务器(如果用户允许)的有用信息.这项功能帮助微软修复了很多错误——由于收到的报告,微 ...
- win10系统2分钟睡眠
https://blog.csdn.net/widenstage/article/details/78982722 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSe ...
- jmeter-可视化的非GUI模式
概述 我们在使用JMeter执行性能测试的过程中,会遇到很多不方便的地方 GUI模式 执行脚本很方便,看结果也很方便,但是GUI模式消耗资源,对测试结果的准确性影响很大 非GUI模式 消耗资源很少,但 ...
- Redis简介及其安装
1.Redis NoSQL (Not noly SQL)不仅仅是SQL 属于非关系型数据库:Redis就属于非关系型数据库 传统的Mysql ,oracle ,sql server 等 都是关系型数据 ...
- DELPHI开始支持LINUX DOCKER
DELPHI开始支持LINUX DOCKER 本方翻译自Marco Cantu的文章. 在过去的几年中,将服务器端解决方案(实际上是任何类型的应用程序)部署到轻量级容器而不是物理机器或虚拟机已经变得越 ...
- 苹果手机微信浏览器select标签选择完成之后页面不会自动回到原位
说明: html默认select选择框控件在IOS的浏览器中 是底部弹出下拉选择. 这样到时页面位置错位,选择结束后对应不少元素的点击事件不响应. 这样看起来问题不大,但是选择完成之后点击确定提交弹出 ...
- UDP用于保持大量终端的在线与控制,应用与业务则通过TCP去实现。这个和FTP服务控制与数据分离,采取不同的连接,有异曲同工之处 端口映射老化时间
移动端IM/推送系统的协议选型:UDP还是TCP? http://www.52im.net/thread-33-1-1.html