基于C#的SOAP加密方法的研究与实现

时间:2022-03-26 07:55:40

基于C#的SOAP加密方法的研究与实现

摘 要:针对在Web Service中,SOAP消息传输安全的重要性,研究并提出了一种基于C#.NET环境的加密方案,以保证SOAP消息的安全。通过研究SOAP消息加密的密钥交换方法及基本实现模式,将对称加密算法(AES)与非对称加密算法(RSA)相结合,提出了一种数据安全传输的解决方案,并给出了使用C#实现的部分关键代码。实验证明该方案是可行的。

关键词:SOAP; 安全; 数据加密; AES加密算法; RSA公钥算法; C#.NET

中图分类号:TN918-34文献标识码:A

文章编号:1004-373X(2011)01-0112-03

Research and Implementation of SOAP Encryption Based on C#

SU Jin-zhi,LI Zhi-wu

(Vocational and Technological College, Liaoning Shihua University, Fushun 113001,China)

Abstract: For the importance of SOAP messages transfer security in the application of Web Service architecture,an encryption scheme based on C#.NET is studied. By studying the key exchange method and basic implementation mode of SOAP encryption,and combining the symmetric encryption AES algorithm with the asymmetric encryption RSA algorithm,a solution for data security transmission is put forward, and the crucial code is presented by C#. The experimental result shows that the scheme is feasible.

Keywords: SOAP; safety; data encryption; AES encryption algorithm; RSA public key algorithm; C#.NET

0 引 言

简单对象访问协议SOAP是一种不区分应用程序的操作系统、编程环境和对象模型,是可以在应用程序之间交换信息的基于XML的协议[1]。SOAP简单灵活,很容易基于XML构造以文档为中心的消息结构和远程过程调用的标准化封装机制,更重要的是SOAP提供了一个可扩展并可组合的框架,支持Web服务体系结构中的、查找和绑定操作的各种消息构造。Web服务以SOAP消息的格式将运算结果返回给调用者。自从SOAP规范以来,SOAP规范的机密性、认证和授权等安全机制一直就是人们讨论的焦点。为了保证SOAP消息的机密性,SOAP消息发送方必须对SOAP进行加密。

目前,加密SOAP消息常用的方法有SSL和Ws-Security两种[2]。由于大多数情况下SOAP的消息层与传输层是分离的,而且SOAP本身又是单方向的,它的运行方式既可以是同步的,也可以是异步的,因此不能采用SSL协议来解决;而Ws-Security是Microsoft联合IBM和其他几家公司提出的安全协议,它虽然可以选择性地加密SOAP消息中的部分信息,但实现起来比较繁琐。本文介绍一种利用C#语言实现SOAP消息加密和数据安全交换的方法。

1 SOAP的消息组成及加密过程

SOAP协议包括三部分:一个定义描述消息内容的框架的信封、一组表示应用程序定义的数据类型实例的编码规则、表示远程过程调用(RPC)和响应的约定以及SOAP 绑定[3]。SOAP消息的主体部分是“TEXT/XML”形式的MIME类型,并且包含一个SOAP信封,该信封是一个XML文档。其实设计SOAP的目的之一就是利用XML的扩展性和灵活性来封装和交换RPC调用。本文提出的SOAP加密解决方案就是利用XML加密技术[4-5]来对SOAP进行扩展,即使用非对称加密算法加密对称加密的密钥,从而有效保证SOAP消息的安全传输。

这里介绍的方法的基本思路就是:首先,调用方将生成的密钥对中的公钥传送给提供者,提供者接收到该公钥后,进行验证,并用RSA非对称加密算法加密所生成的对称密钥K;提供者利用AES对称加密算法,用所生成的对称密钥K加密SOAP消息,从而创建SOAP消息加密模型并替换原始待加密数据,生成加密的SOAP消息,并将该加密文档发送给调用方;调用方收到加密文档后,对该SOAP消息析取,然后利用之前生成的密钥对中的私钥,借助RSA算法实现对对称密钥K的解密,利用解密出的密钥K和AES算法对已加密的SOAP消息进行解密,从而得到最终解密后的SOAP消息。

本方案用非对称加密RSA算法实现对称加密AES算法的对称密钥的传递,既保证了高安全强度,又避免了加密对象数量大而造成的效率低等缺点。RSA算法是目前被研究和应用得最为广泛的公钥算法[6],AES算法作为DES算法的替代者应用非常广泛,具有速度快、安全性好等特点,而且在硬件和软件实现上执行得很好。

2 解决方案

2.1 对称加密算法的C#实现

下面代码使用AES加密算法实现了SOAP消息的加密。

public static Byte[] AESEncrypt(Byte[] Data, String Key, String IV)

{

Byte[] bKey = new Byte[32];

Array.Copy(Encoding.UTF8.GetBytes_(Key.PadRight(bKey.Length)),bKey, _bKey.Length);

Byte[] bVector = new Byte[16];

Array.Copy(Encoding.UTF8.GetBytes_(Vector.PadRight(bIV.Length)),bIV, _bIV.Length);

Byte[] Cryptograph = null;

// 加密后的密文

Rijndael Aes = Rijndael.Create();

try

{

using (Memory Stream Memory = new_MemoryStream())//开辟一块内存流

{

// 把内存流对象包装成加密流对象

using (CryptoStream Encryptor = new_CryptoStream(Memory,Aes.Create_Encryptor(bKey, bIV),CryptoStream_Mode.Write))

{

// 明文数据写入加密流

Encryptor.Write(Data, 0, Data.Length);

Encryptor.FlushFinalBlock();

Cryptograph = Memory.ToArray();

}

}

}

catch

{

Cryptograph = null;

}

return Cryptograph;

}

使用System.Security.Cryptography命名空间可以对字节数组进行对称加密[7-8]。加密函数需要使用┮桓霆密钥Key和一个初始化向量IV作为输入,需要说明的是加密函数的参数是字节数组,所以必须把密钥和初始向量首先转换为字节数组[7-8]。

解密过程与加密过程相似,解密函数也需要使用┮桓霆密钥Key和一个初始化向量IV作为输入,将密文在内存中包装成加密流对象后,使用如下代码将其转换成明文。

using (MemoryStream originalMemory = new Memory-Stream())

{

Byte[] Buffer = new Byte[1024];

Int32 readBytes = 0;

while ((readBytes = Decryptor.Read_

(Buffer,0, Buffer.Length)) > 0)

{

originalMemory.Write(Buffer, 0, readBytes);

}

original = originalMemory.ToArray();

}

2.2 非对称加密算法的C#实现

非对称加密法需要两步过程来加密一个文件,首先是创建一个公钥/私钥对,然后使用公钥加密,用密钥解密。下面代码应用.NET的System.Security.Cryptography命名空间设计了RSA加密算法[9-10]。

string[]sKeys=new String[2];

RSACryptoServieeProvider rsa = new RSACryptoServiceProvider();//创建RSACryptoServiceProvider对象时,创建了一个公钥/私钥对

sKeys[0]=rsa.ToXmlString(true);

//创建并返回包含当前RSA对象的密钥的XML字符串,true表示同时包含RSA公钥和私钥

sKeys[1]=rsa.ToXmlString(false);// false表示仅包含公钥

//创建RSACryptoServiceProvider对象

//RSA.FromXmlString方法通过XML字符串中的密钥信息初始化RSA对象

//将被加密数据转换为字节数组

//RSACryptoServiceProvider对象的Enerypt方法使用RSA算法来加密数据

RSACryptoServieeProvider rsa = new_RSACryptoServiceProvider();

string plaintext=sSource;

rsa.FromXmlString(sPublicKey);

byte[]cipherbytes;

byte[]byteEn=rsa.Enerypt(Encoding._UTF8.GetBytes(″a″),false);

cipherbytes=rsa.Enerypt(Encoding._UTF8.GetBytes(plaintext),false);

//RSA.FromXmlString方法通过XML字符串中的密钥信息初始化RSA对象

//将被解密数据转换为字节数组

//RSACryptoServiceProvider对象的Encrypt方法使用RSA方法来解密数据

RSACryptoServieeProvider rsa = new_RSACryptoServiceProvider();

rsa.FromXmlString(sPrivateKey);

byte[]byteEn=rsa.Enerypt(Encoding._UTF8.GetBytes(″a″),false);

3 结 语

本文基于C#.NET平台提出了一种SOAP加密的方案。在该SOAP加密过程中,使用RSA与AES两种算法,把非对称加密的安全性和对称加密的快速性结合起来使用,在保留了各自的长处的同时,实现了在整个数据传输过程中,通过非对称加密在不安全的区域安全地传输了用于对称加密的密钥,从而有效保证了SOAP消息的安全传输。RSA与AES的结合,既保证了数据传输的良好安全性,同时又提高了处理效率,具有强大的可执行性。

参 考 文 献

[1]柴晓路,梁字奇.Web Services技术、架构与应用

[2]Microsoft.Microsoft federated security and identity roadmap[EB/OL].[2002-06-06]. /library/default.asp?url=library/en-us/dnwebsrv/htmI/wsfederate.asp.

[3]顾宁,刘家茂,柴晓路,等.Web Services原理与研发实践

[4]车葵,牛晓太,邢书涛.XML加密方法的研究与实现[J].计算机工程与设计,2008,29(20):5180-5183.

[5]叶晓彤.基于DOM的XML部分加密传输的C++实现[J].计算机应用与软件,2004,21(11):111-113.

[6]佟晓筠,王翥,杜宇,等.基于软件安全混合加密技术的研究[J].计算机工程,2004,30(23):98-100.

[7]JAMSA Web服务解决方案应用编程

[8]李文胜.基于RSA算法与对称加密算法的安全通信系统的设计[J].计算机安全,2008(6):41-43.

[9]司义新.NET框架下RSA算法的研究与实现[J].仪器仪表用户,2008(3):100-101.

[10]黄俊.基于RSA算法的注册码软件加密保护[J].计算机应用,2005,25(9):2080-2082,2085.

[11]王赜坤,陈松涛.一种AES密码算法的硬件实现[J].现代电子技术,2010,33(16):10-13.

[12]梅林,梅申信.基于RSA的电子商务信息加密技术研究[J].现代电子技术,2006,29(13):72-73,80.

注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文

上一篇:高效率的小规模Ad Hoc组播路由协议 下一篇:PBG结构分析及其在柱面共形微带天线中的应用