如果用户 a 要和 b 进行数据交换,a 要通过网络发送一段文字给 b,那如何保证数据在传输的过程中是安全的呢?并且即使被别人截获,也无法知道数据的内容,这就用到加密技术。
对称密码体制
发送方用一个密钥对数据进行加密,接收方使用相同的密钥进行解密。
• 加密和解密 的密钥相同
• 如何获取或交换密钥,保证密钥的私密性非常重要
• 密钥量级是参与者的平方级数,数量比较多
• 适合对大量数据进行加密,加密解密速度快
• 加解密易于通过硬件实现
非对称密码体制
每个网络参与者都有一对密钥 - 私钥和公钥。用户 a 的公钥是公开的,任何与 a 通信的人都可以获取,用来加密数据后发送给 a。a 的私钥只有自己知道,用来解密数据。
• 公钥用来加密,私钥用来解密。公私钥不相同也不相关
• 公钥的交换无需保密
• 密钥的量级为参与者的数目
• 加解密速度慢,不适合大量数据加密,常用于 对称密码 协商共享密钥
• 加解密操作难以通过硬件实现
数字签名
用户 a 发送给 b,b 如何确定数据是用户 a 发送的,而不是别人伪造的数据呢?数字签名可以鉴别消息的发送者
• 用户 a 先将要发送的数据进行 md5 计算生成唯一的 消息摘要 a
• a 用私钥签名消息摘要 a
• a 把数据和消息摘要 a 组合起来发送给 b
• b 收到后用 a 的公钥对消息摘要验签得到 a
• b 用 md5 算法对数据部分进行计算得到消息摘要 b
• b 对 a 和 b 进行比较。如果相同则证明是 a 发送过来的
a 计算数据的消息摘要,并用私钥进行加密的过程称为 签名算法。b 用 a 的公钥解密消息摘要,并与自己计算的消息摘要进行对比的过程称为 验证算法。
如果直接对数据本身直接计算数字签名,会比较耗时。所以一般做法是先将原数据进行 hash 运算,得到的 hash 值就叫做“摘要”。
数字证书
用户 a 要给用户 b 发送数据,如何保证用户 a 拿到的一定是用户 b 的公钥呢?
数字证书是标志通讯各方身份信息的一串数字,不是数字身份证而是身份认证机构盖在数字身份证上的一个章或印。由权威机构-ca(certificate authority)发行的,用来识别对方的身份。
x.509是一种通用的证书规范。
常见的数字证书格式:
• .cer .crt - 用于存放证书,它是二进制形式存放的,不含私钥。
• .pfx .p12 - 存放个人证书/私钥,通常包含保护密码,2 进制方式
从证书文件获得证书对象:
x509certificate2 cert = new x509certificate2 (@c:/mycert.crt );
// 保护密码
string password = getcertpassword();
x509certificate2 cert = new x509certificate2 (@c:/mycert.pfx, password);
从本地证书容器获得证书对象:
private static x509certificate2 getcertificatefromstore(string certname)
{
// get the certificate store for the current user.
x509store store = new x509store(storelocation.currentuser);
try
{
store.open(openflags.readonly);
// place all certificates in an x509certificate2collection object.
x509certificate2collection certcollection = store.certificates;
// if using a certificate with a trusted root you do not need to findbytimevalid, instead:
// currentcerts.find(x509findtype.findbysubjectdistinguishedname, certname, true);
x509certificate2collection currentcerts = certcollection.find(x509findtype.findbytimevalid, datetime.now, false);
x509certificate2collection signingcert = currentcerts.find(x509findtype.findbysubjectdistinguishedname, certname, false);
if (signingcert.count == 0)
return null;
// return the first certificate in the collection, has the right name and is current.
return signingcert[0];
}
finally
{
store.close();
}
}
// 验证证书有效期
if (cert.notafter <= datetime .now)
{
throw new applicationexception ( 用户证书已经过期! );
}
// 获取公钥
rsa publickkey = (rsa)cert.publickey.key;
rsa privatekey = cert.getrsaprivatekey();
public class rsahelper
{
/// rsa加密
///
///公钥
///
///
public static string rsaencrypt(string xmlpublickey, string m_strencryptstring)
{
rsacryptoserviceprovider provider = new rsacryptoserviceprovider();
provider.fromxmlstring(xmlpublickey);
byte[] bytes = new unicodeencoding().getbytes(m_strencryptstring);
return convert.tobase64string(provider.encrypt(bytes, false));
}
///
/// rsa解密
///
///私钥
///
///
public static string rsadecrypt(string xmlprivatekey, string m_strdecryptstring)
{
rsacryptoserviceprovider provider = new rsacryptoserviceprovider();
provider.fromxmlstring(xmlprivatekey);
byte[] rgb = convert.frombase64string(m_strdecryptstring);
byte[] bytes = provider.decrypt(rgb, false);
return new unicodeencoding().getstring(bytes);
}
}
DP9241国产无线射频收发器芯片简介
大唐与烽火,强强联手共同推动5G发展
Create2021百度AI开发者大会 时间/直播地点/议程
开域集团利用领先的数字科技平台助力客户在互联网时代抢占先机
基于PLC/变频器的水位控制项目解析
如何保证数据在传输的过程中是安全的呢
蓄电池仿真概述
Linear推出高压、低噪声、低压差电压线性稳压器
介绍温湿度试验箱的选择注意要点
人脸识别考勤打卡机上线 智能化刷脸考勤更高效
模具设计术语解析
基于区块链技术的划时代游戏以太星际介绍
3D打印机+AR技术体系的强强联合 将给我们的生活带来很多便利
「新手教程」介绍光模块的用途及分类
多任务TDCS车站分机通信协议的设计
崇达技术三项科技成果推动PCB行业高质量发展
机器人竞选市长,荒谬奇谈
联想柳传志:联想的多元化发展不会停止 旗下子公司都会陆续上市
Xilinx主管全球数据中心业务的副总裁Freddy赴深访问恒扬数据总部
稳压管和tvs管的区别 tvs管可以当稳压管用吗