數字簽名RSA簡要原理
數字簽名是一種給以電子形式儲存的訊息簽名的方法。通過這種方法簽名之後的訊息可以通過網路傳輸。數字簽名基於非對稱金鑰加密演算法,如DSA/RSA演算法。從公鑰系統可以立即取得的一個好處是解決了金鑰的管理問題,公鑰系統中的一個新成員僅需要一張公開金鑰表的拷貝,並把他選擇的加密金鑰公佈給大家就可以了。而在許多應用中給傳送的訊息附上一個數字簽名的能力,則是公鑰系統更加重要的好處。
數字簽名的原理如圖所示:圖中m表示明文。
傳送者首先用自己的私有金鑰對訊息m進行編碼,產生了中間的密碼電文cl。這一步對m未提供任何保護,只不過印上了傳送者本人所特有的標記而已(因為用的是隻有他本人才知道的屬於他本人解密使用的私有金鑰)。接著再來第二次的加密,這次使用接收者的公開金鑰,以產生密碼電文c2,它可在開放的通訊通道上予以傳送。接收者收到c2後,先使用他的私有金鑰對此訊息解密,這和通常的處理過程是一樣的,但所得到的結果不是m而是c1,所以還得再用傳送者的公開金鑰來解密,這樣就得到了原來的訊息m。
一般而言,所謂的m不應該是所需傳遞的完整資訊,而只是完整資訊的一個摘要。這裡要涉及到一個MD5數字摘要演算法。MD5數字摘要是目前最流行的一個數字摘要演算法,通過一定的運算,將不等長度的資料加密成一個固定長度的數值,該數值就是此資訊的摘要。數字資訊的摘要再加上公鑰系統,就形成一個完整的數字簽名體系。
MD5(全稱:message digest algorithm 5)演算法是麻省理工學院(MIT)電腦科學實驗室的R.Rvest於上個世紀90年代提出來的,它被網際網路電子郵件保密協議(PEM)指定為訊息壓縮演算法(Message Digest Agorithm)之一,用於數字簽名前對訊息進行安全的壓縮 (secure hashing)。該演算法可以將任意長度的訊息壓縮為128位元
MD5的典型應用是對一段Message(字串)產生Fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫readme.txt檔案中,並對這個readme.txt產生一個MD5的值並記錄在案,然後你可以傳播這個檔案給別人,別人如果修改了檔案中的任何內容,你對這個檔案重新計算MD5值時就會發現它被修改過。如果再有一個第三方的認證機構,用MD5還可以防止檔案作者的“抵賴”,這就是所謂的數字簽名的應用。
這個過程中重要的是傳送者的簽名防止了冒充和否認!這是因為在第一步中建立起來的cl是一個用傳送者的私有金鑰編碼的簽名訊息。任何第三方,如果他不知道傳送者的私有金鑰,他就不可能偽造聲稱由傳送者傳送的訊息。如果他使用別的金鑰,則在最後再解密的階段將不能工作。同樣,傳送者也無法在事後否認他傳送了訊息m。因為,一個訊息若能成功地使用傳送者的公開金鑰來譯解,則原來就必然是用傳送者的私有金鑰編碼的。許多公鑰演算法都可以用於數字簽名。實際用得最廣泛的演算法是美國國家技術標準局(NlsT)在1991年提出的數字簽名演算法DSA(Digital
signature Algorithm)。
在生成RSA數字簽名和驗證RSA數字簽名的時候為什麼需要生成數字摘要? 因為數字摘要就是MD5! ^_^