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 ...
- JS的ES6的iterator
一.iterator 1.概念:iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制. 2.作用: 为各种数据结构,提供一个统一的.简便的访问接口: 使得数据结构的成员能够按某种次序 ...
- YY天气使用
前言: 需要使用http获取天气数据,本节说明调用YY天气的http接口获取天气数据 注册: http://www.yytianqi.com/ 登录注册的邮箱验证 验证完成以后: 获取的数据信息: { ...
- PAT刷题 (Java语言)
1001. A+B Format (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Calculate ...
- mysql(四)缓存
参考文档: http://www.cnblogs.com/zemliu/archive/2013/08/03/3234372.html
- 图上的并行处理 Parallel Processing of Graphs
Graph 本次学术前沿讲座由邵斌老师主讲,标题已经揭示了主题:Graph.1.5h的talk,听完自觉意犹未尽.本来以为是一节自己没接触过的图形学的talk,没想到讲的很多内容都跟自己学过的很多东西 ...
- DICOM中的UID
UID形式上是一个字符串,用于唯一标识DICOM标准中各种不同信息对象,如数据元素的值表示类型.DICOM抽象语法名.传输语法.应用程序上下文名字等,以保证在各个不同的国家.地区.生产商.设备使用时的 ...
- TensorFlow2.0初体验
TF2.0默认为动态图,即eager模式.意味着TF能像Pytorch一样不用在session中才能输出中间参数值了,那么动态图和静态图毕竟是有区别的,tf2.0也会有写法上的变化.不过值得吐槽的是, ...
- 如何查看android studio sdk路径配置
file–>Other Settings–>Default Project Structure
- PHP系列 | Thinkphp3.2 上传七牛 bad token 问题 [ layui.upload 图片/文件上传]
前端代码 <div class="logo_out" id="upload-logo"></div> JS代码 /** * 上传图片 * ...