证书实现非对称加密/解密的代码如下 

//非对称加密密钥 

static byte[] RSAEncrypt(byte[] enkey, X509Certificate2 Certificate) 

{ 

RSACryptoServiceProvider RSA = Certificate.PublicKey.Key as RSACryptoServiceProvider; 

return RSA.Encrypt(enkey, false); 

} 

//非对成解密密钥 

static byte[] RSADecrypt(byte[] context, X509Certificate2 Certificate) 

{ 

RSACryptoServiceProvider RSA = Certificate.PrivateKey as RSACryptoServiceProvider; 

return RSA.Decrypt(context, false); 

} 

使用证书的公钥加密,使用证书的私钥解密

  

对称加密算法进行消息的加密和解密,代码如下: 

//对称加密消息内容 

static byte[] Encrypt(SymmetricAlgorithm RC2, string bodystring) 

{ 

MemoryStream ms = new MemoryStream(); 

CryptoStream encStream = new CryptoStream(ms, RC2.CreateEncryptor(), CryptoStreamMode.Write); 

StreamWriter sw = new StreamWriter(encStream); 

sw.WriteLine(bodystring); 

sw.Close(); 

encStream.Close(); 

byte[] buffer = ms.ToArray(); 

ms.Close(); 

return buffer; 

} 

//对称解密消息内容 

static string Decrypt(byte[] CypherText, SymmetricAlgorithm RC2) 

{ 

MemoryStream ms = new MemoryStream(CypherText); 

CryptoStream encStream = new CryptoStream(ms, RC2.CreateDecryptor(), CryptoStreamMode.Read); 

StreamReader sr = new StreamReader(encStream); 

string val = sr.ReadLine(); 

sr.Close(); 

encStream.Close(); 

ms.Close(); 

return val; 

}

  

发送加密消息

static void Send()

{

MessageQueue mq = new MessageQueue(DestinationQueue);

//mq.EncryptionRequired = EncryptionRequired.Body;

//mq.FormatName = new BinaryMessageFormatter();

Message message = new Message();

//采用二进制序列化

message.Formatter = new BinaryMessageFormatter();// new XmlMessageFormatter(new Type[] { typeof(string) });

//获取x509证书

X509Certificate2 certificate = GetCertificate();

//使用x509证书非对称加密对称加密密钥

RC2CryptoServiceProvider RC2 = new RC2CryptoServiceProvider();

byte[] key=RSAEncrypt(RC2.Key, certificate);

byte[] iv = RSAEncrypt(RC2.IV, certificate);

byte[] extarry= new byte[256];

key.CopyTo(extarry, 0);

iv.CopyTo(extarry, 128);

//保存使用非对称加密后的对称加密密钥

message.Extension = extarry;

//message.DestinationSymmetricKey = RSAEncrypt(RC2.Key, certificate);

//设定使用非对称加密的证书

//message.DigitalSignature = certificate.RawData;

message.SenderCertificate = certificate.RawData;

message.UseEncryption = false;

//message.AcknowledgeType = AcknowledgeTypes.PositiveReceive | AcknowledgeTypes.PositiveArrival;

//message.AdministrationQueue = new MessageQueue(@"thinkpad-t400\private$\myAdministrationQueue");

//message.UseJournalQueue = true;

message.UseDeadLetterQueue = true;

//设定对消息体对称加密算法

message.EncryptionAlgorithm = EncryptionAlgorithm.Rc2;

//message.ConnectorType = new Guid("1E9A03C5-A9B5-4BF6-B0CB-CCB313275285");

message.Label = Guid.NewGuid().ToString();

//生成同步加密key

//MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();

//SHA256CryptoServiceProvider hsa = new SHA256CryptoServiceProvider();

//byte[] keyArray = hsa.ComputeHash(System.Text.Encoding.ASCII.GetBytes(DestinationSymmetricKey));

//message.HashAlgorithm = System.Messaging.HashAlgorithm.Sha;

// RC2.Key = keyArray;

//使用RC2算法进行加密

byte[] enarry = Encrypt(RC2, BodyString);

string base64 = Convert.ToBase64String(enarry);

message.Body = enarry;

//message.SecurityContext = new SecurityContext();

Console.WriteLine("send encrypt message \r\n" + BodyString);

mq.Send(message, MessageQueueTransactionType.Single);

}

接收加密的消息

static void Receive()

{

MessageQueue mq = new MessageQueue(DestinationQueue);

//设定读取消息中证书,扩展属性中加密过的解密密钥

mq.MessageReadPropertyFilter.DestinationSymmetricKey = true;

mq.MessageReadPropertyFilter.Extension = true;

mq.MessageReadPropertyFilter.SenderCertificate = true;

mq.MessageReadPropertyFilter.DigitalSignature = true;

Message message=mq.Receive(MessageQueueTransactionType.Single);

message.Formatter = new BinaryMessageFormatter();

//获取证书

byte[] cert = message.SenderCertificate;

X509Certificate2 x509 = new X509Certificate2(cert);

x509 = GetCertificateBySubject(x509.Subject);

Console.WriteLine(x509.Thumbprint.ToString());

byte[] key = new byte[128];

byte[] iv = new byte[128];

for(int i=0;i<message.Extension.Length;i++)

{

if(i<128)

key[i] = message.Extension[i];

else

iv[i - 128] = message.Extension[i];

}

//还原对称加密密钥

key = RSADecrypt(key, x509);

iv = RSADecrypt(iv, x509);

//解密消息

RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();

rc2.Key = key;

rc2.IV = iv;

byte[] body = message.Body as byte[];

string bodystring= Decrypt(body, rc2);

Console.WriteLine("receive message " + bodystring);

}

证书实现非对称加密/解密的代码如下

//非对称加密密钥

static byte[] RSAEncrypt(byte[] enkey, X509Certificate2 Certificate)

{

RSACryptoServiceProvider RSA = Certificate.PublicKey.Key as RSACryptoServiceProvider;

return RSA.Encrypt(enkey, false);

}

//非对成解密密钥

static byte[] RSADecrypt(byte[] context, X509Certificate2 Certificate)

{

RSACryptoServiceProvider RSA = Certificate.PrivateKey as RSACryptoServiceProvider;

return RSA.Decrypt(context, false);

}

使用证书的公钥加密,使用证书的私钥解密

MSMQ消息加密的更多相关文章

  1. 【转】MSMQ消息队列安装

    一.Windows 7安装.管理消息队列1.安装消息队列   执行用户必须要有本地 Administrators 组中的成员身份,或等效身份.   具体步骤:    开始—>控制面板—>程 ...

  2. MSMQ消息队列安装

    一.Windows 7安装.管理消息队列1.安装消息队列   执行用户必须要有本地 Administrators 组中的成员身份,或等效身份.   具体步骤:    开始—>控制面板—>程 ...

  3. 即时通信系统中如何实现:聊天消息加密,让通信更安全? 【低调赠送:QQ高仿版GG 4.5 最新源码】

    加密重要的通信消息,是一个常见的需求.在一些政府部门的即时通信软件中(如税务系统),对聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新的GG 4.5中,增加了对聊天消息 ...

  4. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  5. 微软MSMQ消息队列的使用

    首先在windows系统中安装MSMQ 一.MSMQ交互 开发基于消息的应用程序从队列开始.MSMQ包含四种队列类型: 外发队列:消息发送到目的地之前,用它来临时存储消息. 公共队列:在主动目录中公布 ...

  6. C# 将MSMQ消息转换成Json格式 【优化】

    C# 将MSMQ消息转换成Json格式  [优化] 转换函数: private string ConvertToJSON(string label, string body) { //TODO: co ...

  7. 即时通信系统中实现聊天消息加密,让通信更安全【低调赠送:C#开源即时通讯系统(支持广域网)——GGTalk4.5 最新源码】

    在即时通讯系统(IM)中,加密重要的通信消息,是一个常见的需求.尤其在一些政府部门的即时通信软件中(如税务系统),对即时聊天消息进行加密是非常重要的一个功能,因为谈话中可能会涉及到机密的数据.我在最新 ...

  8. WCF使用安全证书验证消息加密

    首先安装 服务端安全证书  代码如下:  // 下面第一行是安装证书,第二行是将证书列入信任 makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=lo ...

  9. 【6】.net msmq消息队列实例

    1.msmq消息队列windows环境安装 控制面板---->程序和功能---->启用或关闭Windows程序---->Microsoft Message Queue(MSMQ)服务 ...

随机推荐

  1. Linux 上配置 AG

    SQL Server Always On Availability Group 配置步骤:配置三台 Linux 集群节点创建 Availability Group配置 Cluster Resource ...

  2. python 操作 elasticsearch-7.0.2 遇到的问题

    错误一:TypeError: search() got an unexpected keyword argument 'doc_type',得到不预期外的参数 解决方法:elasticsearch7里 ...

  3. 2019_软工实践_Beta(1/5)

    队名:955 组长博客:点这里! 作业博客:点这里! 组员情况 组员1(组长):庄锡荣 过去两天完成了哪些任务 文字/口头描述  检测网站不合理的地方,给组员定下相应时间进度的安排 展示GitHub当 ...

  4. Redis配置讲解及实战

    前言 Redis是一个开源的内存k-v数据库,同时也可用作缓存,消息队列.支持多种数据类型,如字符串,列表,字典,集合,有序集合. 演示环境 $ uname -a Darwin Darwin Kern ...

  5. excel打开csv 出现乱码

    现在做舆情分析的相关项目,在数据处理的时候,发现了一个问题.将数据写入到csv文件,用excel打开(默认)就会出现乱码,如果将数据写入到.xlsx文件就不会出现乱码,因为csv是通用格式,所以我猜想 ...

  6. Spring cloud微服务安全实战-7-8ELK+SpringBoot环境搭建

    采集不可聚合的离散的.日志信息的e ELK是三个系统的简称 LogStash:用来做日志的收集.过滤.格式转换 Kibana:和普罗米修斯的grafana一个意思.主要用来展示数据. 用docker来 ...

  7. 基因型数据正负链怎么翻转(snp flip)

    在合并数据过程当中,经常会发现不同来源的数据正负链不是统一的,这是一件很头疼的事. 正负链没有统一的情况下直接合并在一起会产生什么后果呢. 举个最简单的例子,假如我们从小明和小红分别拿到了一批基因型数 ...

  8. (转载)CNN 模型所需的计算力(FLOPs)和参数(parameters)数量计算

    FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度.是一个衡量硬件性能的指标. FLOPs:注意s小写,是f ...

  9. exports module.exports export export default之间的关系

    exports 和module.exports是CommonJS模块规范 export export default是ES6模块的规范,两者完全是不同的概念. node应用由模块组成,采用的是Comm ...

  10. 算法练习之杨辉三角,杨辉三角的第 k 行,买卖股票的最佳时机

    1. 杨辉三角 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 输出: [ [], [,], [,,], [ ...