- 热门文章:
- · 把.NET程序部署到没有安装.NET Framwork的机器上
- · 在.NET下编写中文代码程序
- · ADO 与ADO.NET
- · C#异步数据接收串口操作类
- · 用 .NET 开发的轻量级 UI 测试自动化
- · .net下开发COM+组件
- · 深入理解.NET 的JIT编译方式
- · .Net配置文件常用配置说明
- · 完整的在.net后台执行javascript脚本集合
- · .net手机软件开发(六)OBEX应用——文件传输部分
- · .net手机软件开发(5)——OBEX介绍
- · .NET Framework General Reference - Capitalization Styles
上一篇:.net中xmlhttp下载文件的方法参考 >>
.net Compact Flamework中MD5CryptoServiceProvider的实现
最近出于工作需要对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
相关文章:
- · Framework 类库的事件编程
- · .net下模拟不同身份登陆以获取不同权限
- · .Net 缓存代理类 的初步考虑.
- · 把.NET程序部署到没有安装.NET Framwork的机器上
- · .NET Remoting编程简介
- · 基于.Net Framework的N层分布式应用开发
- · 使用.NET实现视频播放
- · 基于.Net Framework的N层分布式应用开发
- · .NET 程序,调用其它程序
- · 在.net开发中几个重要的认识误区(1)
- · 关于.net下服务安装
- · .NET的自动序列号工具
- · ADO.NET学习笔记(一)
- · .Net配置log4net
- · 一个经典的ADO.NET入门例子
- · 在.net使用代理浏览网页
- · .net 有关多态性的学习笔记。
- · 在.net中读写INI文件
- · 学习笔记《.NET框架程序设计(修订版)》--第三章 共享程序集 (3)
- · MyCollege.Net系统规划与总体设计
- · 学习笔记《.NET框架程序设计(修订版)》--第三章 共享程序集 (2)
- · Metadata and Reflection in .NET
- · 在.net执行sql脚本的简单实现
- · .Net下WebMethod属性
- · .NET客户端应用程序:.NET应用程序更新组件(6)
- · .NET客户端应用程序:.NET应用程序更新组件(5)
- · 创建分布式应用程序学习心得
- · 基于组件的.NET软件开发(1)
- · .net关于企业Excel报表的生成
- · 使用 Visual C# .NET 在 ADO.NET 中以编程方式构建连接字符串
- · 让用户通过宏和插件向您的 .NET 应用程序添加功能
- · Visual Basic.NET和GDI+共创图标编辑器
- · Visual Basic .NET 中动态加载类 (三)
- · Visual Basic .NET 中动态加载类 (二)
- · Visual Basic .NET 中动态加载类(一)
- · 我的.Net下应用程序发布问题的简易解决方案
- · 关于自定义事件的一点体会
- · .net 中的事务总结
