.net Compact Flamework中MD5CryptoServiceProvider的实现

在.net Flamework完全版中对System.Security.Cryptography名字空间下的加密类支持得很好。但在精简版中却没有提供这个名字空间中的相应的类。在用.net写Pocket PC程序的时候用的加密算法的时候确实比较麻烦。一般有两种方法来解决这个问题。OpenNetCF(www.openetcf.org)提供了System.Security.Cryptography名字空间下的各个类的模拟,但它的提供缺乏灵活性:比如在对称加密的时候,用户无法设置Padding, CipherMode等属性。而且它的提供方式和完全版的.net下的类的接口不一致,这样给用户造成困惑。另一种方法就是自己动手对cryptoAPI进行自己封装。

最近出于工作需要对MD5CryptoServiceProvider进行了实现,这个类的接口和完整版下面的接口完全一致。

Implementation of the "System.Security.Cryptography.MD5CryptoServiceProvider" class.

public sealed class MD5CryptoServiceProvider : MD5

{

public MD5CryptoServiceProvider()

{

Initialize();

m_Disposed = false;

}

public override void Initialize()

{

if (m_Disposed)

throw new ObjectDisposedException(this.GetType().FullName);

if (m_Hash != IntPtr.Zero)

{

Crypto.CryptDestroyHash(m_Hash);

}

m_Prov = Crypto.AcquireContext(ProvType.RSA_FULL);

bool retVal=Crypto.CryptCreateHash(m_Prov, (uint)CalgHash.MD5, IntPtr.Zero, 0, out m_Hash);

}

protected override void HashCore(byte[] array, int ibStart, int cbSize)

{

if (m_Disposed)

throw new ObjectDisposedException(this.GetType().FullName);

byte[] copy = (byte[]) array.Clone();

//Array.Copy(array, ibStart, copy, 0, cbSize);

bool retVal=false;

retVal=Crypto.CryptHashData(m_Hash, copy, copy.Length, 0);

}

protected override byte[] HashFinal()

{

if (m_Disposed)

throw new ObjectDisposedException(this.GetType().FullName);

byte [] data = new byte[0];

uint dataLen = 0;

uint flags = 0;

//size

bool retVal = Crypto.CryptGetHashParam(m_Hash, (uint) HashParam.HASHVAL, data, ref dataLen, flags);

if(234 == Marshal.GetLastWin32Error())//MORE_DATA = 234,

{

//data

data = new byte[dataLen];

retVal = Crypto.CryptGetHashParam(m_Hash, (uint) HashParam.HASHVAL, data, ref dataLen, flags);

}

return data;

}

protected override void Dispose(bool disposing)

{

if (!m_Disposed)

{

if (m_Hash != IntPtr.Zero)

{

bool retVal=Crypto.CryptDestroyHash(m_Hash);

m_Hash = IntPtr.Zero;

}

if(m_Prov!=IntPtr.Zero)

{

Crypto.CryptReleaseContext(m_Prov, 0);

m_Prov=IntPtr.Zero;

}

try

{

GC.SuppressFinalize(this);

}

catch {}

m_Disposed = true;

}

}

~MD5CryptoServiceProvider()

{

Clear();

}

private IntPtr m_Hash=IntPtr.Zero;

private bool m_Disposed;

private IntPtr m_Prov=IntPtr.Zero;

}

public abstract class MD5 : HashAlgorithm

{

// Constructor.

protected MD5()

{

HashSizeValue = 128;

}

// Create a new instance of the "MD5" class.

public new static MD5 Create()

{

return (MD5)(CryptoConfig.CreateFromName

(CryptoConfig.MD5Default, null));

}

public new static MD5 Create(String algName)

{

return (MD5)(CryptoConfig.CreateFromName(algName, null));

}

}; // class MD5

P/Invoke the cryotoAPI

public class Crypto

{

[DllImport("coredll.dll", EntryPoint="CryptAcquireContext")]

public static extern bool CryptAcquireContext(out IntPtr hProv, string pszContainer, string pszProvider, uint dwProvType, uint dwFlags);

[DllImport("coredll.dll", EntryPoint="CryptCreateHash")]

public static extern bool CryptCreateHash(IntPtr hProv, uint Algid, IntPtr hKey, uint dwFlags, out IntPtr phHash);

[DllImport("coredll.dll", EntryPoint="CryptDestroyHash")]

public static extern bool CryptDestroyHash(IntPtr hHash);

[DllImport("coredll.dll", EntryPoint="CryptHashData")]

public static extern bool CryptHashData(IntPtr hHash, byte[] pbData, int dwDataLen, uint dwFlags);

[DllImport("coredll.dll", EntryPoint="CryptGetHashParam", SetLastError=true)]

public static extern bool CryptGetHashParam(IntPtr hHash, uint dwParam, byte[] pbData, ref uint pdwDataLen, uint dwFlags);

[DllImport("coredll.dll", EntryPoint="CryptReleaseContext")]

public static extern bool CryptReleaseContext(IntPtr hProv, uint dwFlags);

public static IntPtr AcquireContext()

{

return AcquireContext("MD5Container", ProvName.MS_ENHANCED_PROV, ProvType.RSA_FULL, ContextFlag.NONE);

}

public static IntPtr AcquireContext(string container)

{

return AcquireContext(container, ProvName.MS_ENHANCED_PROV, ProvType.RSA_FULL, ContextFlag.NONE);

}

public static IntPtr AcquireContext(ProvType provType)

{

return AcquireContext(null, null, provType, ContextFlag.NONE);

}

public static IntPtr AcquireContext(string provName, ProvType provType)

{

return AcquireContext(null, provName, provType, ContextFlag.NONE);

}

public static IntPtr AcquireContext(string provName, ProvType provType, ContextFlag conFlag)

{

return AcquireContext(null, provName, provType, conFlag);

}

public static IntPtr AcquireContext(string conName, string provName, ProvType provType)

{

return AcquireContext(conName, provName, provType, ContextFlag.NONE);

}

public static IntPtr AcquireContext(string conName, string provName, ProvType provType, ContextFlag conFlag)

{

IntPtr hProv;

bool retVal = Crypto.CryptAcquireContext(out hProv, conName, provName, (uint) provType, (uint) conFlag);

if(!retVal) //try creating a new key container

{

retVal = Crypto.CryptAcquireContext(out hProv, conName, provName, (uint) provType, (uint) ContextFlag.NEWKEYSET);

}

if(hProv == IntPtr.Zero)

throw new Exception("System.Security.Cryptography");

return hProv;

}

}

代码下载在codeproject上有:http://www.codeproject.com/useritems/MD5CryptoServiceProvider.asp

Reference:

Dot NET Compact Framework Kick Start 2003

www.opennetcf.org

http://www.koders.com/csharp/fidC21861B5F1B717EC1FDEC006DBD0B8226B92D878.aspx

时间: 2024-08-04 03:56:48

.net Compact Flamework中MD5CryptoServiceProvider的实现的相关文章

在Pocket PC中使用Web Service连接数据库

web|连接数据库 在Pocket PC中使用Web Service连接数据库前言微软的移动开发者大会在六月的北京举行了,国内的移动应用软件虽然是刚刚起步,但是这个前景宽广的领域已经受到越来越多软件厂商的关注了.移动设备上的商业应用尽管刚刚起步,但已经显示出巨大的发展潜力. 在微软移动开发挑战赛中,我的作品<饕餮元年无线餐饮管理系统>获得了商业应用的三等奖.为了实现Pocket PC与后台数据库服务器的连接,我的作品中使用了.Net CompactFramework和Web Service技术

.NET Compact Framework通过托管Win32代码获得HtmlDocument

问题引入: 有过CF的项目经验的朋友一定常常遇到与BS后台对接的问题,HTML在BS系统中有着得天独厚的条件,他能够直接被用作界面显示,并且能够被C#代码和Javascript操作,因此在一些应用中BS系统可能采取在数据库中存储HTML表单的设计,例如一些表单可视化设计控件(Table Designer)生成的就是HTML,直接存储HTML的好处在于绕过了解析HTML DOM的复杂性,可是在前端与之对接的Mobile应用程序中就带来的问题,当我的.NET CF程序读取到包含HTML的字段后就显得

移动WCF: 使用.NET Compact Framework编写IM应用程序

本文讨论: .NET Compact Framework 中的邮件传输 编写简单消息传送应用程序 WCF 消息传送内幕探测 消耗 WCF Web 服务 本文使用了以下技术: .NET Compact Framework 3.5, Visual Studio 2008 移动设备的寻址能力问题一直以来都非常棘手,它 会使编写从服务器接收推送数据的 Windows Mobile 应用程序变得非常困难.小型设备一般都不具 有与其绑定的静态 IP 地址或动态 DNS 项.对于此类设备,常见的解决方法是在设

HBase源码分析之HRegion上compact流程分析(三)

        在<HBase源码分析之HRegion上compact流程分析(二)>一文中,我们没有讲解真正执行合并的CompactionContext的compact()方法.现在我们来分析下它的具体实现.         首先,CompactionContext表示合并的上下文信息,它只是一个抽象类,其compact()并没有实现,代码如下: /** * Runs the compaction based on current selection. select/forceSelect

MySQL数据库中CHAR与VARCHAR区别介绍

在mysql数据库系统中,char和varchar是非常常见的,它们两个也非常的相似,都是用来保存相对较短的字符串,如保存文章标题.留言.email.用户名等. 二者的主要区别在于存储方式: char列长度是创建表时声明的长度而且固定不变,长度被限制在0到255之间.而varchar列中的值是可变长度字符串,长度也为0-255,在5.0.3之后长度延长到65535. 在查询显示数据的时候,char会删除字符串尾部的空格(仅仅是尾部),而varchar则完全保留这些空格.这样我们在显示char类型

SQL Server 2005 CE软件环境需求

由于SQL Server 2005 Compact Edition和SQL Server 2005是同时代的产品,所以它们之间的互操作和结合性较之以前的SQL Server版本要好,为此如果要考虑使用SQL Server 2005 Compact Edition中的合并复制和远程数据访问技术进行数据同步的话,最好是使用SQL Server 2005作为后端的数据库. 现在只要是能运行Visual Studio 2005的计算机都可以满足本专题具备的硬件要求(具体的软硬件要求大家可以查看SQL S

基于SQL Server CE的移动服务系统开发

移动服务是应用比较广泛的移动解决方案,其核心是利用移动计算和无线通信技术为企业现场服务人员提供全面.便捷.实时的信息服务.我们现在就为某电器制造商设计一套用于售后维修服务的移动解决方案. 该电器制造商目前售后维修服务的基本工作流程是:客户打电话报修,呼叫中心记录用户的基本信息(如姓名.地址和电话等等)和客户对故障的描述信息,生成维修单,维修服务人员领取维修单,维修服务人员上门为客户服务,填写维修记录单(如实际故障,维修所用零部件,维修所用时间等),客户签字认可,维修服务人员交回维修记录单,呼叫中

HBase基础

Hbase简介 HBase-Hadoop Database,是一个高可用性,面向列,可伸缩的分布式存储系统,利用HBase技术可在廉价的PC Server上搭建起大规模 结构化存储集群. HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统:Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HBase中

HBase技术架构介绍

HBase简介 HBase – Hadoop Database,是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBase技术可在廉价PC Server上搭建起大规模结构化存储集群. HBase是Google Bigtable的开源实现,类似Google Bigtable利用GFS作为其文件存储系统,HBase利用Hadoop HDFS作为其文件存储系统:Google运行MapReduce来处理Bigtable中的海量数据,HBase同样利用Hadoop MapReduce来处理HB