密码库LibTomcrypt的内容介绍及分析
密碼庫(kù)LibTomcrypt的內(nèi)容介紹及分析
2.1 密碼知識(shí)簡(jiǎn)介
2.1.1專業(yè)術(shù)語(yǔ)
發(fā)送者和接收者
假設(shè)發(fā)送者想發(fā)送消息給接收者,且想安全地發(fā)送信息:她想確信偷聽者不能閱讀發(fā)送的消息。
2.1.2消息和加密
消息被稱為明文。用某種方法偽裝消息以隱藏它的內(nèi)容的過程稱為加密,加了密的消息稱為密文,而把密文轉(zhuǎn)變?yōu)槊魑牡倪^程稱為解密。圖1.1表明了這個(gè)過程。
(如果你遵循ISO 7498-2標(biāo)準(zhǔn),那就用到術(shù)語(yǔ)“譯成密碼(encipher)”和“解譯密碼(decipher)”。某些文化似乎認(rèn)為術(shù)語(yǔ)“加密(encrypt)”和“解密(decrypt)”令人生厭,如同陳年腐尸。)
圖1.1加密和解密
使消息保密的技術(shù)和科學(xué)叫做密碼編碼學(xué),從事此行的叫密碼編碼者,密碼分析者是從事密碼分析的專業(yè)人員,密碼分析學(xué)就是破譯密文的科學(xué)和技術(shù),即揭穿偽裝。作為數(shù)學(xué)的一個(gè)分支的密碼學(xué)包括密碼編碼學(xué)和密碼分析學(xué)兩者,精于此道的人稱為密碼學(xué)家,現(xiàn)代的密碼學(xué)家通常也是理論數(shù)學(xué)家。
明文用M(消息)或P(明文)表示,它可能是比特流(文本文件、位圖、數(shù)字化的語(yǔ)音流或數(shù)字化的視頻圖像)。至于涉及到計(jì)算機(jī),P是簡(jiǎn)單地二進(jìn)制數(shù)據(jù)(除了這一章節(jié)外,這本書本身只涉及二進(jìn)制數(shù)據(jù)和計(jì)算機(jī)密碼學(xué))。明文可被傳送或存儲(chǔ),無論在哪種情況,M指待加密的消息。
密文用C表示,它也是二進(jìn)制數(shù)據(jù),有時(shí)和M一樣大,有時(shí)稍大(通過壓縮和加密的結(jié)合,C有可能比P小些。然而,單單加密通常達(dá)不到這一點(diǎn))。加密函數(shù)E作用于M得到密文C,用數(shù)學(xué)表示為:
E(M)=C.
相反地,解密函數(shù)D作用于C產(chǎn)生M
D(C)=M.
先加密后再解密消息,原始的明文將恢復(fù)出來,下面的等式必須成立:
D(E(M))=M
2.1.3鑒別、完整性和抗抵賴
除了提供機(jī)密性外,密碼學(xué)通常有其它的作用:.
-鑒別
消息的接收者應(yīng)該能夠確認(rèn)消息的來源;入侵者不可能偽裝成他人。
-完整性
消息的接收者應(yīng)該能夠驗(yàn)證在傳送過程中消息沒有被修改;入侵者不可能用假消息代替合法消息。
-抗抵賴
發(fā)送者事后不可能虛假地否認(rèn)他發(fā)送的消息。
這些功能是通過計(jì)算機(jī)進(jìn)行社會(huì)交流,至關(guān)重要的需求,就象面對(duì)面交流一樣。某人是否就是他說的人;某人的身份證明文件(駕駛執(zhí)照、醫(yī)學(xué)學(xué)歷或者護(hù)照)是否有效;聲稱從某人那里來的文件是否確實(shí)從那個(gè)人那里來的;這些事情都是通過鑒別、完整性和抗抵賴來實(shí)現(xiàn)的。
2.1.4算法和密鑰
密碼算法也叫密碼,是用于加密和解密的數(shù)學(xué)函數(shù)。(通常情況下,有兩個(gè)相關(guān)的函數(shù):一個(gè)用作加密,另一個(gè)用作解密)
如果算法的保密性是基于保持算法的秘密,這種算法稱為受限制的算法。受限制的算法具有歷史意義,但按現(xiàn)在的標(biāo)準(zhǔn),它們的保密性已遠(yuǎn)遠(yuǎn)不夠。大的或經(jīng)常變換的用戶組織不能使用它們,因?yàn)槊坑幸粋€(gè)用戶離開這個(gè)組織,其它的用戶就必須改換另外不同的算法。如果有人無意暴露了這個(gè)秘密,所有人都必須改變他們的算法。
更糟的是,受限制的密碼算法不可能進(jìn)行質(zhì)量控制或標(biāo)準(zhǔn)化。每個(gè)用戶組織必須有他們自己的唯一算法。這樣的組織不可能采用流行的硬件或軟件產(chǎn)品。但竊聽者卻可以買到這些流行產(chǎn)品并學(xué)習(xí)算法,于是用戶不得不自己編寫算法并予以實(shí)現(xiàn),如果這個(gè)組織中沒有好的密碼學(xué)家,那么他們就無法知道他們是否擁有安全的算法。
盡管有這些主要缺陷,受限制的算法對(duì)低密級(jí)的應(yīng)用來說還是很流行的,用戶或者沒有認(rèn)識(shí)到或者不在乎他們系統(tǒng)中內(nèi)在的問題。
現(xiàn)代密碼學(xué)用密鑰解決了這個(gè)問題,密鑰用K表示。K可以是很多數(shù)值里的任意值。密鑰K的可能值的范圍叫做密鑰空間。加密和解密運(yùn)算都使用這個(gè)密鑰(即運(yùn)算都依賴于密鑰,并用K作為下標(biāo)表示),這樣,加/解密函數(shù)現(xiàn)在變成:
EK(M)=C
DK(C)=M.
這些函數(shù)具有下面的特性(見圖1.2):
DK(EK(M))=M.
圖1.2使用一個(gè)密鑰的加/解密
圖1.3使用兩個(gè)密鑰的加/解密
有些算法使用不同的加密密鑰和解密密鑰(見圖1.3),也就是說加密密鑰K1與相應(yīng)的解密密鑰K2不同,在這種情況下:
EK1(M)=C
DK2(C)=M
DK2 (EK1(M))=M
所有這些算法的安全性都基于密鑰的安全性;而不是基于算法的細(xì)節(jié)的安全性。這就意味著算法可以公開,也可以被分析,可以大量生產(chǎn)使用算法的產(chǎn)品,即使偷聽者知道你的算法也沒有關(guān)系;如果他不知道你使用的具體密鑰,他就不可能閱讀你的消息。
密碼系統(tǒng)由算法、以及所有可能的明文、密文和密鑰組成的。
2.1.5對(duì)稱算法
對(duì)稱密碼算法有時(shí)又叫傳統(tǒng)密碼算法,就是加密密鑰能夠從解密密鑰中推算出來,反過來也成立。在大多數(shù)對(duì)稱算法中,加密解密密鑰是相同的。這些算法也叫秘密密鑰算法或單密鑰算法,它要求發(fā)送者和接收者在安全通信之前,商定一個(gè)密鑰。對(duì)稱算法的安全性依賴于密鑰,泄漏密鑰就意味著任何人都能對(duì)消息進(jìn)行加密解密。只要通信需要保密,密鑰就必須保密。對(duì)稱算法的加密和解密表示為:
Ek(M)=C
Dk(C)=M
對(duì)稱算法可分為兩類[8]。一次只對(duì)明文中的單個(gè)位(有時(shí)對(duì)字節(jié))運(yùn)算的算法稱為序列算法或序列密碼。另一類算法是對(duì)明文的一組位進(jìn)行運(yùn)算,這些位組稱為分組,相應(yīng)的算法稱為分組算法或分組密碼。現(xiàn)代計(jì)算機(jī)密碼算法的典型分組長(zhǎng)度為64位――這個(gè)長(zhǎng)度大到足以防止分析破譯,但又小到足以方便作用。
這種算法具有如下的特性:
Dk(Ek(M))=M
常用的采用對(duì)稱密碼術(shù)的加密方案有5個(gè)組成部分
l)明文:原始信息。
2)加密算法:以密鑰為參數(shù),對(duì)明文進(jìn)行多種置換和轉(zhuǎn)換的規(guī)則和步驟,變換結(jié)果為密文。
3)密鑰:加密與解密算法的參數(shù),直接影響對(duì)明文進(jìn)行變換的結(jié)果。
4)密文:對(duì)明文進(jìn)行變換的結(jié)果。
5)解密算法:加密算法的逆變換,以密文為輸入、密鑰為參數(shù),變換結(jié)果為明文。
對(duì)稱密碼術(shù)的優(yōu)點(diǎn)在于效率高(加/解密速度能達(dá)到數(shù)十兆/秒或更多),算法簡(jiǎn)單,系統(tǒng)開銷小,適合加密大量數(shù)據(jù)。
盡管對(duì)稱密碼術(shù)有一些很好的特性,但它也存在著明顯的缺陷,包括:
l)迸行安全通信前需要以安全方式進(jìn)行密鑰交換。這一步驟,在某種情況下是可行的,但在某些情況下會(huì)非常困難,甚至無法實(shí)現(xiàn)。
2)規(guī)模復(fù)雜。舉例來說,A與B兩人之間的密鑰必須不同于A和C兩人之間的密鑰,否則給B的消息的安全性就會(huì)受到威脅。在有1000個(gè)用戶的團(tuán)體中,A需要保持至少999個(gè)密鑰(更確切的說是1000個(gè),如果她需要留一個(gè)密鑰給他自己加密數(shù)據(jù))。對(duì)于該團(tuán)體中的其它用戶,此種倩況同樣存在。這樣,這個(gè)團(tuán)體一共需要將近50萬個(gè)不同的密鑰!推而廣之,n個(gè)用戶的團(tuán)體需要N2/2個(gè)不同的密鑰。
通過應(yīng)用基于對(duì)稱密碼的中心服務(wù)結(jié)構(gòu),上述問題有所緩解。在這個(gè)體系中,團(tuán)體中的任何一個(gè)用戶與中心服務(wù)器(通常稱作密鑰分配中心)共享一個(gè)密鑰。因而,需要存儲(chǔ)的密鑰數(shù)量基本上和團(tuán)體的人數(shù)差不多,而且中心服務(wù)器也可以為以前互相不認(rèn)識(shí)的用戶充當(dāng)“介紹人”。但是,這個(gè)與安全密切相關(guān)的中心服務(wù)器必須隨時(shí)都是在線的,因?yàn)橹灰?wù)器一掉線,用戶間的通信將不可能進(jìn)行。這就意味著中心服務(wù)器是整個(gè)通信成敗的關(guān)鍵和受攻擊的焦點(diǎn),也意味著它還是一個(gè)龐大組織通信服務(wù)的“瓶頸”
2.1.6公開密鑰算法
公開密鑰算法(也叫非對(duì)稱算法)是這樣設(shè)計(jì)的:用作加密的密鑰不同于用作解密的密鑰,而且解密密鑰不能根據(jù)加密密鑰計(jì)算出來(至少在合理假定的長(zhǎng)時(shí)間內(nèi))。之所以叫做公開密鑰算法,是因?yàn)榧用苊荑€能夠公開,即陌生者能用加密密鑰加密信息,但只有用相應(yīng)的解密密鑰才能解密信息。在這些系統(tǒng)中,加密密鑰叫做公開密鑰(簡(jiǎn)稱公鑰),解密密鑰叫做私人密鑰(簡(jiǎn)稱私鑰)。私人密鑰有時(shí)也叫秘密密鑰。為了避免與對(duì)稱算法混淆,此處不用秘密密鑰這個(gè)名字。
用公開密鑰K加密表示為
EK(M)=C.
雖然公開密鑰和私人密鑰是不同的,但用相應(yīng)的私人密鑰解密可表示為:
DK(C)=M
有時(shí)消息用私人密鑰加密而用公開密鑰解密,這用于數(shù)字簽名(見2.6節(jié)),盡管可能產(chǎn)生混淆,但這些運(yùn)算可分別表示為:
EK(M)=C
DK(C)=M
2.2LibTomCrypt密碼庫(kù)主要內(nèi)容
2.2.11LibTomCrypt密碼庫(kù)主要包含以下內(nèi)容:
1、高級(jí)加密標(biāo)準(zhǔn)AES(Advanced Encryption Standard) Rijndael和AES候選算法:RC6, MARS, Twofish, Serpent, CAST-256。
1997年4月15日美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所NIST發(fā)起征集高級(jí)加密標(biāo)準(zhǔn)AES算法的活動(dòng),2001年11月26日,NIST正式公布Rijndael數(shù)據(jù)加密算法為高級(jí)加密標(biāo)準(zhǔn)AES, 經(jīng)過多年來的分析和測(cè)試,至今沒有發(fā)現(xiàn)AES的明顯缺點(diǎn),也沒有找到明顯的安全漏洞. AES能夠抵抗目前已知的各種攻擊方法。
2、對(duì)稱分組密碼:IDEA, DES, Triple-DES (DES-EDE2 and DES-EDE3), DESX (DES-XEX3), RC2, RC5, Blowfish, Diamond2, TEA, SAFER, 3-WAY, GOST, SHARK, CAST-128, Square, Skipjack。
分組密碼又稱為秘密鑰密碼或?qū)ΨQ密碼。利用分組密碼對(duì)明文進(jìn)行加密時(shí),首先需要對(duì)明文進(jìn)行分組,每組的長(zhǎng)度都相同,然后對(duì)每組明文分別加密得到等長(zhǎng)的密文,分組密碼的特點(diǎn)是加密密鑰與解密密鑰相同。分組密碼的安全性應(yīng)該主要依賴于密鑰,而不依賴于對(duì)加密算法和解密算法的保密。
3、一般的密碼模式:電子密本(ECB),密碼分組鏈接(CBC),輸出反饋(OFB)和密文反饋(CFB)。
4、序列密碼:Panama, ARC4, SEAL, WAKE, WAKE-OFB, BlumBlumShub 。
序列密碼可以認(rèn)為是起源于20世紀(jì)20年代的Vernam體系,當(dāng)Vernam體制中的密鑰序列是隨機(jī)的(0,1)時(shí),就是所謂“一次一密“密碼體制。Shannon已經(jīng)證明了“一次一密“密碼體制在理論上是不可破譯的。在序列密碼中,加密和解密所用的密鑰都是偽隨機(jī)序列,偽隨機(jī)序列的產(chǎn)生比較容易并且有比較成熟的數(shù)學(xué)理論工具,目前,序列密碼是 世界各國(guó)的軍事和外交等領(lǐng)域中使用的主要密碼體制之一。
5、公鑰密碼: RSA, DSA, ElGamal, Nyberg-Rueppel (NR), Rabin, Rabin-Williams (RW), LUC, LUCELG, DLIES (variants of DHAES), ESIGN。
6、在公鑰密碼體制中加秘密鑰和解密密鑰是不一樣的,加密密鑰可以公開傳播而不危及密碼體制的安全性。RSA公鑰密碼體制的安全性是基于大整數(shù)的素分解問題的難解性,ElGamal公鑰密碼體制的安全性是基于有限域上的離散對(duì)數(shù)問題上的難解性,而Menezes Vanstone公鑰密碼體制的安全性則是基于橢圓曲線上的離散對(duì)數(shù)問題的難解性。
7、公鑰密碼系統(tǒng)補(bǔ)丁:PKCS#1 v2.0, OAEP, PSSR, IEEE P1363 EMSA2 。
8、 密鑰協(xié)商協(xié)議(key agreement schemes):Diffie-Hellman (DH), Unified Diffie-Hellman (DH2), Menezes-Qu-Vanstone (MQV), LUCDIF, XTR-DH 。
密鑰協(xié)商是一種協(xié)議,利用這種協(xié)議,通訊雙方可以在一個(gè)公開的信道上通過相互傳送一些消息來共同建立一個(gè)共享的秘密密鑰。在密鑰協(xié)商中,雙方共同建立的秘密密鑰通常是雙方輸入消息的一個(gè)函數(shù)。
9、橢圓曲線密碼:ECDSA, ECNR, ECIES, ECDH, ECMQV。
10、單向hash函數(shù):SHA-1:安全hash算法SHA,MD2, MD4, MD5, HAVAL, RIPEMD-160, Tiger, SHA-2 (SHA-256, SHA-384, and SHA-512), Panama。
Hash函數(shù)是一種將一種任意長(zhǎng)度的消息(message)壓縮為某一固定長(zhǎng)度的消息摘要(message digest)的函數(shù)。Hash函數(shù)可以用于數(shù)字簽名和消息的完整性檢測(cè)。Hash函數(shù) MD4是由R.L.Rivest于1990年提出的。MD4的設(shè)計(jì)沒有基于任何假設(shè)和密碼體制。Hash函數(shù)的這種直接構(gòu)造方法受到人們的廣泛青睞。MD4的效率很高,非常實(shí)用。關(guān)于MD4的安全性目前還沒發(fā)現(xiàn)非常有效的攻擊方法,但是已經(jīng)有人指出它的一些不足,為了克服MD4的缺陷和增強(qiáng)安全性,R.L.Rivest于1991年對(duì)MD4作了改進(jìn),改進(jìn)后的Hash函數(shù)稱為MD5。SHA即安全Hash算法是美國(guó)國(guó)家標(biāo)準(zhǔn)技術(shù)研究所(NIST)公布的安全Hash標(biāo)準(zhǔn)(SHS)中的Hash算法,1995年NIST修改SHS后將修改后的SHA稱為SHA-1。SHA的設(shè)計(jì)原則與MD4的設(shè)計(jì)原則極其相似,它是MD4的一種變形。
11、消息認(rèn)證碼(MAC):MD5-MAC, HMAC, XOR-MAC, CBC-MAC, DMAC。
消息認(rèn)證代碼(MAC)并不是密碼,而是校驗(yàn)和(通常是 32 位)的一種特殊形式,它是通過使用一個(gè)秘鑰并結(jié)合一個(gè)特定認(rèn)證方案而生成的,并且附加在一條消息后。消息摘要是使用單向散列函數(shù)生成的,緊密聯(lián)系的數(shù)字簽名是使用非對(duì)稱密鑰對(duì)生成并進(jìn)行驗(yàn)證的。與這兩者相比,預(yù)期的接收 方需要對(duì)秘鑰有訪問權(quán),以便驗(yàn)證代碼。
基于分組密碼CBC的工作模式和CFB的工作模式的Hash函數(shù)中的密鑰可以公開也可以不公開,如果密鑰保密則Hash函數(shù)稱為帶密鑰Hash函數(shù),帶密鑰的Hash函數(shù)常用于產(chǎn)生消息認(rèn)證碼(MAC)對(duì)于通信雙方之間傳輸?shù)娜我庀essage,用帶密鑰的Hash函數(shù)H對(duì)message做變換,結(jié)果H(message)作為消息message的認(rèn)證碼,附在消息message的后面。消息認(rèn)證碼用于保證通訊雙方之間傳輸信息的完整性,使雙方確信消息沒有被第三方篡改或偽造。
12、基于密碼結(jié)構(gòu)的Hash函數(shù):Luby-Rackoff, MDC。
13、偽隨機(jī)數(shù)發(fā)生器(PRNG): ANSI X9.17 appendix C, PGP's RandPool。
14、基于密碼的密鑰來源函數(shù)(password based key derivation functions):采用公開密碼匙加密標(biāo)準(zhǔn) PKCS #5 的PBKDF1 和 PBKDF2。
15、壓縮和解壓算法。
16、大整數(shù)和多項(xiàng)式快速精確算法。
17、有限域算法,包括GF(p) 和 GF(2^n)。
18、大素?cái)?shù)的產(chǎn)生和驗(yàn)證。
2.2.2介紹
在本庫(kù)中,應(yīng)用程序接口(API)是非常容易記憶和應(yīng)用的。很多函數(shù)返回Void或者
int類型。函數(shù)返回int類型時(shí)如果函數(shù)執(zhí)行成功,會(huì)返回CRYPT_OK。有些函數(shù)返回int類型的整數(shù)-1,表明函數(shù)執(zhí)行錯(cuò)誤。當(dāng)一個(gè)函數(shù)確實(shí)返回錯(cuò)誤時(shí),他會(huì)被下面的函數(shù)轉(zhuǎn)換為一個(gè)字符串。
constchar*error_to_string(int err);
void somefunc(void)
{
if ((err = some_crypto_function(...)) -->= CRYPT_OK) {
printf("A crypto error occured, %s"n", error_to_string(err));
/* 下面執(zhí)行錯(cuò)誤處理*/
。。。。。。
}
/* 如果沒有錯(cuò)誤繼續(xù)執(zhí)行 */
。。。。。。
}
為了在程序中加入LibTomCrypt庫(kù),只需要加入#include “tomcrypt.h"就可以了,如下所示:
#include <tomcrypt.h>
int main(void) {
return 0;
}
這個(gè)頭文件” tomcrypt.h”,包括”stdio.h”,”string.h", “stdlib.h",”time.h", “ctype.h" 和”ltc_ tommath.h"
(大整數(shù)庫(kù)的程序)
2.2.3 宏定義
有些幫助的宏定義會(huì)使得代碼簡(jiǎn)單些
宏定義如下:
STORE32L(x, y) unsigned long x, unsigned char *y x --> y[0 : : : 3]
STORE64L(x, y) unsigned long long x, unsigned char *y x --> y[0 : : : 7]
LOAD32L(x, y) unsigned long x, unsigned char *y y[0 : : : 3] --> x
LOAD64L(x, y) unsigned long long x, unsigned char *y y[0 : : : 7] --> x
STORE32H(x, y) unsigned long x, unsigned char *y x --> y[3 : : : 0]
STORE64H(x, y) unsigned long long x, unsigned char *y x --> y[7 : : : 0]
LOAD32H(x, y) unsigned long x, unsigned char *y y[3 : : : 0] --> x
LOAD64H(x, y) unsigned long long x, unsigned char *y y[7 : : : 0] --> x
BSWAP(x) unsigned long x Swaps the byte order of x.
ROL(x, y) unsigned long x, unsigned long y x << y; 0 _ y _ 31
ROLc(x, y) unsigned long x, const unsigned long y x << y; 0 _ y _ 31
ROR(x, y) unsigned long x, unsigned long y x >> y; 0 _ y _ 31
RORc(x, y) unsigned long x, const unsigned long y x >> y; 0 _ y _ 31
ROL64(x, y) unsigned long x, unsigned long y x << y; 0 _ y _ 63
ROL64c(x, y) unsigned long x, const unsigned long y x << y; 0 _ y _ 63
ROR64(x, y) unsigned long x, unsigned long y x >> y; 0 _ y _ 63
ROR64c(x, y) unsigned long x, const unsigned long y x >> y; 0 _ y _ 63
2.2.4 函數(shù)帶有各種長(zhǎng)度的輸出
一些函數(shù)比如說rsa export(),帶有變長(zhǎng)度的輸出。為了避免buffer溢出,輸出的長(zhǎng)度必須保存起來,比如說:
#include <tomcrypt.h>
int main(void) {
rsa_key key;
unsigned char buffer[1024];
unsigned long x;
int err;
/* ... 生成RSA密鑰 */
。。。。。。
x = sizeof(buffer);//X保存緩沖區(qū)buffer的輸出長(zhǎng)度
if ((err = rsa_export(buffer, &x, PK_PUBLIC, &key)) != CRYPT_OK) {
printf("Export error: %s"n", error_to_string(err));
return -1;
}
/* 如果rsa_export()成功,那么x 將會(huì)得到輸出的長(zhǎng)度*/
printf("RSA exported key takes %d bytes"n", x);
/* ... 對(duì)緩沖區(qū)buffer做些處理 */
return 0;
}
在上面的函數(shù)中,如果RSA公鑰長(zhǎng)度超過1024字節(jié),函數(shù)會(huì)返回一個(gè)錯(cuò)誤,這個(gè)錯(cuò)誤信號(hào)表明Buffer緩沖區(qū)溢出。如果函數(shù)執(zhí)行成功就會(huì)將輸出的長(zhǎng)度保存到X里面,這樣盜用程序就會(huì)知道用了多少個(gè)字節(jié)
2.3對(duì)稱密碼算法
2.3.1 核心函數(shù)
LibTomCrypt提供了一批ECB模式界面密碼。首先你需要注意你永遠(yuǎn)也無法直接使用ECB模式加密數(shù)據(jù),這一點(diǎn)很重要很重要。所以你應(yīng)該用ECB函數(shù)產(chǎn)生一個(gè)鏈?zhǔn)降哪J剑蛘哂靡呀?jīng)提供的一種鏈?zhǔn)侥J健K械牡拿艽a都被寫成ECB界面。
所有的密碼被保存在一個(gè)symmet_ric_key變量里。LibTomCrypt允許所有的密碼有一個(gè)相同的模型存儲(chǔ)這些密碼
1.Setup函數(shù)
int XXX_setup(const unsigned char *key, int keylen, int rounds,symmetric_key *skey);
這個(gè)XXX_setup函數(shù)設(shè)置用什么密鑰加密,密鑰的長(zhǎng)度,加密的輪數(shù)。如果函數(shù)返回成功
將會(huì)有一個(gè)預(yù)定的密鑰,存儲(chǔ)在skey里。
加密解密用ECB模式,有下面的兩個(gè)函數(shù):
2.encrypt函數(shù)
void XXX_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
3. decrypt函數(shù)
void XXX_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
encrypt函數(shù)pt是輸入,ct是輸出。Decrypt函數(shù)正好相反
4.test函數(shù)
int XXX_test(void);
如果密碼匹配正確,這個(gè)函數(shù)將會(huì)返回一個(gè)CRYPT_OK。
5.Keysize函數(shù)
int XXX_keysize(int *keysize);
這個(gè)函數(shù)返回CRYPT_OK,如果這個(gè)密鑰的長(zhǎng)度是合意的。例如:
#include <tomcrypt.h>
int main(void)
{
int keysize, err;
/* 20字節(jié)的密鑰長(zhǎng)度Twofish接受嗎? */
keysize = 20;
if ((err = twofish_keysize(&keysize)) != CRYPT_OK) {
printf("Error getting key size: %s"n", error_to_string(err));
return -1;
}
printf("Twofish suggested a key size of %d"n", keysize);
return 0;
}
2.3.2一個(gè)用ECB模式blowfish加密解密的例子
#include <tomcrypt.h>
int main(void)
{unsigned char pt[8], ct[8], key[8];
symmetric_key skey;
int err;
/* ... key is loaded appropriately in ``key'' ... */
/* ... load a block of plaintext in ``pt'' ... */
/* schedule the key */
1The size of which depends on which cipher you are using.
2pt stands for plaintext.
3ct stands for ciphertext.
4As published in their design papers.
if ((err = blowfish_setup(key, /* 密鑰將被用到 */
8, /* 密鑰是 8 bytes 長(zhǎng) */
0, /* 0 用默認(rèn)的輪數(shù) */
&skey) /* 預(yù)定的密鑰*/
) != CRYPT_OK) {
printf("Setup error: %s"n", error_to_string(err));
return -1;
}
/* encrypt the block */
blowfish_ecb_encrypt(pt, /*加密8-byte 數(shù)組 */
ct, /*儲(chǔ)存加密數(shù)據(jù)*/
&skey); /* 先前預(yù)定的密碼 */
/* decrypt the block */
blowfish_ecb_decrypt(ct, /*解密8-byte 數(shù)組*/
pt, /*儲(chǔ)存解密數(shù)據(jù)*/
&skey); /*先前預(yù)定的密碼*/
/* 現(xiàn)在就解密出ct中的數(shù)據(jù),將解密出的數(shù)據(jù)放到pt中 */
return 0;
}
2.3.3 算法描述
為了方便,庫(kù)提供了密碼算法的描述存放在數(shù)組cipher_descriptor里,描述如下:
struct _cipher_descriptor {
char *name;
unsigned char ID;
int min_key_length,
max_key_length,
block_length,
default_rounds;
int (*setup)(const unsigned char *key, int keylen, int num_rounds, symmetric_key *skey);
void (*ecb_encrypt)(const unsigned char *pt, unsigned char *ct, symmetric_key *skey);
void (*ecb_decrypt)(const unsigned char *ct, unsigned char *pt, symmetric_key *skey);
int (*test)(void);
int (*keysize)(int *keysize);
};
加密名稱 描述名稱 分塊大小(byte) 密鑰長(zhǎng)度 加密輪數(shù)
Blow_sh blow_fish _desc 8 8 : : : 56 16
X-Tea xtea _desc 8 16 32
RC2 rc2 _desc 8 8 : : : 128 16
RC5-32/12/b rc5_desc 8 8 : : : 128 12 : : : 24
RC6-32/20/b rc6 _desc 16 8 : : : 128 20
SAFER+ saferp _desc 16 16, 24, 32 8, 12, 16
AES aes _desc 16 16, 24, 32 10, 12, 14
Two_fish two_fish_ desc 16 16, 24, 32 16
DES des_desc 8 7 16
3DES) des3_desc 8 21 16
CAST5 cast5_desc 8 5 : : : 16 12, 16
Noekeon noekeon_desc 16 16 16
Skipjack skipjack_desc 8 10 32
Anubis anubis_desc 16 16 : : : 40 12 : : : 18
Khazad khazad_desc 8 16 8
: : :表示從多少到多少
為了完成加/解密有如下的函數(shù) int find_cipher(char *name),
2.3.4LibTomCrypt庫(kù)的應(yīng)用:
實(shí)現(xiàn)用LibTomCrypt庫(kù)從文件中讀出數(shù)據(jù)進(jìn)行用對(duì)稱算法的加密,將密文保存到一個(gè)文件里。然后用對(duì)稱算法解密出密文保存到另一個(gè)文件里。
核心代碼:
unsigned char plaintext[10000],ciphertext[10000];
//密鑰
unsigned char tmpkey[512], key[MAXBLOCKSIZE], IV[MAXBLOCKSIZE];
//輸入、輸出
unsigned char inbuf[512]; /* i/o block size */
unsigned long outlen, y, ivsize, x, decrypt;
symmetric_CTR ctr;//在tomcrypt_cipher.h(237)中定義
int cipher_idx, hash_idx, ks;
char *infile, *outfile, *cipher
//注冊(cè)加密方法
void register_algs(void)
{
//int x;
#ifdef RIJNDAEL
register_cipher (&aes_desc);
#endif
#ifdef BLOWFISH
register_cipher (&blowfish_desc);
#endif
#ifdef XTEA
register_cipher (&xtea_desc);
#endif
#ifdef RC5
register_cipher (&rc5_desc);
#endif
#ifdef RC6
register_cipher (&rc6_desc);
#endif
#ifdef SAFERP
register_cipher (&saferp_desc);
#endif
#ifdef TWOFISH
register_cipher (&twofish_desc);
#endif
#ifdef SAFER
register_cipher (&safer_k64_desc);
register_cipher (&safer_sk64_desc);
register_cipher (&safer_k128_desc);
register_cipher (&safer_sk128_desc);
#endif
#ifdef RC2
register_cipher (&rc2_desc);
#endif
#ifdef DES
register_cipher (&des_desc);
register_cipher (&des3_desc);
#endif
#ifdef CAST5
register_cipher (&cast5_desc);
#endif
#ifdef NOEKEON
register_cipher (&noekeon_desc);
#endif
#ifdef SKIPJACK
register_cipher (&skipjack_desc);
#endif
#ifdef KHAZAD
register_cipher (&khazad_desc);
#endif
#ifdef ANUBIS
register_cipher (&anubis_desc);
#endif
如果注冊(cè)失敗,則返回-1
if (register_hash(&sha256_desc) == -1) {
printf("Error registering SHA256"n");
exit(-1);
}
if (register_prng(&yarrow_desc) == -1) {
printf("Error registering yarrow PRNG"n");
exit(-1);
}
if (register_prng(&sprng_desc) == -1) {
printf("Error registering sprng PRNG"n");
exit(-1);
}
}
cipher_idx = find_cipher(cipher);
if (cipher_idx == -1) {
printf("Invalid cipher entered on command line."n");
exit(-1);
}
///** 無此函數(shù):invalid keysize;Error hashing key: Invalid hash specified.
//函數(shù)find_hash在tomcrypt_hash.h中聲明
hash_idx = find_hash("sha256");
if (hash_idx == -1) {
printf("SHA256 not found...?"n");
exit(-1);
}
如果找不到find_hash函數(shù),則返回-1,將結(jié)果返還給hash_idx
//結(jié)構(gòu)cipher_descriptor在tomcrypt_cipher.h中定義
//cipher descriptor table, last entry has "name == NULL" to mark the end of table
ivsize = cipher_descriptor[cipher_idx].block_length;
ks = hash_descriptor[hash_idx].hashsize;
//將hash_descriptor[hash_idx].hashsize中的密鑰的長(zhǎng)度傳給ks
if (cipher_descriptor[cipher_idx].keysize(&ks) != CRYPT_OK) {
printf("Invalid keysize???"n");
exit(-1);
}
演示結(jié)果:
加密過程:
if(decrypt!=1){/* encrypt */
/* Setup yarrow for random bytes for IV */
if ((errno = rng_make_prng(128, find_prng("yarrow"), &prng, NULL)) != CRYPT_OK) {
printf("Error setting up PRNG, %s"n", error_to_string(errno));
}
/* You can use rng_get_bytes on platforms that support it */
/* x = rng_get_bytes(IV,ivsize,NULL);*/
x = yarrow_read(IV,ivsize,&prng);
if (x != ivsize) {
printf("Error reading PRNG for IV required."n");
exit(-1);
}
if (fwrite(IV,1,ivsize,fdout) != ivsize) {
printf("Error writing IV to output."n");
exit(-1);
}
if ((errno = ctr_start(cipher_idx,IV,key,ks,0,&ctr)) != CRYPT_OK) {
printf("ctr_start error: %s"n",error_to_string(errno));
exit(-1);
}
do {
y = fread(inbuf,1,sizeof(inbuf),fdin);
if ((errno = ctr_encrypt(inbuf,ciphertext,y,&ctr)) != CRYPT_OK) {
printf("ctr_encrypt error: %s"n", error_to_string(errno));
exit(-1);
}
if (fwrite(ciphertext,1,y,fdout) != y) {
printf("Error writing to output."n");
exit(-1);
}
} while (y == sizeof(inbuf));
fclose(fdout);
fclose(fdin);
解密過程:
if (decrypt) {
/* Need to read in IV */
if (fread(IV,1,ivsize,fdin) != ivsize) {
printf("Error reading IV from input."n");
exit(-1);
}
if ((errno = ctr_start(cipher_idx,IV,key,ks,0,&ctr)) != CRYPT_OK) {
printf("ctr_start error: %s"n",error_to_string(errno));
exit(-1);
}
/* IV done */
do {
y = fread(inbuf,1,sizeof(inbuf),fdin);
if ((errno = ctr_decrypt(inbuf,plaintext,y,&ctr)) != CRYPT_OK) {
printf("ctr_decrypt error: %s"n", error_to_string(errno));
exit(-1);
}
if (fwrite(plaintext,1,y,fdout) != y) {
printf("Error writing to file."n");
exit(-1);
}
} while (y == sizeof(inbuf));
fclose(fdin);
fclose(fdout);
加密解密的結(jié)果:
2.4公開密鑰算法
2.4.1 公開密鑰
公開密鑰算法使用不同的密鑰進(jìn)行加密和解密運(yùn)算,并且解密密鑰不能從加密密鑰變換獲得。公開密鑰算法通常都非常慢,因此公開密鑰算法很多時(shí)候被應(yīng)用到加密一組由其他途徑產(chǎn)生的密鑰,并通過公眾網(wǎng)路進(jìn)行傳送,然后接受方用私鑰解密后,在以后的對(duì)稱算法里應(yīng)用此傳送過來的密鑰。
RSA(Rivest-Shamir-Adelman)是使用最多的公開密鑰算法,能夠被應(yīng)用在加密和數(shù)字簽名中。大家普遍接受當(dāng)足夠長(zhǎng)的密鑰被使用后,RSA是足夠安全的(512比特是不安全的,768比特是中等安全的,1024比特足夠保障一般的安全傳輸。) RSA的安全依賴于大整數(shù)因數(shù)分解的難度。因數(shù)分解的快速發(fā)展將導(dǎo)致RSA出現(xiàn)問題。不過,目前RSA是這個(gè)世界上最重要的公開密鑰算法。RSA的專利權(quán)將在今年失效(2000年),并且將可以被自由使用。
Bruce Schneier有專門的論文討論使用RSA密鑰推薦的長(zhǎng)度,按現(xiàn)狀而言,512比特是不足夠的,1024比特可以被認(rèn)為是很安全的,如果使用2048比特,應(yīng)該可以保障今后十年的安全。值得一提的是,RSA對(duì)于Chosen Plaintext attack非常脆弱,并且新近發(fā)展的Timing Attack能夠用來破解很多RSA的具體實(shí)現(xiàn)。如果對(duì)RSA進(jìn)行正確的應(yīng)用,可以締造一個(gè)很安全的系統(tǒng),但是一定要注意避免上述這兩類攻擊。很多RSA的實(shí)現(xiàn)可以被自由獲取,例如 PGP,SSH。
什么是公鑰密碼體制
公鑰密碼又稱為雙鑰密碼和非對(duì)稱密碼,是1976年由Diffie和Hellman在其“密碼學(xué)新方向”一文中提出的,見劃時(shí)代的文獻(xiàn):
W.Diffie and M.E.Hellman, New Directrions in Cryptography, IEEE Transaction on Information Theory,V.IT-22.No.6,Nov 1976,PP.644-654
單向陷門函數(shù)是滿足下列條件的函數(shù)f:
(1)給定x,計(jì)算y=f(x)是容易的;
(2)給定y,計(jì)算x使y=f(x)是困難的。
(所謂計(jì)算x=f-1(Y)困難是指計(jì)算上相當(dāng)復(fù)雜,已無實(shí)際意義。)
3)存在δ,已知δ 時(shí),對(duì)給定的任何y,若相應(yīng)的x存在,則計(jì)算x使y=f(x)是容易的。
注:1*.僅滿足(1)、(2)兩條的稱為單向函數(shù);第(3)條稱為陷門性,δ 稱為陷門信息。
2*.當(dāng)用陷門函數(shù)f作為加密函數(shù)時(shí),可將f公開,這相當(dāng)于公開加密密鑰。此時(shí)加密密鑰便稱為公開鑰,記為Pk。 f函數(shù)的設(shè)計(jì)者將δ 保密,用作解密密鑰,此時(shí)δ 稱為秘密鑰匙,記為Sk。由于加密函數(shù)時(shí)公開的,任何人都可以將信息x加密成y=f(x),然后送給函數(shù)的設(shè)計(jì)者(當(dāng)然可以通過不安全信道傳送);由于設(shè)計(jì)者擁有Sk,他自然可以解出x=f-1(y)。 3*.單向陷門函數(shù)的第(2)條性質(zhì)表明竊聽者由截獲的密文y=f(x)推測(cè)x是不可行的
2.4.2 RSA算法
在1976年,Diffie 和Hellman發(fā)表了一篇叫《密碼學(xué)新動(dòng)向》的文章,介紹了公匙加密的概念,給密碼學(xué)的研究者帶來了很大的轟動(dòng)。論文的核心就是陷門單向函數(shù):一個(gè)方向上的操作是容易的,但是如果不知道秘密的陷門,即使所有人都知道函數(shù)本身,從反方向計(jì)算是不現(xiàn)實(shí)的。在這里,公匙的扮演的角色和函數(shù)相同,僅被有限的一部分人知道的機(jī)關(guān)就是私匙。
兩年后,也就是1978年由Rivest, Shamir 和Adleman提出了被稱為RSA的公匙密碼系統(tǒng)。RSA算法建立在對(duì)整數(shù)的分解的數(shù)學(xué)難題上的。私匙是由三個(gè)數(shù)(p,q,d)組成,其中p和q是兩個(gè)素?cái)?shù)(具有大致相同的大小),而d和(p-1)*(q-1)互質(zhì)。公匙由兩個(gè)數(shù)(n,e)組成,其中n=pq,而e是(p-1)(q-1)取d為模的倒數(shù),例如:
ed = 1 mod(p-1)(q-1).
假如愛麗斯想用鮑勃的公匙(n,e)加密,傳送一些文本。她首先會(huì)把明文轉(zhuǎn)換成小于n的整數(shù)m,用鮑勃的公匙(n,e)加密處理:
c = me mod n,
然后把結(jié)果c送給鮑勃。在鮑勃的這邊,他就會(huì)用他的私匙(p,q,d)進(jìn)行解密處理:
cd mod n = med mod n = m.
對(duì)于RSA,單向的陷門函數(shù)是能夠從一個(gè)小于n的整數(shù)x得到xe mod n.
RSA算法中用到的一些量是:
1.素?cái)?shù)p和q(保密的);
2.n=p*q(公開的);
3.φ(n)=(p-1)*(q-1)(保密的);
4.加密密鑰e(公開的)要滿足0<e<φ(n), 且e和φ(n)的最大公約數(shù)為1(互素);
5.解密密鑰d(保密的)要滿足0<d<φ(n), 且d*emod φ(n)=1
如果用M代表明文,C代表密文,E(M)代表對(duì)明文加密運(yùn)算,D(C)代表對(duì)密文解密運(yùn)算,則有:
E(M)=M^e mod n=C
D(C)=C^d mod n=M
RSA算法安全性的理論基礎(chǔ)是大數(shù)的因子分解問題至今沒有很好的算法,因而公開e和n不易求出p、q及d。RSA算法要求p和q是兩個(gè)足夠大的素?cái)?shù)(例如100位十進(jìn)制數(shù))且長(zhǎng)度相差比較小
2.5單向哈希函數(shù)
在很多情況下,我們需要鑒別和認(rèn)證用戶。如登陸計(jì)算機(jī)(自動(dòng)柜員機(jī))時(shí),計(jì)算機(jī)往往需要知道用戶是誰,確認(rèn)某個(gè)用戶而不是其他人冒充,傳統(tǒng)的方法是用口令來解決這個(gè)問題。用戶在登陸計(jì)算機(jī)時(shí)輸入口令,有計(jì)算機(jī)確認(rèn)確認(rèn)口令正確后,用戶才可登陸計(jì)算機(jī)。用戶和計(jì)算機(jī)均需知道口令。用戶每次登陸均需輸入口令。由于計(jì)算機(jī)需要知道口令,這就需要把口令保存在計(jì)算機(jī)中。這為入侵計(jì)算機(jī)偷取口令提供了可能。為此,我們不直接保存口令本身,而保存口令的散列值(口令的某種表示形式)。當(dāng)用戶輸入口令后,計(jì)算機(jī)先計(jì)算口令的散列值并于保存在計(jì)算集中的散列值進(jìn)行比較,以次來鑒別用戶。由于用來計(jì)算散列的值的函數(shù)具有單向性,即根據(jù)散列值不可能逆向恢復(fù)出口令,從而即使獲得了有口令產(chǎn)生的散列值也無法知道用戶的口令
單向散列函數(shù) H(M) 作用于一個(gè)任意長(zhǎng)度的消息 M,它返回一個(gè)固定長(zhǎng)度的散列值 h,其中 h 的長(zhǎng)度為 m 。
輸入為任意長(zhǎng)度且輸出為固定長(zhǎng)度的函數(shù)有很多種,但單向散列函數(shù)還有使其單向的其它特性:
(1) 給定 M ,很容易計(jì)算 h ;
(2) 給定 h ,根據(jù) H(M) = h 計(jì)算 M 很難;
(3) 給定 M ,要找到另一個(gè)消息 M' 并滿足 H(M) = H(M') 很難。
在許多應(yīng)用中,僅有單向性是不夠的,還需要稱之為"抗碰撞"的條件:
要找出兩個(gè)隨機(jī)的消息 M 和 M',使 H(M) = H(M') 滿足很難。
由于散列函數(shù)的這些特性,由于公開密碼算法的計(jì)算速度往往很慢,所以,在一些密碼協(xié)議中,它可以作為一個(gè)消息 M 的摘要,代替原始消息 M,讓發(fā)送者為 H(M) 簽名而不是對(duì) M 簽名。
如 SHA 散列算法用于數(shù)字簽名協(xié)議 DSA中
2.6數(shù)字簽名
提到數(shù)字簽名就離不開公開密碼系統(tǒng)和散列技術(shù)。
有幾種公鑰算法能用作數(shù)字簽名。在一些算法中,例如RSA,公鑰或者私鑰都可用作加密。用你的私鑰加密文件,你就擁有安全的數(shù)字簽名。在其它情況下,如DSA,算法便區(qū)分開來了數(shù)字簽名算法不能用于加密。這種思想首先由Diffie和Hellman提出。
基本協(xié)議是簡(jiǎn)單的:
(1) A 用她的私鑰對(duì)文件加密,從而對(duì)文件簽名。
(2) A 將簽名的文件傳給B。
(3) B用A的公鑰解密文件,從而驗(yàn)證簽名。
這個(gè)協(xié)議中,只需要證明A的公鑰的確是她的。如果B不能完成第(3)步,那么他知道簽名是無效的。
這個(gè)協(xié)議也滿足以下特征:
(1) 簽名是可信的。當(dāng)B用A的公鑰驗(yàn)證信息時(shí),他知道是由A簽名的。
(2) 簽名是不可偽造的。只有A知道她的私鑰。
(3) 簽名是不可重用的。簽名是文件的函數(shù),并且不可能轉(zhuǎn)換成另外的文件。
(4) 被簽名的文件是不可改變的。如果文件有任何改變,文件就不可能用A的公鑰驗(yàn)證。
(5) 簽名是不可抵賴的。B不用A的幫助就能驗(yàn)證A的簽名。
在實(shí)際應(yīng)用中,因?yàn)楣裁艽a算法的速度太慢,簽名者往往是對(duì)消息的散列簽名而不是對(duì)消息本身簽名。這樣做并不會(huì)降低簽名的可信性
目前有許多種技術(shù)保證信息的安全不受侵犯,例如加密技術(shù)、訪問控制技術(shù)、認(rèn)證技術(shù)以及安全審計(jì)技術(shù)等,但這些技術(shù)大多數(shù)是用來預(yù)防用的,信息一旦被攻破,我們不能保證信息的完整性。為此,一種新興的用來保證信息完整性的安全技術(shù)——數(shù)字簽名技術(shù)成為人們非常關(guān)心的話題。那么,什么是數(shù)字簽名技術(shù)?它有什么特殊功能呢?
概念
在數(shù)字簽名技術(shù)出現(xiàn)之前,曾經(jīng)出現(xiàn)過一種“數(shù)字化簽名”技術(shù),簡(jiǎn)單地說就是在手寫板上簽名,然后將圖像傳輸?shù)诫娮游臋n中,這種“數(shù)字化簽名”可以被剪切,然后粘貼到任意文檔上,這樣非法復(fù)制變得非常容易,所以這種簽名的方式是不安全的。數(shù)字簽名技術(shù)與數(shù)字化簽名技術(shù)是兩種截然不同的安全技術(shù),數(shù)字簽名與用戶的姓名和手寫簽名形式毫無關(guān)系,它實(shí)際使用了信息發(fā)送者的私有密鑰變換所需傳輸?shù)男畔ⅰ?duì)于不同的文檔信息,發(fā)送者的數(shù)字簽名并不相同。沒有私有密鑰,任何人都無法完成非法復(fù)制。從這個(gè)意義上來說,“數(shù)字簽名”是通過一個(gè)單向函數(shù)對(duì)要傳送的報(bào)文進(jìn)行處理得到的,用以認(rèn)證報(bào)文來源并核實(shí)報(bào)文是否發(fā)生變化的一個(gè)字母數(shù)字串。
原理
該技術(shù)在具體工作時(shí),首先發(fā)送方對(duì)信息施以數(shù)學(xué)變換,所得的信息與原信息惟一對(duì)應(yīng);在接收方進(jìn)行逆變換,得到原始信息。只要數(shù)學(xué)變換方法優(yōu)良,變換后的信息在傳輸中就具有很強(qiáng)的安全性,很難被破譯、篡改。這一個(gè)過程稱為加密,對(duì)應(yīng)的反變換過程稱為解密。
現(xiàn)在有兩類不同的加密技術(shù),一類是對(duì)稱加密,雙方具有共享的密鑰,只有在雙方都知道密鑰的情況下才能使用,通常應(yīng)用于孤立的環(huán)境之中,比如在使用自動(dòng)取款機(jī)(ATM)時(shí),用戶需要輸入用戶識(shí)別號(hào)碼(PIN),銀行確認(rèn)這個(gè)號(hào)碼后,雙方在獲得密碼的基礎(chǔ)上進(jìn)行交易,如果用戶數(shù)目過多,超過了可以管理的范圍時(shí),這種機(jī)制并不可靠。
另一類是非對(duì)稱加密,也稱為公開密鑰加密,密鑰是由公開密鑰和私有密鑰組成的密鑰對(duì),用私有密鑰進(jìn)行加密,利用公開密鑰可以進(jìn)行解密,但是由于公開密鑰無法推算出私有密鑰,所以公開的密鑰并不會(huì)損害私有密鑰的安全,公開密鑰無須保密,可以公開傳播,而私有密鑰必須保密,丟失時(shí)需要報(bào)告鑒定中心及數(shù)據(jù)庫(kù)。
算法
數(shù)字簽名的算法很多, 應(yīng)用最為廣泛的三種是: Hash簽名、DSS簽名和RSA簽名。
1. Hash簽名
Hash簽名不屬于強(qiáng)計(jì)算密集型算法,應(yīng)用較廣泛。它可以降低服務(wù)器資源的消耗,減輕中央服務(wù)器的負(fù)荷。Hash的主要局限是接收方必須持有用戶密鑰的副本以檢驗(yàn)簽名, 因?yàn)殡p方都知道生成簽名的密鑰,較容易攻破,存在偽造簽名的可能。
2. DSS和RSA簽名
DSS和RSA采用了公鑰算法,不存在Hash的局限性。RSA是最流行的一種加密標(biāo)準(zhǔn),許多產(chǎn)品的內(nèi)核中都有RSA的軟件和類庫(kù)。早在Web飛速發(fā)展之前,RSA數(shù)據(jù)安全公司就負(fù)責(zé)數(shù)字簽名軟件與Macintosh操作系統(tǒng)的集成,在Apple的協(xié)作軟件PowerTalk上還增加了簽名拖放功能,用戶只要把需要加密的數(shù)據(jù)拖到相應(yīng)的圖標(biāo)上,就完成了電子形式的數(shù)字簽名。與DSS不同,RSA既可以用來加密數(shù)據(jù),也可以用于身份認(rèn)證。和Hash簽名相比,在公鑰系統(tǒng)中,由于生成簽名的密鑰只存儲(chǔ)于用戶的計(jì)算機(jī)中,安全系數(shù)大一些。
功能
數(shù)字簽名可以解決否認(rèn)、偽造、篡改及冒充等問題。具體要求:發(fā)送者事后不能否認(rèn)發(fā)送的報(bào)文簽名、接收者能夠核實(shí)發(fā)送者發(fā)送的報(bào)文簽名、接收者不能偽造發(fā)送者的報(bào)文簽名、接收者不能對(duì)發(fā)送者的報(bào)文進(jìn)行部分篡改、網(wǎng)絡(luò)中的某一用戶不能冒充另一用戶作為發(fā)送者或接收者。數(shù)字簽名的應(yīng)用范圍十分廣泛,在保障電子數(shù)據(jù)交換(EDI)的安全性上是一個(gè)突破性的進(jìn)展,凡是需要對(duì)用戶的身份進(jìn)行判斷的情況都可以使用數(shù)字簽名,比如加密信件、商務(wù)信函、定貨購(gòu)買系統(tǒng)、遠(yuǎn)程金融交易、自動(dòng)模式處理等等。
缺憾
數(shù)字簽名的引入過程中不可避免地會(huì)帶來一些新問題,需要進(jìn)一步加以解決,數(shù)字簽名需要相關(guān)法律條文的支持。
1. 需要立法機(jī)構(gòu)對(duì)數(shù)字簽名技術(shù)有足夠的重視,并且在立法上加快腳步,迅速制定有關(guān)法律,以充分實(shí)現(xiàn)數(shù)字簽名具有的特殊鑒別作用,有力地推動(dòng)電子商務(wù)以及其他網(wǎng)上事務(wù)的發(fā)展。
2. 如果發(fā)送方的信息已經(jīng)進(jìn)行了數(shù)字簽名,那么接收方就一定要有數(shù)字簽名軟件,這就要求軟件具有很高的普及性。
3. 假設(shè)某人發(fā)送信息后脫離了某個(gè)組織,被取消了原有數(shù)字簽名的權(quán)限,以往發(fā)送的數(shù)字簽名在鑒定時(shí)只能在取消確認(rèn)列表中找到原有確認(rèn)信息,這樣就需要鑒定中心結(jié)合時(shí)間信息進(jìn)行鑒定。
4. 基礎(chǔ)設(shè)施(鑒定中心、在線存取數(shù)據(jù)庫(kù)等)的費(fèi)用,是采用公共資金還是在使用期內(nèi)向用戶收費(fèi)?如果在使用期內(nèi)收費(fèi),會(huì)不會(huì)影響到這項(xiàng)技術(shù)的全面推廣?
實(shí)施
實(shí)現(xiàn)數(shù)字簽名有很多方法,目前采用較多的是非對(duì)稱加密技術(shù)和對(duì)稱加密技術(shù)。雖然這兩種技術(shù)實(shí)施步驟不盡相同,但大體的工作程序是一樣的。用戶首先可以下載或者購(gòu)買數(shù)字簽名軟件,然后安裝在個(gè)人電腦上。在產(chǎn)生密鑰對(duì)后,軟件自動(dòng)向外界傳送公開密鑰。由于公共密鑰的存儲(chǔ)需要,所以需要建立一個(gè)鑒定中心(CA)完成個(gè)人信息及其密鑰的確定工作。鑒定中心是一個(gè)政府參與管理的第三方成員,以便保證信息的安全和集中管理。用戶在獲取公開密鑰時(shí),首先向鑒定中心請(qǐng)求數(shù)字確認(rèn),鑒定中心確認(rèn)用戶身份后,發(fā)出數(shù)字確認(rèn),同時(shí)鑒定中心向數(shù)據(jù)庫(kù)發(fā)送確認(rèn)信息。然后用戶使用私有密鑰對(duì)所傳信息簽名,保證信息的完整性、真實(shí)性,也使發(fā)送方無法否認(rèn)信息的發(fā)送,之后發(fā)向接收方;接收方接收到信息后,使用公開密鑰確認(rèn)數(shù)字簽名,進(jìn)入數(shù)據(jù)庫(kù)檢查用戶確認(rèn)信息的狀況和可信度;最后數(shù)據(jù)庫(kù)向接收方返回用戶確認(rèn)狀態(tài)信息。不過,在使用這種技術(shù)時(shí),簽名者必須注意保護(hù)好私有密鑰,因?yàn)樗枪_密鑰體系安全的重要基礎(chǔ)。如果密鑰丟失,應(yīng)該立即報(bào)告鑒定中心取消認(rèn)證,將其列入確認(rèn)取消列表之中。其次,鑒定中心必須能夠迅速確認(rèn)用戶的身份及其密鑰的關(guān)系。一旦接收到用戶請(qǐng)求,鑒定中心要立即認(rèn)證信息的安全性并返回信息。
總結(jié)
以上是生活随笔為你收集整理的密码库LibTomcrypt的内容介绍及分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android library proj
- 下一篇: Jar mismatch! Fix yo