400 likes | 580 Views
補充資料. 資訊安全 資料來源: Visual C# 2005 資訊安全程式設計(張宇超編著,松崗出版). 背景. 在資訊安全的概念下,軟體開發者將不再以撰寫系統功能為唯一目標,而必須兼顧功能與安全。安全性的問題可能包括: 資料保密 身份辨識 入侵偵測 .NET 平台提供了完整的安全機制與類別庫幫助程式開發者撰寫高安全性、高穩定性的系統。. 學習目標. 加密程式開發實務 對稱金鑰加密 RijnDael 對稱式金鑰加密程式開發 非對稱金鑰加密 數位簽章. 對稱式金鑰加密. 背景說明 現今加密技術可約略分為
E N D
補充資料 資訊安全 資料來源: Visual C# 2005資訊安全程式設計(張宇超編著,松崗出版)
背景 • 在資訊安全的概念下,軟體開發者將不再以撰寫系統功能為唯一目標,而必須兼顧功能與安全。安全性的問題可能包括: • 資料保密 • 身份辨識 • 入侵偵測 • .NET平台提供了完整的安全機制與類別庫幫助程式開發者撰寫高安全性、高穩定性的系統。
學習目標 • 加密程式開發實務 • 對稱金鑰加密 • RijnDael對稱式金鑰加密程式開發 • 非對稱金鑰加密 • 數位簽章
對稱式金鑰加密 • 背景說明 • 現今加密技術可約略分為 • 對稱式金鑰加密演算法(Symmetric Key Encryption) • 資料傳送過程中使用相同的金鑰進行加密及解密 • 在雙方交換訊息前,即是先持有一個共同的密鑰;當甲方傳輸前,先以該金鑰對明文編碼成密文,乙方收到後,再以同一把金鑰將密文解碼回明文。 • 非對稱式金鑰加密演算法(Asymmetric Key Encryption) • 資料傳送過程中使用不同的金鑰進行加密及解密
專有名詞解釋 • 明文(Plain Text) • 未經過編碼,原始可讀的資訊。 • 密文(Encrypt Text) • 經過編碼,無明確意義的資訊。 • 密鑰(Secret Key) • 在加密/解密演算法中使用的鍵值(Key),可能是一段資訊或字串。在對稱式金鑰加密法中,傳輸的雙方持有相同內容的密鑰。 • 加密演算法(Encryption Algorithm) • 利用密鑰對明文進行加密編碼動作的演算法。 • 解密演算法(Decryption Algorithm) • 利用密鑰對密文進行解密解碼的演算法。
加密演算機制的特性 • 加密演算機制必須滿足的四大特性: • 身份認證性(Authentication) • 確認溝通對象的身份與辨識溝通對象的資料內容。 • 機密性(Confidentiality) • 將重要的訊息、機密檔、電子契約等重要資訊以金鑰進行加密,確保只有許可權的人才可讀取。 • 完整性(Integrity) • 確保傳輸的內容在傳送與接收都是一致的、未經竄改的。 • 不可否認性(Non-repudiation) • 傳送端在傳送資料後,無法抵賴傳送該項資料內容。
對稱式金鑰演算法的優缺點 • 優點 • 加密、解密運算快。 • 缺點 • 無法有效處理「金鑰分送」與「數位簽章」的問題。 • 因為溝通訊息的雙方必須先持有共同的金鑰,故在金鑰的分送上,就成為該加密法的一大罩門。 • 網路分送:安全漏洞。 • 人工分送:浪費成本。 • 解決方法:非對稱性金鑰加密演算法 • 速度快,所以適合應用程式專屬檔案的加密解密;或可配合非對稱式金鑰加密演算法作其他的整合應用。
.NET支援的對稱金鑰加密演算法 • .NET Framework提供以下四種對稱性加密演算法:
Rijndael加密演算法 • 命名空間 • System.Security.Cryptography • 建立物件 • Rijndael rd = Rijindael.Create(); • Rijndael rd = new RijndaelManaged(); • 常用公用屬性: • KeySize: • 秘密金鑰的長度,以位元為單位。 • Key: • 加密演算法的秘密金鑰;在對稱性金鑰加密演算法中,加密解密所使用的的金鑰必須相同。 • IV: • 對稱演算法的初始化向量(Initial Vector)。實務開發上,初始化向量用來打亂原有的密鑰,始有心者更難對加密內容進行破解。 • 對稱性金鑰加密,雙方的金鑰和初始化向量必須相等。
金鑰長度選擇 • BlockSize: • 密碼編譯作業的區塊大小(緩衝區大小),以位元為單位。 • 緩衝區長度與金鑰長度可隨系統開發者自行選定,但必須位於合法的長度範圍內,且滿足「遞增原則」。 • 例如:Rijndael要求金鑰的長度在128~256位元之間,且以64位元遞增。意指,金鑰長度可選定128、192、256位元其中之一。 • 若緩衝區長度更改,需注意初始化向量也需修改,因為初始化向量長度必須和緩衝區長度一致,如此可避免錯誤產生。 Rijndael rd = Rijndael.Create(); Rd.BlockSize = 128; Rd IV = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
程式開發技巧 • 若欲加密的資料量超過既定的緩衝區大小,就必須採取分段加密的方式來因應。善用CrytoStream物件,便可以免除開發緩衝區塊的處理流程,大幅縮短程式的開發時間。 • CrytoStream結合MemoryStream與加密/解密演算法,將記憶體串流當成輸出/輸入的目標(命名空間:System.IO)。 • 結合StreamWriter/StreamReader直接從來源寫入/讀取來源資料,最後以字串變數型態回傳加密/解密的結果
textBox1 textBox2 textBox3 textBox4 練習題一 • 請建立以下介面: • 當按下「Encrypt」,將textBox1中的訊息加密成密文輸出於textBox2;當按下「Decrypt」,將textBox3中的訊息加密成密文輸出於textBox4。
練習題一 • 公用變數 • 定義密鑰與初始化向量 byte[] byteKey1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; byte[] byteIV = { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; • button1_Click(Encrypt) • button2_Click(Decrypt)
練習題一 • 設定密鑰的方式可以下面方式作改變 • 請注意,編碼的轉換必須以ASCII編碼作轉換,使得每個byte長度為8位元。 • 註:初始化向量的長度必須配合密鑰長度的大小
公開(非對稱式)金鑰加密法 • 背景 • 1976年Diffie與Hellman提出;1978Rivest、Shamir及Adlman提出著名的RSA公開金鑰密碼系統,遂將此一理念付諸實現。 • 專有名詞定義 • 明文(Plain Text) • 密文(Encrypt Text) • 公鑰(Public Key) • 每個參與者會產生一組公鑰,用來對訊息作加密。此公鑰可以公布在一個公開的註冊處或發送給其他人。 • 私鑰(Private Key) • 與公鑰組成金鑰對,由參與者保留私用。
運作流程 • 此加密法需產生兩把金鑰,一把用以加密,另一把用以解密。 • 此兩把金鑰完全不相同,但具有某種關聯性,有心人士即使知道得知演算與加密金鑰,仍須另一把解密金鑰。 • 範例: • 甲乙雙方欲傳送資料,各自產生自己的金鑰組,包含一支公鑰,一支私鑰。 • 當甲欲傳送資料給乙方,甲用乙方的公鑰來加密(因為乙方的公鑰是公開的,所以可以輕易取得) • 當乙方收到加密的文件,再用自己的私鑰來解密。
公開(非對稱)金鑰加密法優缺點 • 優點 • 縱使內容被第三者竊取,缺乏接收端的私鑰,依然無法進行破解。 • 解決金鑰傳輸的問題;使用者的金鑰自行產生一組金鑰對,公鑰自行公開,讓大家皆能取得。 • 使用者可以不定期產生公鑰與私鑰,並將新的公鑰重新發佈即可。 • 缺點 • 與對稱性金鑰加密演算法相比,進行公開(非對稱)金鑰加密法耗時甚久。 • 實作上,通常交互運用兩種加密機制,來克服各自的缺點。
數位簽章運作流程 • 原則上,要傳給別人,則使用他人的的公鑰加密,對方再用自己的私鑰解密。 • 但在公開(非對稱)金鑰的加密機制中,如果我用我自己的私鑰對訊息加密,則別人可以用我的公鑰來對訊息來解密。 • 使用私鑰來加密,公鑰來解密,即可達到數位簽章(Digital Signature)的功能。 • 因為私鑰只有自己保管,故用私鑰加密的資訊可以視為該使用者的簽章,表示真的由本人所送出。 • 達到加密演算法「不可否認」之特性。
數位簽章運作流程示意圖 • 由於公開(非對稱)金鑰加密法運算較慢,所以在實作數位簽章時,通常會先將資訊經過雜湊運算,再從取出訊息摘要,再以私鑰針對訊息進行加密。
數位信封運作流程 • 由於公開(非對稱)金鑰加密法運算較慢,使得執行效率不彰,目前在開放性網路環境中多以對稱金鑰系統和公開金鑰系統整合使用,以善加利用兩者之優點。也因此產生「數位信封」(Digital Envelope)的應用 • 甲方隨機產生一組對稱式的密鑰,希望透過這把密鑰來與乙方溝通(所以乙方也必須具備這把金鑰);因此,再透過非對稱金鑰加密機制,用乙方的公鑰把加密此把密鑰,再傳給乙方去解碼,就可以得到雙方共有的密鑰。以進行對稱式金鑰的加解密。
整合數位簽章與數位信封的訊息傳送方案 • 以數位信封交換溝通的密鑰。 • 如甲方欲傳送資料給乙方,甲方用此密鑰對訊息進行加密,並且以自己的私鑰,將訊息的雜湊值加密成數位簽章,連同先前加密後得到的密文傳送給乙方。 • 乙方接收後,利用密鑰解碼得到訊息明文,再以甲方的公鑰來解密以驗證數位簽章。
.NET公開(非對稱)金鑰加密系統相關類別 • RSA與RSACryptoServiceProvider • RSA為1978年由美國麻省理工學院的Rivest、Shamir與Adleman三人提出,通稱為RSA公開金鑰密碼系統或RSA數位簽章法。 • RSA類別為此方法的基底類別,RSACryptoServiceProvider為繼承RSA的實作類別。 • 一旦建立物件自動產生預設的金鑰對(1024位元),包括公鑰與私鑰。 • 也提供方法幫助程式開發者匯入或匯出公鑰或私鑰的資訊。 • 命名空間: • System.Security.Cryptography
金鑰對結構(RSAParameters) • RSAParameters結構 • 試想,如果產生的金鑰沒有保存起來,那麼豈不是僅能在該物件生命週其中使用而已? • 利用.NET Framework當中的「RSAParameters」結構取出RSA或RSACryptoServiceProvider物件當中的金鑰對資訊,如此便能達到保存金鑰對資訊的目的。 • RSA類別與RSAParameters相關方法成員 • public abstract RSAParameters ExportParameters(bool includePrivateParameters) • 從RSA物件匯出金鑰資訊 • 參數給true代表將公鑰與私鑰一併輸出,傳入false僅會匯出公鑰資訊。 • public abstract void ExportParameters(RSAParameters parameters) • 接收RSAParameters結構型態以匯入金鑰資訊至RSA物件當中。
CryptoConfig類別 • 讓程式開發者存取加密組態資訊 • 常用方法: public static string CryptoConfig.MapNameToOID (string name) • 用來對應演算法名稱的物件識別項OID(雜湊演算法識別項)
練習題二:數位簽章程式開發實務 • 實作上,公開(非對稱)金鑰加密法不適合直接用來對資料進行加密;但可運用「數位信封」的觀念,結合對稱式金鑰加密法來達到密鑰保密的目的。 • 因此,本練習的目的在於運用RSA法來進行數位簽章的驗證。 • 本練習題請引入下列命名空間 • System.Security.Cryptography • 本練習題使用「MD5」雜湊值計算演算法 • Message Digest Algorithm 5,為90年代初由麻省理工學院的電腦科學實驗室和RSA Data Security公司的Ronald L. Rivest所研發出來,為現今最廣為使用的雜湊計算演算法。
練習題二 • 公用變數 • 定義RSA物件和RSA金鑰 RSACryptoServiceProvider RSAProvider = null; RSAParameters rsapPrivate; RSAParameters rsapPublic; • Form1_Load
練習題二 • button1_Click
練習題二 • button2_Click