複製鏈接
請複製以下鏈接發送給好友

.NET

(免費開源開發平台)

鎖定
.NET是一種用於構建多種應用的免費開源開發平台,可以使用C#F#Visual Basic編寫.NET應用。 [10]  .NET用於生成多種類型的應用程序和庫開發Web應用、Web API和微服務、雲中的無服務器函數、雲原生應用、移動應用、桌面應用、Windows WPF、Windows窗體、通用 Windows平台 (UWP)、遊戲、物聯網 (IoT)、機器學習控制枱應用、Windows服務。.NET類庫在不同應用和應用類型中共享功能,無論構建哪種類型的應用,代碼和項目文件看起來都一樣,可以訪問每個應用的相同運行時、API和語言功能。 [1] 
軟件名稱
.NET
軟件平台
Windows、LinuxmacOSDocker [2] 
上線時間
2000年11月
最近更新時間
2021年2月9日
軟件語言
C#,F#,VB等
開發商
Microsoft [2] 
軟件授權
MIT和Apache 2許可證 [3] 
軟件版本
5.0.6 [4] 
3.1.15(LTS)
2.1.28(LTS)
軟件大小
5.6 至 6.8 MB

.NET產生背景

.NET是開放源代碼(託管於GitHub),使用 MIT 和 Apache 2 許可證。.NET 是 .NET Foundation 的項目。.NET就是微軟用來實現XML,Web Services,SOA(面向服務的體系結構service-oriented architecture)和敏捷性的技術。對技術人員,想真正瞭解什麼是.NET,必須先了解.NET技術出現的原因和它想解決的問題,必須先了解為什麼他們需要XML,Web Services 和 SOA。技術人員一般將微軟看成一個平台廠商。微軟搭建技術平台,而技術人員在這個技術平台之上創建應用系統。從這個角度,.NET也可以如下來定義:.NET是微軟的新一代技術平台,為敏捷商務構建互聯互通的應用系統,這些系統是基於標準的,聯通的,適應變化的,穩定的和高性能的。從技術的角度,一個.NET應用是一個運行於.NET Framework之上的應用程序。(更精確的説,一個.NET應用是一個使用.NET Framework類庫來編寫,並運行於公共語言運行時Common Language Runtime之上的應用程序。)如果一個應用程序跟.NET Framework無關,它就不能叫做.NET程序。比如,僅僅使用了XML並不就是.NET應用,僅僅使用SOAP SDK調用一個Web Service也不是.NET應用。
2014年4月的Build開發者大會上,微軟宣佈開源一批.NET庫和相關技術,成立.NET基金會去管理和引導開源組件的開發。微軟還將在Apache 2.0許可證下開源Roslyn編譯器堆棧,Roslyn是微軟所謂的編譯器即服務,包含了C#和 Visual Basic.NET 編譯器。.NET基金會由來自微軟、GitHubXamarin的代表組成,Xamarin由GNOME創始人Miguel de Icaza等人創建,開發.NET開源實現。Xamarin向基金會貢獻了它的部分庫。de Icaza在接受採訪時表示,微軟已經變了,不僅僅移除了許可證中的限制,而且與Xamarin合作徵求設計反饋,在創作共用許可證下發布文檔。
2014年11月13日,為了進一步擴大雲計算市場,微軟將不再把.NET和Visual Studio等關鍵軟件技術侷限在Windows平台,今後還將兼容Linux、Mac OS X、iOS和Android。除此之外,微軟還宣佈將開放.NET核心服務器運行環境和框架的源代碼,使得外部開發者也可以對這一軟件開發平台做出貢獻。 [3] 
作為這一變化的一部分,微軟將允許開發者使用.NET運行環境和框架,來為Linux和Mac開發基於服務器和雲端的應用。微軟還推出了功能齊全的新版Visual Studio 2013,並將免費對獨立開發者、學生、小企業等用户開放。 [3] 

.NET運行環境

.NET 5 和.NET CORE均支持 Windows, Linux, 和macOS系統。 [5] 
如圖《版本歷史及Windows 所安裝的版本》所示,彙總了版本歷史記錄以及標識 Windows 所安裝的版本。
版本歷史及Windows 所安裝的版本 版本歷史及Windows 所安裝的版本
每個新版本的 .NET Framework 都會保留早期版本中的功能並會添加新功能。 CLR 由其自己的版本號確定的。 某些版本的 .NET Framework 包含新版本的 CLR,而其他版本的 .NET Framework 使用早期版本的 CLR。 例如,.NET Framework 4 包含 CLR 4,而 .NET Framework 3.5 包含 CLR 2.0。 (沒有版本 3 的 CLR。)雖然 .NET Framework 4.5 是 .NET Framework 4 的就地更新,基礎 CLR 版本號成為 CLR 4.5。
通常,您不應卸載計算機上安裝 .NET Framework 的任何版本,因為您使用的應用程序可能取決於特定版本,並且可能中斷,如果移除該版本。 您可以同時在一台計算機上加載 .NET Framework 的多個版本。 這意味着可以安裝 .NET Framework,而無需卸載舊版本。

.NET應用組件

.NET客户端應用

組成.net軟件技術的組件,組件之一,“智能”客户端應用軟件操作系統,包括PC、PA、手機或其他移動設備通過互聯網、藉助Web Services技術,用户能夠在任何時間、任何地點都可以得到需要的信息和服務。例如:可以在手機上閲讀新聞、定購機票、瀏覽在線相冊等等。CRM系統,應用了.NET的解決方案後所有的業務人員便可以通過手機或PDA直接訪問客户信息了 [6] 

.NETWebServices

Web Services是智能終端軟件的基礎,微軟為用户創建智能終端提供了一整套豐富的解決方案,包括:
.NET Framework- 智能終端實現跨平台(設備無關性)的
Visual Studio .NET – 建立並集成Web Services和應用程序的快速開發工具
Microsoft Windows Server 2003 – 新一代的企業服務器,用於提供建立和發佈各種解決方案
Microsoft Office Professional Edition 2003 – 內建的工具集也能幫助開發智能終端
.net .net
Web Services是.NET的核心技術。正如Web是新一代的用户與應用交互的途徑,XML是新一代的程序之間通訊的途徑一樣,Web Services是新一代的計算機與計算機之間一種通用的數據傳輸格式,可讓不同運算系統更容易進行數據交換。Web Services有以下幾點特性:Web services允許應用之間共享數據;Web services分散了代碼單元;基於XML這種internet數據交換的通用語言,實現了跨平台、跨操作系統、跨語言。那微軟的ASP和Web services究竟有什麼不同呢,ASP仍然是一個集中式計算模型的產物,只不過是披着一層互聯網的外衣。但Web Services卻是一個迥然不同的精靈,它秉承“軟件就是服務”的真言,同時順應分佈式計算模式的潮流。而它的存在形式又與以往軟件不同。這種組件模式,小巧、單一,對於開發人員來講,開發成本較低。
在這裏指出Web services不是微軟發明的,同樣也不屬於微軟專有。Web services是一個開放的標準,和HTTP、 XML、SOAP一樣。他們是一個工業標準而非微軟標準,WS-I是為了促進Web Services互通性的聯盟組織,最初是由IBM和微軟所發起,其它的成員包括BEA System、惠普計算機(HP)、甲骨文(Oracle)、英特爾(Intel)和SUN 計算機(Sun Microsystem)。如今網絡上存在的大多Web services其實沒有使用.NET構架,Web services具有互操作屬性,你同樣可以使用Windows開發客户端來調用運行於Linux上面的Web services的方法。

.NET接口規範

microsoft .net microsoft .net
先前提到的接口規範問題,在.NET中,Web service接口通常使用Web Services Description Language (WSDL)描述。WSDL 使用XML來定義這種接口操作標準及輸入輸出參數,看起來很像COM和CORBA的接口定義語言(IDLS)Interface Definition Languages。接口定義後就必須使用一些協議調用接口,如SOAP協議,SOAP源於一種叫做XML RPC(XML遠程進程調用remote procedure calling)的協議,而Java則根據XML-RPC發展了自己的JAX-RPC協議用來調用Web Services。發佈和訪問Web Services的接口就用到UDDI了,這裏我們只需要知道WSDL使用XML定義Web Services接口,通過SOAP訪問Web Services,在internet上尋找Web Services使用UDDI就行了。服務器架構——Microsoft Windows Server System Microsoft提供了最佳的服務器構架—Microsoft Windows Server System—便於發佈、配置、管理、編排Web Services。為了滿足分佈式計算的需要微軟構造了一系列的服務器系統,這些內建安全技術的系統全部支持XML,這樣加速了系統、應用程序以及同樣使用Web Services的夥伴應用之間的集成。
Microsoft Windows Server System包括:
Microsoft Application Center 2000 - 配置和管理Web應用程序
Microsoft BizTalk Server 2002 - 建立基於XML的跨應用和組織的商業邏輯
visual studio .net visual studio .net
Microsoft Commerce Server 2002 – 能夠迅速建立大規模電子商務的解決方案
Microsoft Content Management Server 2002 – 管理動態電子商務網站的目錄
Microsoft Exchange Server 2000 – 用於進行隨時隨地的通訊協作
Microsoft Host Integration Server 2000 – 用於和主機系統之間傳輸數據
Microsoft Internet Security and Acceleration Server 2000 (ISA Server) – internet連接
Microsoft Mobile Information Server 2002 – 用於支持手持設備
Microsoft Operations Manager 2000 – 描述企業級解決方案的操作管理
Microsoft Project Server 2002 - 提供項目管理的最佳方案
Microsoft SharePoint Portal Server 2001 – 查詢、共享、發佈商業信息
Microsoft SQL Server 2000 – 企業級數據庫
Microsoft Visual Studio .NET和Microsoft .NET Framework對於建立,發佈並運行Web Services解決方案。
微軟官方的教程。 [7] 

.NETCLR 與 CIL

NET Framework 環境 NET Framework 環境
.NET的初級組成是CIL和CLR。CIL是一套運作環境説明,包括一般系統、基礎類庫和與機器無關的中間代碼,全稱為通用中間語言(CIL)。CLR則是確認操作密碼符合CIL的平台。在CIL執行前,CLR必須將指令及時編譯轉換成原始機械碼。
所有CIL(通用中間語言)都可經由.NET自我表述。CLR檢查元資料以確保正確的方法被調用。元資料通常是由語言編譯器生成的,但開發人員也可以通過使用客户屬性創建他們自己的元資料。
如果一種語言實現生成了CIL,它也可以通過使用CLR被調用,這樣它就可以與任何其他.NET語言生成的資料相交互。CLR也被設計為作業系統無關性。
當一個彙編體被載入時,CLR執行各種各樣的測試。其中的兩個測試是確認與核查。在確認的時候,CLR檢查彙編體是否包含有效的元資料和CIL,並且檢查內部表的正確性。核查則不那麼精確。核查機制檢查代碼是否會執行一些“不安全”的操作。核查所使用的演算法非常保守,導致有時一些“安全”的代碼也通不過核查。不安全的代碼只有在彙編體擁有“跳過核查”許可的情況下才會被執行,通常這意味着代碼是安裝在本機上的。
通過.NET,你可以用SOAP和不同的Web services進行交互。

.NET3.0版本

.NET Framework 3.0(曾用名WinFX)是微軟為操作系統Windows Vista(舊稱“Longhorn”)而特別設計的API。.NET Framework是對.NET架構和Win32 API的擴展。雖然Win32 API仍然存在於Windows Vista中,但是在WinFX中不能通過它直接調用。另外,WinFX將提供給.NET程序員更加簡便地方式來調用Windows中的功能
.NET Framework 3.0同樣能在Windows XPWindows Server 2003的計算機上運行,這樣增加了能夠運行.NET Framework 3.0程序的計算機數量。由於向後兼容,能夠更加容易將這些技術介紹給開發人員和最終用户。2006年9月1日,微軟發佈了.NET Framework 3.0的RC版本,開發人員能夠無需安裝Vista就可以體驗這些新的技術。
.NET Framework 3.0並沒有新版本的CLR,而是在.NET Framework 2.0的基礎上增加了幾個新的部件,所以並沒有任何程序設計語言有新的語法特性,如果要安裝.NET Framework 3.0,則必須先安裝.NET Framework 2.0,.NET Framework 3.0可以完全向下兼容.NET Framework 2.0。
.NET Framework 3.0主要由的四部分組成:
  • WPF(Windows Presentation Foundation),內部代碼“Avalon”,是一套基於XAML(eXtensible Application Markup Language)、.NET和矢量圖技術的全新的圖形界面系統和API,它充分利用了計算機的3D顯卡硬件功能和Direct3D技術。
  • WCF(Windows Communication Foundation),內部代碼“Indigo”,是一個面向服務的通訊框架,利用它可以實現本地和遠程的程序之間的交互。
  • WF(Workflow Foundation)於2005年8月公開,微軟提供的工作流引擎,通過它可以實現任務的自動化和事務的集成。
  • InfoCard是一個軟件組件的代碼,用來安全的保存和使用用户的數字身份,並提供統一的界面來針對特定的事務選擇身份,例如登陸一個網站。

.NET動態編程

C#是靜態強類型語言。而在很多情況下,提供“動態”行為,是常常發生的事情,例如通過反射在運行時訪問.NET類型、調用動態語言對象、訪問COM對象等,都無法以靜態類型來獲取。因此, C# 4.0引入的又一個全新的關鍵字dynamic,也同時引入了改善靜態類型與動態對象的交互能力,這就是動態查找(Dynamic Lookup)例如:
public static void Main() 
{
  dynamic d = GetDynamicObject();
  d.MyMethod(22); // 方法調用
  d.A = d.B; // 屬性賦值
  d[“one”] = d[“two”]; //索引器賦值
  int i = d + 100; // 運算符調用
  string s = d(1,2); // 委託調用
}
就像一個object可以代表任何類型,dynamic使得類型決斷在運行時進行,方法調用、屬性訪問、委託調用都可動態分派。同時,動態特性還體現在構建一個動態對象,在C# 4.0實現IDynamicObject接口的類型,可以完全定義動態操作的意義,通過將C#編譯器作為運行時組件來完成由靜態編譯器延遲的操作,例如:
dynamic d = new Foo();
string s;
d.MyMethod(s,3,null);
在具體執行過程中,C#的運行時綁定器基於運行時信息,通過反射獲取d的實際類型Foo,然後在Foo類型上就MyMethod方法進行方法查找和重載解析,並執行調用,這正是動態調用的背後秘密:DLR。在.NET 4.0中將引入重要的底層組件DLR(Dynamic Language Runtime,動態語言運行時),除了實現動態查找的基礎支持,DLR也同時作為基礎設施為類似於IronRuby、IronPython這樣的動態語言提供統一的互操作機制。總而言之,動態編程將為C#在以下領域產生巨大的變革:
· Office編程與其他COM交互。
·動態語言支持,在C#中消費IronRuby動態語言類型將並非難事,體驗動態語言特性指日可待。
· 增強反射支持。
以調用IronPython為例,我們只需引入IronPython.dll,IronPython.Modules.dll,and Microsoft.Scripting.dll,即可通過創建ScriptRuntime在C#中HostingIronPython環境,進而來操作動態語言的類型信息。
ScriptRuntime py = Python.CreateRuntime();
dynamic mypy = py.UseFile("myfile .py");
Console.WriteLine(mypy.MyMethod("Hello"));
雖然從微軟當前提供的技術資料和CTP演示中,動態查找還存在或多或少的問題,但是在“動態”大行其道的今天,我們無法迴避也必須擁抱這個未來的主角,因為我堅信明天會更好。

.NET並行計算

並行計算的出現,是計算機科學發展的必然結果,隨着計算機硬件的迅猛發展,在多核處理器上工作已經是既存事實,而傳統的編程模式必須兼容新的硬件環境才能使計算機性能達到合理的應用效果。用Anders大師的話説:未來5到10年,並行計算將成為主流編程語言不可忽視的方向,而4.0為C#打響了實現併發的第一槍。
未來的.NET Framework 4.0中將集成TPL(Task Parallel Library)和PLINQ(Parallel LINQ),這也意味着未來我們可以應用C# 4.0實現並行化應用,在統一的工作調度程序下進行硬件的並行協調,這將大大提高應用程序的性能同時降低現存併發模型的複雜性。
那麼,我們應該一睹為快應用C#武器來開發併發環境下的超酷感受,在System.Threading.Parallel 靜態類提供了三個重要的方法For、Foreach、Invoke可以為我們小試牛刀:
//應用TPL,執行並行循環任務
Parallel.For(0,10,i =>{DoSomething(i);});
在線程爭用執行情況下,相同的操作在雙核平台下運行,以StopWatch進行精確時間測試,並行環境下的執行時間為 2001ms,而非並行環境下的執行時間為4500ms,並行運算的魅力果然名不虛傳。我們再接再厲應用PLINQ執行對於並行運算的查詢、排序等,當前PLINQ支持兩種方式ParallelEnumerable類和ParallelQuery類,例如:
int[] data = new int[] { 0,1,2,3,4,5,6,7,8,9 };
int[] selected = (from x in data.AsParallel()select x + 1).ToArray();
更詳細的對比示例留待讀者在實踐中對此進行討論,並行計算為託管代碼在多核環境下的性能優化提供了統一的解決方案,而未來我們會做的更好。
備註:實際上,我們可以選擇下載安裝Microsoft Parallel Extensions to the .NET Framework 3.5June 2008 CTP包,就可以在.NET 3.5環境下體驗並行計算的無窮魅力。

.NET協變和逆變

協變和逆變,是為解決問題而生的。而要理清解決什麼樣的問題,需要首先從理清幾個簡單的概念開始。首先我們進行一點操作:
Derived d = new Derived();
Base b = d;
Derived類型繼承自Based類型,由Derived引用可以安全的轉換為Based引用,而這種轉換能力可以無縫的實現在Derived數組和Base數組,例如:
Derived[] ds = new Derived[5];
Base[] bs = ds;
而這種原始轉換(由子類轉換為父類)方向相同的可變性,被稱為協變(covariant);其反向操作則被稱為逆變(contravariant)。當同樣的情形應用於泛型時,例如:
List ds = new List();
List bs = ds;
類似的操作卻是行不通的。所以,這就成為C# 4.0中完善的問題——泛型的協變與逆變:
List bs = new List(); List ds = new List();
bs = ds; //List;支持對T協變
ds = bs; //List;支持對T逆變
而在C# 4.0中,伴隨着協變與逆變特性的加入,C#引入兩個in和out關鍵字來解決問題。
public interface ICovariant {
T MyAction();
}
public interface IContravariant
{
void MyAction(T arg);
}
其中,out表示僅能作為返回值的類型參數,而in表示僅能作為參數的類型參數,不過一個接口可以既有out又有in,因此既可以支持協變、支持逆變,也可以同時支持,例如:
public interface IBoth
{
}

.NET默認參數

命名參數和可選參數是兩個比較簡單的特性,對於熟悉其他編程語言的開發者來説可選參數並不陌生,為參數提供默認值時就是可選參數:
public void MyMethod(int x,int y = 10,int z = 100) {
}
因此,我們可以通過調用MyMethod(1)、MyMethod(1,2)方式來調用MyMethod方法。而命名參數解決的是傳遞實參時,避免因為省去默認參數造成的重載問題,例如省去第二個參數y調用時,即可通過聲明參數名稱的方式來傳遞:
MyMethod(20,z: 200);
相當於調用MyMethod(20,10,200),非常類似於Attribute的調用方式。雖然只是小技巧,但也同時改善了方法重載的靈活性和適配性,體現了C#語言日趨完美的發展軌跡。
當然,除此之外.NET 4.0還增加了很多值得期待的平台特性,也將為C#編碼帶來前所未有的新體驗。
以上相關版權歸作者。

.NET.NET控件

.NET標準控件根據其應用環境分為兩類:
Windows Form控件:主要用於Windows應用程序的開發。所有的Windows控件都是從Control類中派生來的,該類包含了所有用户界面的Windows Form組件,其中也包括Form類。Control類中包括了很多位所有控件所共享的屬性、事件和方法。它包含複選框、文本框、按鈕、標籤、圖像列表等。
Web窗體控件:主要用於Web應用程序的開發。它是專門針對Asp.NETWeb窗體設計的服務器控件。Web窗體控件包含在命名空間System.Web.UI.WebControls中,當用户使用Visual Studio創建Web窗體頁面時,會自動在後台代碼文件中添加引用該命名空間的Using語句。 [8] 
.NET Compact Framework 提供了可以滿足大多數設備項目需要的Windows Form控件。若要使用這些控件沒有的功能,可以從公共控件派生您自己的自定義控件。可以通過定義從 Control 類或從程序集中的現有 UserControl 繼承的公共類型創建自定義控件。
最簡單的控件自定義是重寫公共控件的方法。例如,可以重寫 TextBox 控件的 OnKeyPress 繼承方法,提供將輸入限制為數字字符的代碼。
如若覺得自定義控件過於浪費時間和複雜,也可以從受信任的來源下載控件,並通過添加引用來導入自定義控件。支持這些自定義的.NET的控件有:ComponentOne Studio,Spread,ActiveReportsMultiRow [9]  等。

.NET加密處理

信息安全是計算機應用的首要問題之一,但關於.NET加密功能的範例卻少之又少。有鑑於此,本文探討了在.NET平台下加密/解密文件的一般過程,並提供了一個加密/解密文件的工具。
Web服務以不容置疑的態勢迅速發展,促使許多單位開始考慮.NET之類的開發平台。但是,出於對安全問題的擔心,一些單位總是對採用新技術心存顧慮。好在有許多成熟的安全和網絡技術,例如虛擬私有網絡(VPN)和防火牆等,能夠極大地提高Web服務應用的安全和性能,讓開發者擁有選擇安全技術的自由,而不是非得使用尚在發展之中的XML安全技術不可。
雖然安全是信息系統的首要問題,但有關.NET安全和加密工具的範例卻少之又少。看看大多數.NET書籍的目錄,找不到任何有關安全的題目,更不用説關於密碼系統的探討了。
有鑑於此,本文將介紹如何在VB開發中運用.NET的加密和密鑰生成類,提供一個可用來加密和解密文件的工具Cryption。有了這個工具,你就可以在硬盤上保存各種機密文件,例如所有的密碼/用户名字信息、收支文件、以及其他想要保密的信息,還可以加密那些通過Internet發送的文件。加密技術的用途非常廣泛,你可以進一步定製本文提供的工具滿足某些特殊需要,例如增加批處理能力等。

.NET安全威脅

攻擊和泄密是計算機面臨的兩大安全威脅。攻擊可能來自病毒,例如它會刪除文件、降低機器運行速度或引發其它安全問題。相比之下,泄密往往要隱蔽得多,它侵害的是你的隱私:未經授權訪問硬盤文件,截取通過Internet發送的郵件,等等。泄密還可能伴隨着攻擊,例如修改機密文件等。
針對泄密的最佳防範措施就是加密。有效的加密不僅杜絕了泄密,而且還防範了由泄密引發的攻擊。加密技術有時還用於通信過程中的身份驗證——如果某個用户知道密碼,那麼他應該就是那個擁有這一身份的人。
然而必須説明的是,沒有一種防範泄密的安全技術是絕對堅固的,因為密碼有可能被未經授權的人獲得。

.NET加密前提

首先,要想使用.NET的安全功能,就必須用Imports語句引入加密用的包。試驗本文涉及的任何代碼之前,請在VB代碼窗口的頂部加入下列Imports語句:
Imports System
Imports System.Text
Imports System.Security.Cryptography
第二,美國政府過去限制某些加密技術出口。雖然這些限制不再有效,.NET框架在Windows的出口版本中禁用了“高級”加密技術。如果你的 Windows不帶高級加密能力,可以從微軟網站下載更新包:對於Windows 2000,安裝Service Pack 2包含的High Encryption Pack;對於NT,安裝Service Pack 6a。對於Windows ME、95、98的用户,IE 5.5也包含了High Encryption Pack。

.NET工具概況

本文提供的工具可用來加密和解密文件,如果你急着給一些文件加密,只需直接啓動本文後面提供的工具即可。
這個工具提供了一個用來輸入文件名字的文本框和一個輸入密鑰的文本框,通過便捷的用户界面提供加密、解密和密鑰生成功能。上方的文本框用來輸入待加密/解密文件的名字;下面的文本框用來輸入8個字符的密碼。執行加密操作之後將生成一個新的文件,這個經過加密的文件和原始文件在同一目錄下,文件名字也和原始文件的一樣,但加上了“xx”後綴,例如,假設原始文件是MyFile.txt,則加密得到的文件是MyFilexx.txt。
加密好之後,原始文件不一定非刪除不可,但一般來説最好刪除,因為加密的根本目的就是為了隱藏原始文件的數據。如果要從加密後的文件恢復出原始文件,在上面的文本框中輸入MyFilexx.txt,然後提供密碼,Cryption工具將創建一個與原始文件一樣的MyFile.txt文件。也就是説, Cryption把文件名字後面的“xx”看作是要求解密密文的標誌。
注意:加密文件之後如果忘記了用來加密該文件的密碼,再想恢復出原始文件就不可能了。當然,這與密碼本身的複雜程度有關,要想保證文件的安全,最好採用較複雜的密碼,例如混合運用字母、數字和特殊字符(如“$”符號等)。
.NET提供的加密技術不止一種,不過本文討論的主要是對稱加密對稱加密也稱為私有密鑰加密,它的特點是加密和解密用的是同一個密鑰(實際上是同一種算法),解密方和加密方都有責任保障密碼的安全(對於公用密鑰、不對稱加密,密鑰一共有兩個,其中一個密鑰是公開的,這是當前公認最有效的加密技術,但就速度而言要比對稱加密算法慢不少)。
在正式利用.NET加密類加密文件之前,首先必須從用户提供的密碼生成一個密鑰。密鑰可以利用Hash函數生成,Hash函數把用户的密碼字符串轉換成一組類似隨機數序列的、無意義的數據,這組數據可作為密鑰使用,在加密過程中對原始數據進行唯一性變形處理。
例如,用密鑰加密數據的一種辦法是把原始數據的ASCII碼加上密鑰的ASCII碼:
密鑰:ab = ASCII: 97,98
數據:merry = ASCII: 109,101,114,114,121
把這組數據的ASCII碼加上密鑰的ASCII碼(必要時重複使用密鑰),得到的加密結果是:
97 98 97 98 97
+109 +101 +114 +114 +121
206 199 211 212218
對於同樣的數據,Hash算法總是生成同樣的結果(這就是説,對於同一個密碼,同一Hash算法總是生成相同的bit序列)。實際上,在本文提供的代碼中,利用.NET的SHA1CryptoServiceProvider類的ComputeHash方法可以驗證這一點,例如,對於同一個輸入參數 morph,任何時候該方法總是返回下面的結果:124,230,93,253,197,206,136,72。因此,如果有人知道密碼以及生成密鑰的算法,他也可以輕鬆地推算出密鑰。

.NET加密/解密

.NET加密技術要求密鑰有確定的長度,例如,DES(Data Encryption Standard)函數要求密鑰的長度是64位,Rijndael則要求128、192或256位長度的密鑰。密鑰越長,加密強度越高。對於DES之外的加密算法,查詢LegalKeySizes屬性即可得到它允許的密鑰長度,包括MinSize(支持的最小密鑰長度)、MaxSize(最大密鑰長度)、 SkipSize(增量)。SkipSize表示密鑰最大長度和最小長度之間可用長度的間隔,例如,Rijndael算法的SkipSize值是64位。
利用下面的代碼可以得到密鑰的長度信息:
' 創建DES加密對象
Dim des As New DESCryptoServiceProvider()
Dim fd() As KeySizes
fd = des.LegalKeySizes() 'tells us the size(s),in bits
MsgBox("加密類型=" & des.ToString() & Chr(13) & "minsize = " & fd(0).MinSize & Chr(13) & _
"maxsize = " & fd(0).MaxSize & Chr(13) & "skipsize = " & fd(0).SkipSize)
運行上面的代碼,得到的結果是64、64、0。如果把加密對象的聲明改成TripleDESCryptoServiceProvider(),得到的結果是128、192、64。
説明:DES算法要求輸入一個8字節的密碼,但實際使用的密鑰只有56位(7個字節),每一個字節的最後一位不用(它作為校驗位使用,但不用於實際的加密過程)。
下面的代碼開始生成本文示例程序的密鑰:
Public Class Form1
Inherits System.Windows.Forms.Form
' 保存密鑰的8字節的數組
Private TheKey(7) As Byte
' 在向量中放入一些隨機數據
Private Vector() As Byte = {&H12,&H44,&H16,&HEE,&H88,&H15,&HDD,&H41}
首先,代碼定義了保存密鑰和初始向量(請參見稍後的詳細説明)的兩個變量。向量的初值這裏用隨機數據填充,當然,通過密碼和Hash算法也可以獲得向量的初值。下面的過程從用户輸入的密碼創建出密鑰:
Sub CreateKey(ByVal strKey As String)
' 保存密鑰的字節數組
Dim arrByte(7) As Byte
Dim AscEncod As New ASCIIEncoding()
Dim i As Integer = 0
AscEncod.GetBytes(strKey,i,strKey.Length,arrByte,i)
' 獲得密碼的Hash值
Dim hashSha As New SHA1CryptoServiceProvider()
Dim arrHash() As Byte = hashSha.ComputeHash(arrByte)
' 將Hash值保存到密鑰
For i = 0 To 7
TheKey(i) = arrHash(i)
Next i
End Sub
用户的密碼(strKey)傳入到CreateKey過程,分解成一組ASCII值保存到一個字節數組。把這個字節數組傳遞給 SHA1CryptoServiceProvider類的ComputeHash方法,返回一個Hash值。把這個Hash值保存到TheKey數組,供以後的加密/解密過程使用(注意SHA1CryptoServiceProvider實際能夠支持160位,但本文示例程序只用到64位)。
那麼,初始向量究竟起什麼作用呢?這個字節數組有8個元素,就象密鑰一樣,但向量和密鑰的作用是不同的,向量用來避免DES之類的算法一個特有的問題。在DES之類的算法中,原始數據被分成8字節一塊然後分別處理。DES在加密一塊數據時,要用到前一塊數據的模式,也就是説,如果改動了原始數據中第一塊的某個字符,所有後繼的塊的內容都將隨之改變,從而避免了一系列相連接的塊中出現重複塊的問題。
例如,假設你一時高興,發了一個郵件,內容只有幾個重複的單詞“Melanie! Melanie! Melanie! Melanie!”,在密鑰和塊序列中前一塊的共同作用下,加密之後的密文不會出現重複現象。然而,進一步考慮這個加密過程可以發現,如果用同一個密鑰加密多個郵件,且郵件開頭的問候語都相同,則郵件開頭的一部分很容易受到攻擊。由於這個原因,我們用初始向量來模擬前一個塊。
本文加密/解密工具中的下面這段代碼示範瞭如何加密文件:
Sub Encrypt(ByVal inName As String,ByVal outName As String )
Try
' 創建緩衝區
Dim storage(4096) As Byte
' 已經寫入的字節數量
Dim totalBytesWritten As Long = 8
' 每次寫入的字節數量
Dim packageSize As Integer
' 聲明文件流
Dim fin As New FileStream(inName,FileMode.Open,FileAccess.Read)
Dim fout As New FileStream(outName,FileMode.OpenOrCreate,FileAccess.Write)
fout.SetLength(0)
'源文件的大小
Dim totalFileLength As Long = fin.Length
' 創建加密對象
Dim des As New DESCryptoServiceProvider()
Dim crStream As New CryptoStream(fout,_
des.CreateEncryptor(TheKey,Vector),_
CryptoStreamMode.Write)
' 輸出加密後的文件
While totalBytesWritten < totalFileLength
packageSize = fin.Read(storage,0,4096)
crStream.Write(storage,0,packageSize)
totalBytesWritten = Convert.ToInt32(totalBytesWritten + _
packageSize / des.BlockSize * des.BlockSize)
End While
crStream.Close()
Catch e As Exception
MsgBox(e.Message)
End Try
End Sub
注意這段代碼創建了三個文件流:fin,表示明文形式的原始文件;fout,加密結果文件;crStream,加密流,用來把DES加密的結果轉入輸出文件fout。增加一個crStream流的好處是不必把結果保存到臨時文件或緩衝區。
加密過程與解密過程的唯一重要區別是,執行解密時,我們將使用DESCryptoServiceProvider對象的另一個方法CreateDecryptor,除此之外,兩者其餘的處理步驟(包括參數,文件流,等等)基本相同。

.NET防止破解

黑客和密碼專家破解加密文件的辦法主要有兩個,第一是搜索密文是否有重複現象,第二是用暴力破解法獲得密鑰。首先我們考慮一下初始向量如何防止重複現象,然後再探討一下防止暴力破解的關鍵問題。
破解密文的第一種方式是搜索樣本——特別是重複的樣本。人們在寫信的時候總是喜歡用同樣的文字開頭,例如“親愛的XXX”、“Dear Sir”等,如果多個郵件的開頭文字相同且通過同一密鑰加密,則每個密文信件的開頭也相同。假設Antonio寫給Melanie的所有加密信件都有相同的問候語“@4^F (2$@Fx”,解密者就會首先檢查開頭的幾個單詞是不是“Dear Melanie”。解密機密文件的一個重要步驟就是猜測文件中應當會出現的幾個單詞,所以我們不應該給解密者提供這種方便。在本文的示例中,初始向量的內容被附加到文件的開頭,從而防止了出現重複現象。只有信件的開頭才容易受到此類攻擊。
計算機的運算速度和精度要遠遠超過人,特別擅長處理一些重複的任務,例如嘗試每一種可能的密鑰組合最終破解密鑰。DES加密算法本身是不安全的,這種加密算法早在70年代就已經公之於眾。而且,破解者如果想要讓搜索密鑰的過程自動化,同樣可以方便地運用.NET的DESCryptoServiceProvider類。
對於一個128位、結合運用密鑰/初始向量的加密方案,計算機嘗試每一種可能的密鑰組合要花多少時間?專家們的看法並不一致,有人認為需要數月,也有人認為裝有專用硬件的價值6位數的計算機每秒能夠驗證數十億個密鑰,破解DES密文只需數小時。如果你的機密值得花數月時間去破解,那麼最好改用 TripleDES或其他加密算法。從TripleDES的名字也可以猜出,這種加密方式採用三重數據加密標準算法,所以密鑰的長度是192位,而不是 64位的DES密鑰。記住,在其他條件相同的情況下,密鑰越長,安全程度越高。
結束語:現在你已經瞭解了. NET DES加密算法的使用過程,接下去可以研究.NET的其他安全功能,包括極具吸引力的公用密鑰加密方案。雖然公用密鑰加密方案執行起來速度慢一些,但加密效果一般要比TripleDES好。
參考資料