天天看點

公開密鑰加密

随着Internet使用者的激增,世界正步入網絡經濟的新時代。如網上購物、網上銀行、網上證券等。然而,有一些人利用利用他們所掌握的技術非法侵入他人的計算機系統,竊取、篡改、破壞一些重要的資料,給社會造成巨大的損失。密碼技術的發展與應用,對解決資訊交換的安全問題,保障資料資訊的安全,起着不可忽視的作用。

所謂密碼技術,就是針對資訊進行重新編碼,進而達到隐藏資訊的内容,使非法使用者無法擷取資訊真實内容的一種手段。目前在網絡中,一般采用兩種密碼體制:對稱密鑰體制和非對稱密鑰體制。對稱密鑰體制中的加密密鑰和解秘密鑰是相同的,是以又稱密秘密鑰密碼體制。對稱密鑰算法運算效率高、使用友善、加密效率高,在處理大量資料時被廣泛使用,但其關鍵是要保證密鑰的安全,為安全起見,密鑰要定期改變,是以,對稱密鑰就存在一個如何安全管理密鑰的問題。與對稱密鑰體制相對應的非對稱密鑰體制又稱為公開密鑰密碼體制,它是在1976 年由Diffe 和Hellman 發表的《密碼學的新方向》一文中提出的,從此打破了長期使用單密鑰體制的束縛。自此提出公約密碼思想以後,湧現出很多的公約密鑰算法體系,經過20多年的實踐檢驗,公約系統的應用技術日趨完善,應用領域日趨廣泛。公開密鑰密碼體制,加密密鑰和解秘密鑰是分開采用一對不同的密鑰進行的,分别存在一個公鑰和私鑰,公鑰公開,私鑰保密,并且知道其中一個時并不能從中推出另一個。其典型的算法有背包密碼、RSA等。  其中RSA公約算法系統因為其可靠安全性,易于實作性,更是受大家的認可和歡迎。

RSA加密算法的最大優點就是不需要對密鑰通信進行保密,所需傳輸的隻有公開密鑰,這樣就省去了一條開銷很大的密鑰傳輸信道。其保密性強,密鑰管理友善,并且具有數字簽名、認證和簽别等多種功能,特别适合于現代保密通信的需要。大多數使用公鑰密碼進行加密和數字簽名的産品和标準使用的都是RSA算法。RSA的安全性是基于大數因子分解的困難性。目前一般認為RSA需要1024位以上的字長才有安全保障。由于RSA所采用的模幂運算耗時太多,是以它通常隻能用于加密少量資料或者加密密鑰。需要注意的是,RSA的安全性隻是一種計算安全性,絕對不是無條件的安全性,這是由它的理論基礎決定的。是以,在實作RSA算法的過程中,每一步都應該盡量從安全性方面考慮。本文就RSA算法以及如何用Matlab語言實作給于了詳細的分析。

1  資料加密概述

   密碼學是一門古老而深奧的學科,它對一般人來說是陌生的,因為長期以來,它隻在很少的範圍内,如軍事、外交、情報等部門使用。計算機密碼學是研究計算機資訊加密、解密及其變換的科學,是數學和計算機的交叉學科,也是一門新興的學科。随着計算機網絡和計算機通訊技術的發展,計算機密碼學得到前所未有的重視并迅速普及和發展起來。在國外,它已成為計算機安全主要的研究方向,也是計算機安全課程教學中的主要内容。

  密碼是實作秘密通訊的主要手段,是隐蔽語言、文字、圖象的特種符号。凡是用特種符号按照通訊雙方約定的方法把電文的原形隐蔽起來,不為第三者所識别的通訊方式稱為密碼通訊。在計算機通訊中,采用密碼技術将資訊隐蔽起來,再将隐蔽後的資訊傳輸出去,使資訊在傳輸過程中即使被竊取或載獲,竊取者也不能了解資訊的内容,進而保證資訊傳輸的安全。

任何一個加密系統至少包括下面四個組成部分:

(1)未加密的封包,也稱明文。

(2)加密後的封包,也稱密文。

(3)加密解密裝置或算法。

(4)加密解密的密鑰。

發送方用加密密鑰,通過加密裝置或算法,将資訊加密後發送出去。接收方在收到密文後,用解密密鑰将密文解密,恢複為明文。如果傳輸中有人竊取,他隻能得到無法了解的密文,進而對資訊起到保密作用。

1.1 基本概念

資料加密技術就是指将一個資訊或明文經過加密鑰匙及加密函數轉換,變成無意義的密文,而接收方則将此密文經過解密函數.解密鑰匙還原成明文。加密技術是網絡安全技術的基石。

明文,即加密前的真實的資料或資訊,它是可以被外界所識别,它指代的含義比較廣泛,比如使用者A要将一份檔案發送給使用者B,那麼我們就将使用者A手裡所拿的那份檔案稱之為明文。

密文,就是對資訊經過一定的處理,使它變成無意義的亂碼,非指定使用者無法對它進行識别,例如A使用密鑰K加密消息并将其發送給B,B收到加密的消息後,使用密鑰K對其解密以恢複原始消息,那麼在這一過程當中A在途中發送給B的東西我們就叫它密文,因為這個檔案除B外,其他人得到它也沒有任何意義,這就保證了資訊傳送的保密性。

完成加密和解密的算法成為為密碼體制。人們一方面要把自己的信号隐蔽起來,另一方面則想把别人的隐蔽資訊挖掘出來,于是就産生了密碼分析的逆科學——密碼分析。密碼分析研究的問題是如何把密文轉換成明文。把密文轉換成明文的過程稱為破譯。破譯也是進行函數變換,變換過程中使用的參數也叫密鑰。

   一般地,如果求解一個問題需要一定量的計算,但環境所能提供的實際資源卻無法實作,則這種問題是計算上不可能的。如果一個密碼體制的破譯是計算上不可能的。則稱該密碼體制是計算上安全的。密碼體制必須滿足三個基本要求:

(1)對所有的密鑰、加密和解密都必須迅速有效;

(2)體制必須容易使用;

(3)體制的安全性必須隻依賴于密鑰的保密性。密碼體制要實作的功能可分為保密性和真實性兩種。

保密性要求密碼分析員無法從截獲的密文中求出明文。一般情況下一個密碼體制的保密性包括兩項要求:

(1)即使截獲了一段密文C,甚至知道了與它對應的明文M,密碼分析要從系統中求出解密變換,仍然是計算上不可行的。

(2)密碼分析員要由截獲的密文C中系統的求出明文M是計算上不可能的。

資料的真實性要求密碼分析員無法用虛假的密文代替真是密文而不被察覺,它也包括兩個要求:

(1)對于給定的C,即使密碼分析員知道了對應于它的明文M,要系統的求出加密變換仍然是計算上不可能的。

(2)密碼分析員要系統地找到密文,使其是明文空間上有意義的明文,這在計算上是不可能的。

1.2 資料加密分類

專用密鑰:又稱為對稱密鑰或單密鑰,加密和解密時使用同一個密鑰,即同一個算法。如DES和MIT的Kerberos算法。單密鑰是最簡單方式,通信雙方必須交換彼此密鑰,當需給對方發資訊時,用自己的加密密鑰進行加密,而在接收方收到資料後,用對方所給的密鑰進行解密。當一個文本要加密傳送時,該文本用密鑰加密構成密文,密文在信道上傳送,收到密文後用同一個密鑰将密文解出來,形成普通文體供閱讀。在對稱密鑰中,密鑰的管理極為重要,一旦密鑰丢失,密文将無密可保。這種方式在與多方通信時因為需要儲存很多密鑰而變得很複雜,而且密鑰本身的安全就是一個問題。

公開密鑰:又稱非對稱密鑰,加密和解密時使用不同的密鑰,即不同的算法,雖然兩者之間存在一定的關系,但不可能輕易地從一個推導出另一個。有一把公用的加密密鑰,有多把解密密鑰,如RSA算法。

非對稱密鑰由于兩個密鑰(加密密鑰和解密密鑰)各不相同,因而可以将一個密鑰公開,而将另一個密鑰保密,同樣可以起到加密的作用。

在這種編碼過程中,一個密碼用來加密消息,而另一個密碼用來解密消息。在兩個密鑰中有一種關系,通常是數學關系。公鑰和私鑰都是一組十分長的、數字上相關的素數(是另一個大數字的因數)。有一個密鑰不足以翻譯出消息,因為用一個密鑰加密的消息隻能用另一個密鑰才能解密。每個使用者可以得到唯一的一對密鑰,一個是公開的,另一個是保密的。公共密鑰儲存在公共區域,可在使用者中傳遞,甚至可印在報紙上面。而私鑰必須存放在安全保密的地方。任何人都可以有你的公鑰,但是隻有你一個人能有你的私鑰。它的工作過程是:“你要我聽你的嗎?除非你用我的公鑰加密該消息,我就可以聽你的,因為我知道沒有别人在偷聽。隻有我的私鑰(其他人沒有)才能解密該消息,是以我知道沒有人能讀到這個消息。我不必擔心大家都有我的公鑰,因為它不能用來解密該消息。”

公鑰加密體制具有以下優點:

(1) 密鑰配置設定簡單。

(2) 密鑰的儲存量少。

(3) 可以滿足互不相識的人之間進行私人談話時的保密性要求。

(4) 可以完成數字簽名和數字鑒别。

   RSA算法的理論基礎是數論中的歐拉函數,他的安全性基于大數分解的困難性,在理論上要計算兩個大素數的乘積是容易的,但反過來要把一個大數分解成兩個素數因子相乘的形式是很困難的,正是由于這個原因保證了此算法的安全性。

RSA的安全性依賴于大數分解。公鑰和私鑰都是兩個大素數 ( 大于 100個十進制位)的函數。據猜測,從一個密鑰和密文推斷出明文的難度等同于分解兩個大素數的積。

  密鑰對的産生:選擇兩個大素數,p 和q 。計算:n = p * q 。然後随機選擇加密密鑰e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互質。最後,利用Euclid 算法計算解密密鑰d, 滿足 e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) ) 其中n和d也要互質。數e和 n是公鑰,d是私鑰。兩個素數p和q不再需要,應該丢棄,不要讓任何人知道。 加密資訊 m(二進制表示)時,首先把m分成等長資料塊 m1 ,m2,..., mi ,塊長s,其中 2^s <= n, s 盡可能的大。對應的密文是:ci = mi^e ( mod n ) ( a ) 解密時作如下計算: mi = ci^d ( mod n ) ( b )

clc
clear
disp('産生密鑰對:')
p=input('輸入第一個大素數:p=');                                        
q=input('輸入第二個大素數:q=');
n=p*q
fain=(p-1)*(q-1)
e=floor(unifrnd(0,fain,1,1))                  
while(gcd(e,fain)~=1)|(e<2);
 e=floor(unifrnd(0,fain,1,1))
end
%模n求逆函數
n1=fain;n2=e;b1=0;b2=1;
for i=1:1000
        q1=floor(n1/n2);
        r=n1-q1*n2;
       if r~=0
           n1=n2;
           n2=r;
           t=b2;
           b2=b1-q1*b2;
           b1=t;
       else
         break
       end
end
if n2~=1
  warning('所求的模逆不存在') ;
end
if n2==1
  d=mod(b2,fain)
  fid=input('輸入待加密的明文:','s');
f=abs(fid);
for i=1:length(f)  
a=f(i);b=e;c=1;
for j=1:1000
if b==0
        dashuchenmi=c;
end
if mod(b,2)~=0
         b=b-1;
         c=mod(c*a,n);
else
       b=b/2;
       a=mod(a*a,n);
end
end
  dashuchenmi=c;
  miwen(i)=setstr(dashuchenmi);
end
for i=1:length(f)
a2=miwen(i);b2=d;c2=1;
for j=1:1000
if b2==0
  dashuchenmi2=c2;
end
if mod(b2,2)~=0
       b2=b2-1;
       c2=mod(c2*a2,n);
else
       b2=b2/2;
       a2=mod(a2*a2,n);
end
end
       dashuchenmi2=c2;
       mingwen(i)=setstr(dashuchenmi2);
end
end
disp('對所輸入的明文進行加密後的密文:')
miwen
disp('經過解密後恢複出的明文:')
mingwen