演算法非正式
㈠ 未來的電腦會是什麼樣子
寫作思路:寫作時從大處著手,盡量闡述自己的看法或者思想,全面詳雀老細的解答問題,並且緊扣問題的中心,把要表達的內容完整表述出來。
不久的將來,會出現一種電腦.它的功能奇異,主要畢改有七大特點,竟是些什麼特點呢?讓我來告訴你吧!
它的第一特點是它不用手操做,只要說就可以了;
第二特點是他沒有笨重的身體,它的外形只是個耳機,上面連這個電腦眼鏡,你戴上它會很舒服;
第三特點是它可以折疊手歲判,如果不用了可以把它折疊後裝起來,只需要一個一立方分米的盒子;
第四特點是它既能打電話也能無限上網;
第五特點是它可以當雷達,可以發現什麼東西靠近你了,是用衛星發射的;
第六特點是當它調到車內狀態時,它可以發現近一公里以內所有的警察以及攝相頭,你發現它亮了,你就開慢點,預防被警察罰超速,或被攝像頭拍下來,也是用衛星發射的;
第七特點是它可以無限收看全球各個台,未來的電腦。
有了這種電腦,那生活將是多麼多姿多彩呀!它能給人帶來許多方便之處。但是,它是需要人去發明的。不論是十年、二十年、三十年……不論多少年,我相信,它一定會被發明出來的。
未來的東西一定都很奇妙,也許不久就會有更先進、更完美的電腦被人們發明出來。
㈡ 計算機的未來會是什麼樣的
假設你打算買輛新車,銷售人員說:「你知道嗎,這款車不光可以在路上開。」
「喔?」
「真的,你還可以用它做咐腔譽其他事。比如,這樣折疊起來就是一輛不錯的自行車。打開能變成一架一流的飛機。浸在水裡的時候就是潛水艇。還能變身宇宙飛船喲!」
你肯定以為銷售在逗你玩。不過世界上確實存在著可塑性如此高的事物,那就是計算機。我們用飛行模擬器飛躍自由女神像,用電子表格進行財務分析,用Facebook和朋友聊天,除此之外計算機還有各種各樣其他用途。計算機就如同一台既是汽車又是自行車還是宇宙飛船的萬能神器。
廣義相對論就更棘手了。廣義相對論允許奇點的存在,而奇點割裂時空的方式至今仍無人能解。縱然一干相對論者已開發出模擬某些特定物理情境的諸多技術,就我所知,還沒有人對如何有效模擬廣義相對論做出過完整和系統的分析。這仍然是一個懸而未決的迷人課題。
學者赫伯特·西蒙在他的著作《人工的科學》中將科學做了區分。他將科學分為物理學和生物學這種研究自然生成系統的科學;與計算機科學和經濟學這種研究人造系統的科學。
乍看起來,人工科學應該屬於自然科學的特例。但正如多伊奇原理所指出的,計算機這樣的人工系統中蘊含的特質也許正如自然生成的系統一樣豐富。想像一下,我們不僅可以用計算機模擬人類的物理定律,或許甚至可以模擬其他的物理實在。用計算機科學家艾倫·凱伊的話說,「就自然科學而言,大自然給了我們一個世界,我們來發掘它的定律。就計算機而言,我們將定律裝進機器中,創造出一個世界。」多伊奇原理為統一自然科學與人工科學架設了一道橋梁。令人振奮的是,我們就快要證明出這一基本科學原理了。
文章來源:Quanta Magazine
文章作者:Michael Nielsen
編譯:未來論壇 商白
文章轉載請註明出處為 「未來論壇」微信賬號(ID:futureforum)
㈢ 世紀的演算法是什麼
世紀的演算法是在年份的前兩位數加一,例如1990年,19+1等於20,即1990年為20世紀。
一個世紀代表一百年,通常是指連續的一百年。當用來計算日子時,世紀通常從可以被100整除的年代或此後一年開始,例如2000年或2001年。
這種奇數的紀年法來自於耶穌紀元後,其中的1年通常表示「吾主之年」(year of our lord),因此一世紀從公元1年到公元100年,而二十世紀則從公元1901年到公元2000年,因此2001年是二十一世紀的第一年。
世紀的開始和結束:
盡管一個世紀可以表示任何 100年的任意時期,但對於標准世紀的性質有兩種觀點。一種是基於嚴格的建設,一種是基於大眾的認知。
根據嚴格的結構,公元1世紀始於公元1年,結束於公元100年,公元2世紀跨越101年至200年,同樣的模式繼續向前。在這個模型中,第n個世紀以「01」結束的年份開始,以「00」結束的年份結束;例如,20 世紀包括嚴格使用的1901 年至2000年。
在普遍的看法和實踐中,世紀是通過基於共享「數百」位數字來分組年份來構建的。
在這個模型中,'n'世紀以「00」結尾的年份開始,以「99」結尾的年份結束;例如,1900 年到1999 年,在流行文化中,構成了 20 世紀。(這類似於共享「十」位 的「0 到 9 十年」的分組。)
為了便於計算機計算歷法,天文年份編號和ISO 8601系統都包含零年,天文年 0 對應公元前 1 年,天文年 -1 對應公元前 2 年,以此類推。
替代命名系統
非正式地,可以根據一年中的數百個部分分組引用年份。在這個系統中,1900-1999 年被稱為十九世紀(1900 年代)。除英語使用外,該系統還用於瑞典語、丹麥語、挪威語、冰島語、芬蘭語和匈牙利語。
瑞典語nittonhundratalet(或1900-talet)、丹麥語nittenhundretallet(或1900-tallet )、挪威語nittenhundretallet(或1900-tallet );
芬蘭語tuhatyhdeksänsataaluku(或1900-luku)和匈牙利語ezerkilencszázas évek(或1900-as évek)明確指代 1900-1999 年。
義大利語也有類似的系統,但它只表示數百而省略了「千」一詞。該系統主要作用於 11 世紀至 20 世紀:
1、ilQuattrocento(即「四百」,15世紀)
2、ilCinquecento(即「五百」,16世紀)。
當提到義大利的歷史時,這些術語經常在其他語言中使用。
㈣ 如何學好hac函數與sha256演算法
SHA 家族
SHA (Secure Hash Algorithm,譯作安全散列演算法) 是美國國家安全局 (NSA) 設計,美國國家標准與技術研究院 (NIST) 發布的一系列密碼散列函數。正式名稱為 SHA 的家族第一個成員發布於 1993年。然而現在的人們給它取了一個非正式的名稱 SHA-0 以避免與它的後繼者混淆。兩年之後, SHA-1,第一個 SHA 的後繼者發布了。 另外還有四種變體,曾經發布以提升輸出的范圍和變更一些細微設計: SHA-224, SHA-256, SHA-384 和 SHA-512 (這些有時候也被稱做 SHA-2)。
SHA-0 和 SHA-1
最初載明的演算法於 1993年發布,稱做安全散列標准 (Secure Hash Standard),FIPS PUB 180。這個版本現在常被稱為 "SHA-0"。它在發布之後很快就被 NSA 撤回,並且以 1995年發布的修訂版本 FIPS PUB 180-1 (通常稱為 "SHA-1") 取代。根據 NSA 的說法,它修正了一個在原始演算法中會降低密碼安全性的錯誤。然而 NSA 並沒有提供任何進一步的解釋或證明該錯誤已被修正。1998年,在一次對 SHA-0 的攻擊中發現這次攻擊並不能適用於 SHA-1 — 我們不知道這是否就是 NSA 所發現的錯誤,但這或許暗示我們這次修正已經提升了安全性。SHA-1 已經被公眾密碼社群做了非常嚴密的檢驗而還沒發現到有不安全的地方,它現在被認為是安全的。
SHA-0 和 SHA-1 會從一個最大 2^64 位元的訊息中產生一串 160 位元的摘要然後以設計 MD4 及 MD5 訊息摘要演算法的 MIT 教授 Ronald L. Rivest 類似的原理為基礎來加密。
SHA-0 的密碼分析
在 CRYPTO 98 上,兩位法國研究者展示了一次對 SHA-0 的攻擊 (Chabaud and Joux, 1998): 散列碰撞可以復雜到 2^61 時被發現;小於 2^80 是理想的相同大小散列函數。
2004年時,Biham 和 Chen 發現了 SHA-0 的近似碰撞 — 兩個訊息可以散列出相同的數值;在這種情況之下,142 和 160 位元是一樣的。他們也發現了 SHA-0 在 80 次之後減少到 62 位元的完整碰撞。
2004年8月12日,Joux, Carribault, Lemuet 和 Jalby 宣布了完整 SHA-0 演算法的散列碰撞。這是歸納 Chabaud 和 Joux 的攻擊所完成的結果。發現這個碰撞要復雜到 2^51, 並且用一台有 256 顆 Itanium2 處理器的超級電腦耗時大約 80,000 CPU 工作時 。
2004年8月17日,在 CRYPTO 2004 的 Rump 會議上,Wang, Feng, Lai, 和 Yu 宣布了攻擊 MD5、SHA-0 和其他散列函數的初步結果。他們對 SHA-0 攻擊復雜到 2^40,這意味著他們攻擊的成果比 Joux 還有其他人所做的更好。該次 Rump 會議的簡短摘要可以在 這里找到,而他們在 sci.crypt 的討論,例如: 這些結果建議計劃使用 SHA-1 作為新的密碼系統的人需要重新考慮。
更長的變種
NIST 發布了三個額外的 SHA 變體,每個都有更長的訊息摘要。以它們的摘要長度 (以位元計算) 加在原名後面來命名:"SHA-256", "SHA-384" 和 "SHA-512"。它們發布於 2001年的 FIPS PUB 180-2 草稿中,隨即通過審查和評論。包含 SHA-1 的 FIPS PUB 180-2,於 2002年以官方標准發布。這些新的散列函數並沒有接受像 SHA-1 一樣的公眾密碼社群做詳細的檢驗,所以它們的密碼安全性還不被大家廣泛的信任。2004年2月,發布了一次 FIPS PUB 180-2 的變更通知,加入了一個額外的變種 "SHA-224",定義了符合雙金鑰 3DES 所需的金鑰長度。
Gilbert 和 Handschuh (2003) 研究了新的變種並且沒有發現弱點。
SHAd
SHAd 函數是一個簡單的相同 SHA 函數的重述:
SHAd-256(m)=
㈤ 誰能介紹一下鬼魂演算法
所謂"鬼魂演算法",是一個非正式名稱,網路上都搜不到,也即把螞蟻視作鬼魂,可以彼此穿過對方的身體.
有一根27厘米的細木桿,滲鄭在第3厘米、7厘米、11厘米、17厘米、23厘米叢型頌這五個位置上各有一隻螞蟻。木桿很細,不能同時通過一隻螞蟻。租頌開始時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,但不會後退。當任意兩只螞蟻碰頭時,兩只螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鍾可以走一厘米的距離。編寫程序,求所有螞蟻都離開木桿的最小時間和最大時間。
㈥ 人工智慧需要什麼基礎
人工智慧是多學科,涵蓋計算理論,數學基礎,計算機編程,涵蓋基因組或生物信息學,計算機非正式推理,模式滾塵識別,統計演算法建模和解決。
在統計,機械推理,認知科學,生物學,工程學等中找到協同作用,從中發展實際應用。
第四次工業革命給人工智慧帶來了前所未有的機遇。已經熟悉的比如,機器人下棋,機器人可做一些工廠重復性作業。在人工智慧基礎知識中,可能會包括機器演算法、計算理論,貝葉斯推理,貝葉斯網路,規劃演算法,機器函數語言,概率編程語言,計算機視覺,統計模式識別,信息理論,葯物,視網膜眼科學,細胞蛋白質組學習。推理如計算建模,特尺寬別在數學方面,類計算,自動推理,圖形推理,知識表示,定理證明,認知科學,機器學習,人際互動等方面。
初學者:掌握一門編程語言,編程語言好似與機器人交流,編程語言能讓機器人完成一系列具體的動作或實驗。演算法包括遞歸,概率,隨機,堆排序,線性排序,很像是數據結構中的二叉樹那樣的演算法內容等。具體好像是建立一個模型,編寫一段程大困禪序,機器人完成一系列動作應用在生產生活各個領域。
㈦ 偽演算法是什麼意思
偽演算法即偽代碼
概述:
偽碼(Pseudocode)是一種演算法描述語言。使用偽碼的目的是使被描述的演算法可以容易地以任何一種編程語言(Pascal,C,Java等)實現。因此,偽代碼必須結構清晰、代碼簡單、可讀性好,並且類似自然語言。 介於自然語言與編程語言之間。以編程語言的書寫形式指明演算法職能。使用偽代碼, 不用拘泥於具體實現。相比程序語言(例如Java, C++,C, Dephi 等等)它更類似自然語言。它是半形式化、不標準的語言。可以將整個演算法運行過程的結構用接近自然語言的形式(可以使用任何一種你熟悉的文字,關鍵是把程序的意思表達出來)描述出來。
定義
人們在用不同的編程語言實現同一個演算法時意識到,他們的實現(注意:這里是實現,不是功能)很不同。尤其是對於那些熟練於不同編程語言的程序員要理解一個(用其他編程語言編寫的程序的)功能時可能很難,因為程序語言的形式限制了程序員對程序關鍵部分的理解。這樣偽代碼就應運而生了。偽代碼提供了更多的設計信息,每一個模塊的描述都必須與設計結構圖一起出現。偽代碼是一種非正式的,類似於英語結構的,用於描述模塊結構圖的語言。
應用領域
當考慮演算法功能(而不是其語言實現)時,偽碼常常得到應用。偽碼中常被用於技術文檔和科學出版物中來表示演算法,也被用於在軟體開發的實際編碼過程之前表達程序的邏輯。偽代碼不是用戶和分析師的工具,而是設計師和程序員的工具。計算機科學在教學中通常使用虛擬碼,以使得所有的程序員都能理解。
綜上,簡單地說,讓人便於理解的代碼。不依賴於語言的,用來表示程序執行過程,而不一定能編譯運行的代碼。在數據結構講演算法的時候用的很多。偽代碼用來表達程序員開始編碼前的想法。
㈧ 偽代碼是什麼意思
偽代碼是一種非正式的,類似於英語結構的,用來描述模塊結構圖的語言。它是半形式化、不標準的語言,可以將整個演算法運行過程的結構用接近自然語言的形式(可以使用任何一種熟悉的文字,關鍵是把程序的意思表達出來)描述出來。
使用偽代碼的目的是使被描述的演算法可以容易地以任何一種編程語言(Pascal,C,Java等)實現。因此,偽代碼必須結構清晰、代碼簡單、可讀性好,並且類似自然語言。 介於自然語言與編程語言之間。以編程語言的書寫形式指明演算法職能。使用偽代碼, 不用拘泥於具體實現。
簡單示例:輸入3個數,列印輸出其中最大的數。可用如下的偽代碼表示:
Begin(演算法開始)
輸入 A,B,C
IF A>B 則 A→Max
否則 B→Max
IF C>Max 則 C→Max
Print Max
End (演算法結束)
(8)演算法非正式擴展閱讀
偽代碼應用領域
偽代碼中常被用於技術文檔和科學出版物中來表示演算法,也被用於在軟體開發的實際編碼過程之前表達程序的邏輯。偽代碼不是用戶和分析師的工具,而是設計師和程態褲臘序員的工具。計算機科學在教學中通常使用虛擬碼,以使得所有的程序員都能理解。當考慮演算法功能(而不是其語言實現)時,偽代碼常常得到應用。
偽代碼只是像流程圖一樣用在程序設計的初期,幫助寫出程序流程。如果把全部的程序流程寫下來必定可能會浪費很多時間,那麼這個時候可以採用偽代碼方式。
簡單地說,偽代碼是讓人便於理解的代碼,是不依賴於語言的,用來表示程純滲序帆滑執行過程,而不一定能編譯運行的代碼。
㈨ 了解數字編碼的途徑工作需要
了解數字編碼的途徑工作需要
對數字編碼記憶法旦扒枯有所了解的人都知道,編碼是數字記憶的重點,要求結合自己的喜好編制一套編碼系統就好,那麼如何編制一套適合我記憶的編碼,老師跟你們分享一下幾種編制的方法。
常見的數字記憶法:諧音記憶法、形象轉化法和意義轉化法。而且,這三種記憶法也是編碼的思路非常容易學習和理解。
當你開始學習編程時,你可能會問自己的一個問題是「我應該先學習什麼語言?
關於學習編碼,最令人興奮-有時甚至是壓倒性的事情之一就是要學習多少東西。
但是,它不僅可以專注於學習一項特定的技術,還可以幫助學習基礎 - 構建塊。您可以剝離抽象層,以了解所有技術共同的基本原則。
在基本層面上了解什麼是編碼將使解決問題更容易,並讓您更好地了解不同技術的工作原理。
本文介紹了計算機編碼的基礎知識以及由哪些程序組成,同時還給出了一些有關模洞如何開始學習如何編碼的第一步的建議。
什麼是編碼?初學者的定義
計算機編碼,也稱為計算機編程,是一種告訴計算機該做什麼的方法。
編碼是一種告訴計算機它應該如何表現的方法 - 它需要採取的確切行動以及如何以有效和高效的方式採取這些行動。
具體來說,編碼是創建然後向計算機提供一組詳細的指令的過程,這些指令將按順序仔細執行。
指令集稱為程序或代碼。
計算機是非常聰明的機器,但它們依靠人類來完成工作。
簡而言之,編碼是人類與計算機通信的藝術。它幫助我們解決問題並為社區創建有用的新工具,例如應用程序或網站,並使我們能夠分析和處理大量數據。
編碼過程概述
編碼就是解決問題。
在編寫代碼時,您將使用邏輯推理將問題分解為越來越小的行動步驟,以最終得出結論和解決方案。
計算機從字面上理解一切,並極其注重細節。
在代碼中犯一個小錯誤 - 例如單詞中的拼寫錯誤,錯過的分號,告訴計算機重復某個操作,但不告訴它如何以及何時停止重復它 - 都會導致錯誤消息。
這些錯誤稱為代碼中的 bug。
識別可能的錯誤,找到導致問題的原因,然後修復錯誤以使代碼按預期工作的過程稱為調試。
這是編寫代碼和學習如何編寫代碼的關鍵部分。
為什麼演算法在編碼中很重要
弄清楚給計算機的確切指令,以便它可以完成特定的任務,這是編碼和解決問題最困難的部分。
計算機不做任何假設,它們完全按照他們被告知的方式做。這意味著他們收到的指令中不應該有歧義。
指令需要明確定義,並具有計算機解決問題應採取的正確步驟的數量和順序。
用於解決問題和計算機完成每個任務的分步有序指令集稱為演算法。
演算法是需要正確,高效,精確和切中要害的行動序列,它們不應該留下誤解的餘地。
演算法不僅保留給計算機遵循。人類每天也使用演算法。
我們經常使用的一種演算法的一個例子是遵循烹飪食譜。
配方就是演算法。您需要按照正確的順序遵循配方中的一系列步驟,以獲得所需的最終結果。
如何編寫偽代碼來規劃演算法
組織,提前計劃並寫下您需要遵循的步驟或演算法的方法是首先編寫偽代碼。
偽代碼是表示演算法的非正式方式。
偽代碼沒有特定的語法。它使用一些技術術語,用簡單易讀的英語(或任何其他自然的人類語言)編寫。
編寫它的目的只是為了讓程序員使用簡單的短語來理解需要編寫的代碼/步驟背後的推理和邏輯,以解決問題。
這樣做之後,程序員編寫由計算機實際執行的代碼。
偽代碼是計算機代碼的更簡單版本,是編寫任何計算機代碼之前的第一步。
例如,假設您要編寫一個程序,該程序要求用戶輸入密碼並檢查它是否等於「1234」。
如果密碼等於「1234」此稿,那麼你就讓他們進入系統,否則他們就會被拒絕。
㈩ 公鑰密碼系統及RSA公鑰演算法
公鑰密碼系統及RSA公鑰演算法
本文簡單介紹了公開密鑰密碼系統的思想和特點,並具體介紹了RSA演算法的理論基礎,工作原理和具體實現過程,並通過一個簡單例子說明了該演算法是如何實現。在本文的最後,概括說明了RSA演算法目前存在的一些缺點和解決方法。
關鍵詞:公鑰密碼體制 , 公鑰 ,私鑰 ,RSA
§1引言
隨著計算機聯網的逐步實現,Internet前景越來越美好,全球經濟發展正在進入信息經濟時代,知識經濟初見端倪。計算機信息的保密問題顯得越來越重要,無論是個人信息通信還是電子商務發展,都迫切需要保證Internet網上信息傳輸的安全,需要保證信息安全。信息安全技術是一門綜合學科,它涉及資訊理論、計算機科學和密碼學等多方面知識,它的主要任務是研究計算機系統和通信網路內信息的保護方法以實現系統內信息的安全、保密、真實和完整。其中,信息安全的核心是密碼技術。密碼技術是集數學、計算機科學、電子與通信等諸多學科於一身的交叉學科。它不僅能夠保證機密性信息的加密,而且能夠實現數字簽名、身份驗證、系統安全等功能。是現代化發展的重要科學之一。本文將對公鑰密碼系統及該系統中目前最廣泛流行的RSA演算法做一些簡單介紹。
§2公鑰密碼系統
要說明公鑰密碼系統,首先來了解一下不同的加密演算法:目前的加密演算法按密鑰方式可分為單鑰密碼演算法和公鑰密碼演算法。
2.1.單鑰密碼
又稱對稱式密碼,是一種比較傳統的加密方式,其加密運算、解密運算使用的是同樣的密鑰,信息的發送者和信息的接收者在進行信息的傳輸與處理時,必須共同持有該密碼(稱為對稱密碼)。因此,通信雙方都必須獲得這把鑰匙,並保持鑰匙的秘密。
單鑰密碼系統的安全性依賴於以下兩個因素:第一,加密演算法必須是足夠強的,僅僅基於密文本身去解密信息在實踐上是不可能的;第二,加密方法的安全性依賴於密鑰的秘密性,而不是演算法的秘密性,因此,我們沒有必要確保演算法的秘密性(事實上,現實中使用的很多單鑰密碼系統的演算法都是公開的),但是我們一定要保證密鑰的秘密性。
從單鑰密碼的這些特點我們容易看出它的主要問題有兩點:第一,密鑰量問題。在單鑰密碼系統中,每一對通信者就需要一對密鑰,當用戶增加時,必然會帶來密鑰量的成倍增長,因此在網路通信中,大量密鑰的產生﹑存放和分配將是一個難以解決的問題。第二,密鑰分發問題。單鑰密碼系統中,加密的安全性完全依賴於對密鑰的保護,但是由於通信雙方使用的是相同的密鑰,人們又不得不相互交流密鑰,所以為了保證安全,人們必須使用一些另外的安全信道來分發密鑰,例如用專門的信使來傳送密鑰,這種做法的代價是相當大的,甚至可以說是非常不現實的,尤其在計算機網路環境下,人們使用網路傳送加密的文件,卻需要另外的安全信道來分發密鑰,顯而易見,這是非常不智是甚至是荒謬可笑的。
2.2公鑰密碼
正因為單鑰密碼系統存在如此難以解決的缺點,發展一種新的﹑更有效﹑更先進的密碼體制顯得更為迫切和必要。在這種情況下,出現了一種新的公鑰密碼體制,它突破性地解決了困擾著無數科學家的密鑰分發問題,事實上,在這種體制中,人們甚至不用分發需要嚴格保密的密鑰,這次突破同時也被認為是密碼史上兩千年來自單碼替代密碼發明以後最偉大的成就。
這一全新的思想是本世紀70年代,美國斯坦福大學的兩名學者Diffie和Hellman提出的,該體制與單鑰密碼最大的不同是:
在公鑰密碼系統中,加密和解密使用的是不同的密鑰(相對於對稱密鑰,人們把它叫做非對稱密鑰),這兩個密鑰之間存在著相互依存關系:即用其中任一個密鑰加密的信息只能用另一個密鑰進行解密。這使得通信雙方無需事先交換密鑰就可進行保密通信。其中加密密鑰和演算法是對外公開的,人人都可以通過這個密鑰加密文件然後發給收信者,這個加密密鑰又稱為公鑰;而收信者收到加密文件後,它可以使用他的解密密鑰解密,這個密鑰是由他自己私人掌管的,並不需要分發,因此又成稱為私鑰,這就解決了密鑰分發的問題。
為了說明這一思想,我們可以考慮如下的類比:
兩個在不安全信道中通信的人,假設為Alice(收信者)和Bob(發信者),他們希望能夠安全的通信而不被他們的敵手Oscar破壞。Alice想到了一種辦法,她使用了一種鎖(相當於公鑰),這種鎖任何人只要輕輕一按就可以鎖上,但是只有Alice的鑰匙(相當於私鑰)才能夠打開。然後Alice對外發送無數把這樣的鎖,任何人比如Bob想給她寄信時,只需找到一個箱子,然後用一把Alice的鎖將其鎖上再寄給Alice,這時候任何人(包括Bob自己)除了擁有鑰匙的Alice,都不能再打開箱子,這樣即使Oscar能找到Alice的鎖,即使Oscar能在通信過程中截獲這個箱子,沒有Alice的鑰匙他也不可能打開箱子,而Alice的鑰匙並不需要分發,這樣Oscar也就無法得到這把「私人密鑰」。
從以上的介紹可以看出,公鑰密碼體制的思想並不復雜,而實現它的關鍵問題是如何確定公鑰和私鑰及加/解密的演算法,也就是說如何找到「Alice的鎖和鑰匙」的問題。我們假設在這種體制中, PK是公開信息,用作加密密鑰,而SK需要由用戶自己保密,用作解密密鑰。加密演算法E和解密演算法D也都是公開的。雖然SK與PK是成對出現,但卻不能根據PK計算出SK。它們須滿足條件:
①加密密鑰PK對明文X加密後,再用解密密鑰SK解密,即可恢復出明文,或寫為:DSK(EPK(X))=X
②加密密鑰不能用來解密,即DPK(EPK(X))≠X
③在計算機上可以容易地產生成對的PK和SK。
④從已知的PK實際上不可能推導出SK。
⑤加密和解密的運算可以對調,即:EPK(DSK(X))=X
從上述條件可看出,公開密鑰密碼體制下,加密密鑰不等於解密密鑰。加密密鑰可對外公開,使任何用戶都可將傳送給此用戶的信息用公開密鑰加密發送,而該用戶唯一保存的私人密鑰是保密的,也只有它能將密文復原、解密。雖然解密密鑰理論上可由加密密鑰推算出來,但這種演算法設計在實際上是不可能的,或者雖然能夠推算出,但要花費很長的時間而成為不可行的。所以將加密密鑰公開也不會危害密鑰的安全。
這種體制思想是簡單的,但是,如何找到一個適合的演算法來實現這個系統卻是一個真正困擾密碼學家們的難題,因為既然Pk和SK是一對存在著相互關系的密鑰,那麼從其中一個推導出另一個就是很有可能的,如果敵手Oscar能夠從PK推導出SK,那麼這個系統就不再安全了。因此如何找到一個合適的演算法生成合適的Pk和SK,並且使得從PK不可能推導出SK,正是迫切需要密碼學家們解決的一道難題。這個難題甚至使得公鑰密碼系統的發展停滯了很長一段時間。
為了解決這個問題,密碼學家們考慮了數學上的陷門單向函數,下面,我們可以給出它的非正式定義:
Alice的公開加密函數應該是容易計算的,而計算其逆函數(即解密函數)應該是困難的(對於除Alice以外的人)。許多形式為Y=f(x)的函數,對於給定的自變數x值,很容易計算出函數Y的值;而由給定的Y值,在很多情況下依照函數關系f (x)計算x值十分困難。這樣容易計算但難於求逆的函數,通常稱為單向函數。在加密過程中,我們希望加密函數E為一個單項的單射函數,以便可以解密。雖然目前還沒有一個函數能被證明是單向的,但是有很多單射函數被認為是單向的。
例如,有如下一個函數被認為是單向的,假定n為兩個大素數p和q的乘積,b為一個正整數,那麼定義f:
f (x )= x b mod n
(如果gcd(b,φ(n))=1,那麼事實上這就是我們以下要說的RSA加密函數)
如果我們要構造一個公鑰密碼體制,僅給出一個單向的單射函數是不夠的。從Alice的觀點來看,並不需要E是單向的,因為它需要用有效的方式解密所收到的信息。因此,Alice應該擁有一個陷門,其中包含容易求出E的你函數的秘密信息。也就是說,Alice可以有效解密,因為它有額外的秘密知識,即SK,能夠提供給你解密函數D。因此,我們稱一個函數為一個陷門單向函數,如果它是一個單向函數,並在具有特定陷門的知識後容易求出其逆。
考慮上面的函數f (x) = xb mod n。我們能夠知道其逆函數f -1有類似的形式f (x ) = xa mod n,對於合適的取值a。陷門就是利用n的因子分解,有效的算出正確的指數a(對於給定的b)。
為方便起見,我們把特定的某類陷門單向函數計為?。那麼隨機選取一個函數f屬於?,作為公開加密函數;其逆函數f-1是秘密解密函數。那麼公鑰密碼體制就能夠實現了。
根據以上關於陷門單向函數的思想,學者們提出了許多種公鑰加密的方法,它們的安全性都是基於復雜的數學難題。根據所基於的數學難題,至少有以下三類系統目前被認為是安全和有效的:大整數因子分解系統(代表性的有RSA)、橢園曲線離散對數系統(ECC)和離散對數系統(代表性的有DSA)。
§3 RSA演算法
3.1簡介
當前最著名、應用最廣泛的公鑰系統RSA是在1978年,由美國麻省理工學院(MIT)的Rivest、Shamir和Adleman在題為《獲得數字簽名和公開鑰密碼系統的方法》的論文中提出的。它是一個基於數論的非對稱(公開鑰)密碼體制,是一種分組密碼體制。其名稱來自於三個發明者的姓名首字母。它的安全性是基於大整數素因子分解的困難性,而大整數因子分解問題是數學上的著名難題,至今沒有有效的方法予以解決,因此可以確保RSA演算法的安全性。RSA系統是公鑰系統的最具有典型意義的方法,大多數使用公鑰密碼進行加密和數字簽名的產品和標准使用的都是RSA演算法。
RSA演算法是第一個既能用於數據加密也能用於數字簽名的演算法,因此它為公用網路上信息的加密和鑒別提供了一種基本的方法。它通常是先生成一對RSA密鑰,其中之一是保密密鑰,由用戶保存;另一個為公開密鑰,可對外公開,甚至可在網路伺服器中注冊,人們用公鑰加密文件發送給個人,個人就可以用私鑰解密接受。為提高保密強度,RSA密鑰至少為500位長,一般推薦使用1024位。
該演算法基於下面的兩個事實,這些事實保證了RSA演算法的安全有效性:
1)已有確定一個數是不是質數的快速演算法;
2)尚未找到確定一個合數的質因子的快速演算法。
3.2工作原理
1)任意選取兩個不同的大質數p和q,計算乘積r=p*q;
2)任意選取一個大整數e,e與(p-1)*(q-1)互質,整數e用做加密密鑰。注意:e的選取是很容易的,例如,所有大於p和q的質數都可用。
3)確定解密密鑰d:d * e = 1 molo(p - 1)*(q - 1) 根據e、p和q可以容易地計算出d。
4)公開整數r和e,但是不公開d;
5)將明文P (假設P是一個小於r的整數)加密為密文C,計算方法為:
C = Pe molo r
6)將密文C解密為明文P,計算方法為:
P = Cd molo r
然而只根據r和e(不是p和q)要計算出d是不可能的。因此,任何人都可對明文進行加密,但只有授權用戶(知道d)才可對密文解密。
3.3簡單實例
為了說明該演算法的工作過程,我們下面給出一個簡單例子,顯然我們在這只能取很小的數字,但是如上所述,為了保證安全,在實際應用上我們所用的數字要大的多得多。
例:選取p=3, q=5,則r=15,(p-1)*(q-1)=8。選取e=11(大於p和q的質數),通過d * 11 = 1 molo 8,計算出d =3。
假定明文為整數13。則密文C為
C = Pe molo r
= 1311 molo 15
= 1,792,160,394,037 molo 15
= 7
復原明文P為:
P = Cd molo r
= 73 molo 15
= 343 molo 15
= 13
因為e和d互逆,公開密鑰加密方法也允許採用這樣的方式對加密信息進行"簽名",以便接收方能確定簽名不是偽造的。
假設A和B希望通過公開密鑰加密方法進行數據傳輸,A和B分別公開加密演算法和相應的密鑰,但不公開解密演算法和相應的密鑰。A和B的加密演算法分別是ECA和ECB,解密演算法分別是DCA和DCB,ECA和DCA互逆,ECB和DCB互逆。 若A要向B發送明文P,不是簡單地發送ECB(P),而是先對P施以其解密演算法DCA,再用加密演算法ECB對結果加密後發送出去。
密文C為:
C = ECB(DCA(P))
B收到C後,先後施以其解密演算法DCB和加密演算法ECA,得到明文P:
ECA(DCB(C))
= ECA(DCB(ECB(DCA(P))))
= ECA(DCA(P))/*DCB和ECB相互抵消*/
=
P /*DCB和ECB相互抵消*/
這樣B就確定報文確實是從A發出的,因為只有當加密過程利用了DCA演算法,用ECA才能獲得P,只有A才知道DCA演算法,沒 有人,即使是B也不能偽造A的簽名。
3.4優缺點
3.4.1優點
RSA演算法是第一個能同時用於加密和數字簽名的演算法,也易於理解和操作。RSA是被研究得最廣泛的公鑰演算法,從提出到現在已近二十年,經歷了各種攻擊的考驗,逐漸為人們接受,普遍認為是目前最優秀的公鑰方案之一。該演算法的加密密鑰和加密演算法分開,使得密鑰分配更為方便。它特別符合計算機網路環境。對於網上的大量用戶,可以將加密密鑰用電話簿的方式印出。如果某用戶想與另一用戶進行保密通信,只需從公鑰簿上查出對方的加密密鑰,用它對所傳送的信息加密發出即可。對方收到信息後,用僅為自己所知的解密密鑰將信息脫密,了解報文的內容。由此可看出,RSA演算法解決了大量網路用戶密鑰管理的難題,這是公鑰密碼系統相對於對稱密碼系統最突出的優點。
3.4.2缺點
1)產生密鑰很麻煩,受到素數產生技術的限制,因而難以做到一次一密。
2)安全性, RSA的安全性依賴於大數的因子分解,但並沒有從理論上證明破譯RSA的難度與大數分解難度等價,而且密碼學界多數人士傾向於因子分解不是NPC問題。目前,人們已能分解140多個十進制位的大素數,這就要求使用更長的密鑰,速度更慢;另外,目前人們正在積極尋找攻擊RSA的方法,如選擇密文攻擊,一般攻擊者是將某一信息作一下偽裝(Blind),讓擁有私鑰的實體簽署。然後,經過計算就可得到它所想要的信息。實際上,攻擊利用的都是同一個弱點,即存在這樣一個事實:乘冪保留了輸入的乘法結構:
( XM )d = Xd *Md mod n
前面已經提到,這個固有的問題來自於公鑰密碼系統的最有用的特徵--每個人都能使用公鑰。但從演算法上無法解決這一問題,主要措施有兩條:一條是採用好的公鑰協議,保證工作過程中實體不對其他實體任意產生的信息解密,不對自己一無所知的信息簽名;另一條是決不對陌生人送來的隨機文檔簽名,簽名時首先使用One-Way Hash Function對文檔作HASH處理,或同時使用不同的簽名演算法。除了利用公共模數,人們還嘗試一些利用解密指數或φ(n)等等攻擊.
3)速度太慢,由於RSA的分組長度太大,為保證安全性,n至少也要600 bitx以上,使運算代價很高,尤其是速度較慢,較對稱密碼演算法慢幾個數量級;且隨著大數分解技術的發展,這個長度還在增加,不利於數據格式的標准化。目前,SET(Secure Electronic Transaction)協議中要求CA採用2048比特長的密鑰,其他實體使用1024比特的密鑰。為了速度問題,目前人們廣泛使用單,公鑰密碼結合使用的方法,優缺點互補:單鑰密碼加密速度快,人們用它來加密較長的文件,然後用RSA來給文件密鑰加密,極好的解決了單鑰密碼的密鑰分發問題。
§4結束語
目前,日益激增的電子商務和其它網際網路應用需求使公鑰體系得以普及,這些需求量主要包括對伺服器資源的訪問控制和對電子商務交易的保護,以及權利保護、個人隱私、無線交易和內容完整性(如保證新聞報道或股票行情的真實性)等方面。公鑰技術發展到今天,在市場上明顯的發展趨勢就是PKI與操作系統的集成,PKI是「Public
Key Infrastructure」的縮寫,意為「公鑰基礎設施」。公鑰體制廣泛地用於CA認證、數字簽名和密鑰交換等領域。
公鑰加密演算法中使用最廣的是RSA。RSA演算法研製的最初理念與目標是努力使互聯網安全可靠,旨在解決DES演算法秘密密鑰的利用公開信道傳輸分發的難題。而實際結果不但很好地解決了這個難題;還可利用RSA來完成對電文的數字簽名以抗對電文的否認與抵賴;同時還可以利用數字簽名較容易地發現攻擊者對電文的非法篡改,以保護數據信息的完整性。目前為止,很多種加密技術採用了RSA演算法,該演算法也已經在互聯網的許多方面得以廣泛應用,包括在安全介面層(SSL)標准(該標準是網路瀏覽器建立安全的互聯網連接時必須用到的)方面的應用。此外,RSA加密系統還可應用於智能IC卡和網路安全產品。
但目前RSA演算法的專利期限即將結束,取而代之的是基於橢圓曲線的密碼方案(ECC演算法)。較之於RSA演算法,ECC有其相對優點,這使得ECC的特性更適合當今電子商務需要快速反應的發展潮流。此外,一種全新的量子密碼也正在發展中。
至於在實際應用中應該採用何種加密演算法則要結合具體應用環境和系統,不能簡單地根據其加密強度來做出判斷。因為除了加密演算法本身之外,密鑰合理分配、加密效率與現有系統的結合性以及投入產出分析都應在實際環境中具體考慮。加密技術隨著網路的發展更新,將有更安全更易於實現的演算法不斷產生,為信息安全提供更有力的保障。今後,加密技術會何去何從,我們將拭目以待。
參考文獻:
[1] Douglas R.Stinson.《密碼學原理與實踐》.北京:電子工業出版社,2003,2:131-132
[2]西蒙.辛格.《密碼故事》.海口:海南出版社,2001,1:271-272
[3]嬴政天下.加密演算法之RSA演算法.http://soft.winzheng.com/infoView/Article_296.htm,2003
[4]加密與數字簽名.http://www.njt.cn/yumdq/dzsw/a2.htm
[5]黑客中級教程系列之十.http://www.qqorg.i-p.com/jiaocheng/10.html