.NET(免費開源開發平台)

.NET(免費開源開發平台)

本詞條是多義詞,共2個義項
更多義項 ▼ 收起列表 ▲

.NET是一種用於構建多種套用的免費開源開發平台,可以使用C#F#Visual Basic編寫.NET套用。.NET用於生成多種類型的應用程式和庫開發Web套用、Web API和微服務、雲中的無伺服器函式、雲原生套用、移動套用、桌面套用、Windows WPF、Windows窗體、通用 Windows平台 (UWP)、遊戲、物聯網 (IoT)、機器學習控制台套用、Windows服務。.NET類庫在不同套用和套用類型中共享功能,無論構建哪種類型的套用,代碼和項目檔案看起來都一樣,可以訪問每個套用的相同運行時、API和語言功能。

基本介紹

  • 軟體名稱:.NET
  • 軟體平台WindowsLinuxmacOSDocker等 
  • 上線時間:2000年11月
  • 最近更新時間:2021年2月9日
  • 軟體語言:C#,F#,VB等
  • 開發商:Microsoft 
  • 軟體授權:MIT和Apache 2許可證 
  • 軟體版本:5.0.6 
    3.1.15(LTS)
    2.1.28(LTS)
  • 軟體大小:5.6 至 6.8 MB
產生背景,運行環境,套用組件,客戶端套用,WebServices,接口規範,CLR 與 CIL,3.0版本,動態編程,並行計算,協變和逆變,默認參數,.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核心伺服器運行環境和框架的原始碼,使得外部開發者也可以對這一軟體開發平台做出貢獻。
作為這一變化的一部分,微軟將允許開發者使用.NET運行環境和框架,來為Linux和Mac開發基於伺服器和雲端的套用。微軟還推出了功能齊全的新版Visual Studio 2013,並將免費對獨立開發者、學生、小企業等用戶開放。

運行環境

.NET 5 和.NET CORE均支持 Windows, Linux, 和macOS系統。
如圖《版本歷史及Windows 所安裝的版本》所示,匯總了版本歷史記錄以及標識 Windows 所安裝的版本。
.NET(免費開源開發平台)
版本歷史及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軟體技術的組件,組件之一,“智慧型”客戶端套用軟體作業系統,包括PC、PA、手機或其他移動設備通過網際網路、藉助Web Services技術,用戶能夠在任何時間、任何地點都可以得到需要的信息和服務。例如:可以在手機上閱讀新聞、定購機票、瀏覽線上相冊等等。CRM系統,套用了.NET的解決方案後所有的業務人員便可以通過手機或PDA直接訪問客戶信息了。

WebServices

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中,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的夥伴套用之間的集成。
.NET(免費開源開發平台)
microsoft .net
Microsoft Windows Server System包括:
Microsoft Application Center 2000 - 配置和管理Web應用程式
Microsoft BizTalk Server 2002 - 建立基於XML的跨套用和組織的商業邏輯
Microsoft Commerce Server 2002 – 能夠迅速建立大規模電子商務的解決方案
.NET(免費開源開發平台)
visual studio .net
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解決方案。
微軟官方的教程。

CLR 與 CIL

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

3.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主要由的四部分組成:

動態編程

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演示中,動態查找還存在或多或少的問題,但是在“動態”大行其道的今天,我們無法迴避也必須擁抱這個未來的主角,因為我堅信明天會更好。

並行計算

並行計算的出現,是計算機科學發展的必然結果,隨著計算機硬體的迅猛發展,在多核處理器上工作已經是既存事實,而傳統的編程模式必須兼容新的硬體環境才能使計算機性能達到合理的套用效果。用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環境下體驗並行計算的無窮魅力。

協變和逆變

協變和逆變,是為解決問題而生的。而要理清解決什麼樣的問題,需要首先從理清幾個簡單的概念開始。首先我們進行一點操作:
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
{
}

默認參數

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

加密處理

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

安全威脅

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

加密前提

首先,要想使用.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。

工具概況

本文提供的工具可用來加密和解密檔案,如果你急著給一些檔案加密,只需直接啟動本文後面提供的工具即可。
這個工具提供了一個用來輸入檔案名稱字的文本框和一個輸入密鑰的文本框,通過便捷的用戶界面提供加密、解密和密鑰生成功能。上方的文本框用來輸入待加密/解密檔案的名字;下面的文本框用來輸入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加密技術要求密鑰有確定的長度,例如,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,除此之外,兩者其餘的處理步驟(包括參數,檔案流,等等)基本相同。

防止破解

黑客和密碼專家破解加密檔案的辦法主要有兩個,第一是搜尋密文是否有重複現象,第二是用暴力破解法獲得密鑰。首先我們考慮一下初始向量如何防止重複現象,然後再探討一下防止暴力破解的關鍵問題。
破解密文的第一種方式是搜尋樣本——特別是重複的樣本。人們在寫信的時候總是喜歡用同樣的文字開頭,例如“親愛的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好。

相關詞條

熱門詞條

聯絡我們