加密是什麼?對稱式加密與公開金鑰加密的原理
加密是用固定的步驟和秘密的「金鑰」,把資料變成沒有金鑰的人讀不懂的形式。步驟公開,只有金鑰保密,是現代加密的基本原則。加密分成用同一把金鑰上鎖和開鎖的「對稱式加密」,以及上鎖和開鎖用不同金鑰的「公開金鑰加密」。實際上,兩者會搭配使用。
這篇文章可以了解
- 明文、密文、金鑰的意思,以及步驟公開也安全的原因
- 對稱式加密(AES)與公開金鑰加密(RSA加密等)的差異,以及搭配使用的原因
- 數位簽章和雜湊,與加密有什麼不同
- 在手機和通訊軟體中,加密保護的是哪裡
先備知識:不需要。搭配「HTTPS是什麼?」和「密碼為什麼會被破解?」一起閱讀,更容易看出彼此的關聯。
生活中的例子
解鎖手機的時候,用通訊軟體傳照片的時候,在網路上購物的時候。在這些場合,背後都有加密在運作。
那麼,加密是怎麼把內容藏起來的呢?你可能以為「加密的步驟保密比較安全」,但其實正好相反。
加密是什麼:變成沒有金鑰就讀不懂的形式
加密,是用固定的步驟轉換資料,讓人讀不出意思。轉換之前、任何人都讀得懂的資料,稱為「明文」。例如「明天10點在車站見」這則訊息,就是明文。
轉換時,除了步驟,還會用到「金鑰」。金鑰是放進步驟裡的秘密數值,在現代的加密中,是非常長的數。即使明文相同,金鑰不同,結果也會完全不一樣。這樣得到的、讀不懂的資料,稱為「密文」。
收到密文的人,用正確的金鑰把它變回明文。這稱為「解密」。對沒有金鑰的人來說,密文看起來只是一串雜亂的字元。
約2000年前的加密:凱撒密碼
先來看一個古老的例子。古羅馬的尤利烏斯·凱撒,曾把文字錯開來寫信。A換成D,B換成E,也就是換成往後數第3個字母。2世紀初,羅馬的歷史學家蘇埃托尼烏斯(Suetonius)留下了這樣的記載。
這個方法稱為「凱撒密碼」。在這裡,錯開的字母數就相當於金鑰。金鑰是3的話,「HELLO」會變成「KHOOR」。收到的人只要往前錯回同樣的數目,就能讀懂。
凱撒密碼在今天很容易破解。英文字母有26個,有意義的錯法只有1到25這25種。全部試一遍,其中一種就會出現讀得通的句子。
像這樣把金鑰的候選一個一個試過去的方法,稱為「暴力破解」。候選太少,很快就會被破解。所以現代的加密,金鑰的候選多到難以想像。
步驟公開,只有金鑰保密
加密的轉換步驟,稱為「加密方式」(演算法)。以凱撒密碼來說,「錯開字母」是方式,「3」是金鑰。那麼,方式和金鑰,應該把哪一個保密呢?
答案是「只有金鑰」。1883年,在法國任教、出生於荷蘭的語言學家柯克霍夫(Kerckhoffs),把軍用密碼應有的條件寫成了論文。其中一條是「方式不必保密,落入敵人手中也無妨」。這個想法稱為「柯克霍夫原則」,是現代設計加密的基本原則。
原因之一,是設備和軟體會大量發送出去,只要拆開來研究,方式遲早會外洩。金鑰的話,即使外洩,換掉就好。而且公開方式,全世界的專家都會幫忙找弱點。經過長期研究仍未被破解的方式,就值得信任。
對稱式加密:用同一把金鑰上鎖和開鎖
像凱撒密碼這樣,加密和解密使用同一把金鑰的方式,稱為對稱式加密(也稱為共用金鑰加密)。傳送的人和接收的人,必須持有相同的金鑰。因為計算很輕,連影片這樣大的資料,也能快速加密。
現在的代表是AES。美國國家標準暨技術研究院(NIST)向全世界徵求候選方式,花了3年公開比較。2000年選出比利時2位研究人員的方式,2001年定為標準。
AES的金鑰長度,可以從128、192、256位元中選擇。位元,是表示0或1的一位數。128位元的金鑰,就是排了128個0和1。排法共有2乘128次那麼多,約3.4×1038種(39位數)。
假設有一台每秒能試1018次金鑰(1後面接18個0)的機器。即使如此,要試完所有金鑰,也要約11兆年。這大約是宇宙誕生至今約138億年的780倍。平均試到一半就會猜中,但那仍然是宇宙年齡的數百倍。
金鑰要怎麼交給對方
對稱式加密有一個大煩惱。用加密對話之前,必須先和對方持有相同的金鑰。如果直接在網路上傳送金鑰,途中就會被偷看。見面親手交給對方雖然安全,但不可能在第一次使用網路商店之前,先和店家見面。
這個煩惱稱為「金鑰分配問題」。對象越多,問題越大。如果要和100人中的任何人都各自說秘密的話,每2人一組都需要一把金鑰。金鑰數是100×99÷2,共4,950把。
公開金鑰加密:上鎖和開鎖的金鑰分開
解決金鑰分配問題的,是公開金鑰加密。它使用成對的2把金鑰,把上鎖(加密)的金鑰和開鎖(解密)的金鑰分開。這對金鑰由接收的人自己製作。
2把金鑰中,一把是給誰看都沒關係的「公開金鑰」,公開在網路上也無妨。另一把是只有本人持有的「私密金鑰」。它的設計,讓現在的電腦無法在合理的時間內,從公開金鑰推算出私密金鑰。
使用方法如下。想傳秘密訊息給B的人,用B的公開金鑰加密。能打開這份密文的,只有持有私密金鑰的B。因為不必事先共享秘密,和初次往來的對象也能使用。
最早公開發表這個想法的,是美國的迪菲和赫爾曼。他們在1976年的論文中,提出了沒有共同秘密的2人,只靠通訊就做出相同金鑰的方法。這個方法稱為迪菲-赫爾曼金鑰交換,在現在的HTTPS中也扮演核心角色。
隔年1977年,李維斯特、薩莫爾、阿德曼3人想出了RSA加密。名稱來自3人姓氏的第一個字母。它的保護基礎,是把大的數分解成質數相乘(質因數分解)非常困難。
現在,用更短的金鑰就能達到相同強度的橢圓曲線密碼學,也被廣泛使用。另外,在英國的政府機構GCHQ,1970年代前半就想出了類似的方式,但一直保密到1997年。
數位簽章:把金鑰的角色互換
這對金鑰,角色互換也能使用。B用私密金鑰做出的記號,可以用B的公開金鑰確認。因為私密金鑰只有B持有,確認無誤的記號,就是「B做的」證據。這個記號稱為數位簽章。
簽章和文件的內容綁在一起。文件只要被改了1個字,確認時就會對不上。也就是說,簽章能知道「誰做的」和「途中有沒有被改」這2件事。軟體的更新檔和HTTPS的憑證,都會用到簽章。
有2點要注意。第一,簽章不會隱藏內容。附有簽章的文件,任何人都讀得到。第二,把簽章說成「用私密金鑰加密」,是只適用於RSA加密的簡化說法。例如橢圓曲線密碼學的簽章,是和加密不同的計算。
實際上會搭配使用
公開金鑰加密也有弱點。它的計算很重,不適合把大的資料整個加密。另一方面,對稱式加密雖然快,卻有金鑰怎麼交給對方的煩惱。
所以,把兩者搭配起來。一開始先用公開金鑰加密的技術,和對方共享只在這次通訊使用的對稱金鑰。正式的資料,再用這把對稱金鑰,以AES等方式加密。金鑰的交付交給公開金鑰加密,資料交給對稱式加密,各自負責擅長的工作。在資訊類考試中,這個組合稱為「混合式加密」。
教科書常說明的是「用對方的公開金鑰,把對稱金鑰加密後送出」的形式。作為基本形式,這是正確的說明。不過,現在的HTTPS(TLS 1.3這個版本)並不傳送金鑰本身。而是用迪菲-赫爾曼金鑰交換,互相傳送只用一次的材料,在兩邊各自做出相同的對稱金鑰。這是為了即使日後私密金鑰被偷,過去的通訊也不會被讀到。詳情在「HTTPS是什麼?」中說明。
雜湊和加密有什麼不同?
常和加密一起出現的,是雜湊函數。它能從任何長度的資料,算出固定長度的短數值。這個數值稱為雜湊值。相同的資料一定得到相同的數值,只差1個字,就會變成完全不同的數值。
| 加密 | 雜湊 | |
|---|---|---|
| 能不能還原 | 有金鑰就能還原 | 不能還原(單向) |
| 金鑰 | 使用 | 通常不使用 |
| 主要用途 | 隱藏內容 | 確認是否相同 |
最大的不同,在於能不能還原。雜湊本身就沒有還原的步驟。例如,服務會把密碼轉成雜湊值再儲存。詳情在「密碼為什麼會被破解?」中說明。在數位簽章中,也會用它把長的文件整理成短的數值。
加密保護的地方
網頁的通訊(HTTPS)
在「https://」的網頁,瀏覽器和伺服器之間是加密的。這是混合式加密和簽章的組合。
手機裡的資料
存在手機裡的照片和訊息,也在裝置內加密。Apple說明,在iPhone上設定解鎖密碼,這種加密就會自動啟用。Android方面,Google規定搭載Android 10以後版本推出的裝置,必須以檔案為單位加密。金鑰是由解鎖密碼和裝置內的秘密數值做出來的,所以很難從被偷的手機中取出內容。
通訊軟體
如果只是每一段通訊路徑各自加密,內容會在營運公司的伺服器上,一度變回讀得懂的形式。也有從傳送者的裝置到接收者的裝置,一路保持加密送達的方法。這稱為「端對端加密」。金鑰只有兩端的裝置持有,所以連在中間轉送訊息的公司,也讀不到內容。
WhatsApp在2016年4月,開始對所有訊息和通話使用這種方式。LINE也從2016年起,在符合條件的聊天中,對文字訊息等預設使用這種方式。不過,誰在什麼時候傳給誰的紀錄,是無法隱藏的。
Wi-Fi
Wi-Fi也會把手機和路由器之間的電波加密。目前主要的方式是WPA2,以及2018年開始的WPA3(「Wi-Fi是怎麼運作的?」)。Wi-Fi的加密保護的,只有電波的那一段。
量子電腦與今後的加密
對未來也有擔憂,那就是利用量子力學的性質來計算的「量子電腦」。1994年,彼得·秀爾(Peter Shor)提出了量子電腦能快速解出質因數分解等問題的步驟。如果做出大規模的量子電腦,RSA加密、橢圓曲線密碼學和迪菲-赫爾曼金鑰交換都會被破解。
到2026年為止,還沒有那麼大又那麼準確的裝置(「量子電腦是什麼?」)。即使如此,仍有現在收集的密文在將來被解讀的疑慮。因此,改用一般認為連量子電腦也難以破解的新公開金鑰加密,已經開始了。這稱為後量子密碼,NIST在2024年8月公布了最早的3項標準。
相比之下,一般認為對對稱式加密的影響較小。因為即使用1996年提出的Grover步驟,暴力破解的工夫也只會減少到大約「平方根」。這就像金鑰長度實際上減半,AES-128的話,大約是2的64次方次的工夫。所以一般認為,只要把金鑰加長(AES-256等)就能應對。
常見的誤解
誤解:方式保密的加密比較安全
實際上,只要研究設備或軟體,方式大多能被查出來。DVD防拷所用的加密(CSS),並沒有公開方式。即使如此,1999年它還是被分析出來,金鑰只有40位元這類弱點被利用而遭破解。公開並經過多年研究的AES這類方式,才更值得信任。把「藏起來就不會被發現」這種日常感覺套用到加密上,就產生了這個誤解。
誤解:金鑰長度變2倍,強度也變2倍
實際上,金鑰每多1位元,候選數就變2倍。256位元金鑰的候選數,不是128位元的2倍,而是2的128次方倍(約3.4×1038倍)。另一方面,方式不同時,不能直接比較位元數。依照NIST的指引,3072位元的RSA加密,和128位元的AES強度大致相同。
誤解:只要有加密,無論如何都安全
實際上,加密保護的是「不被沒有金鑰的人讀到」。在感染了病毒的裝置上,解密後的畫面和輸入的內容會被偷走。在假網站輸入密碼,受加密保護的通訊,也會把密碼原封不動送到對方手上。把金鑰和資料放在同一個地方,或公開設定出錯,加密就派不上用場。設定錯誤的可怕,在「雲端運算是什麼?」中也有說明。
從數字來看
| 項目 | 數字 | 時間、出處 |
|---|---|---|
| 凱撒密碼的金鑰候選 | 25種 | 英文字母26個的情況 |
| DES(1977年的美國標準)的金鑰 | 56位元(約7.2×1016種) | 1999年以22小時15分鐘找出金鑰(EFF等) |
| AES-128的金鑰候選 | 約3.4×1038種 | 即使每秒試1018次,全部試完也要約11兆年(作者計算) |
| 和AES-128強度相當的RSA加密 | 3072位元 | NIST SP 800-57(2020年) |
DES是在AES之前作為美國標準的對稱式加密。1999年,用專用的機器和約10萬台個人電腦,找出了它的金鑰。AES-128的金鑰候選,是它的約4.7×1021倍。所以現在的攻擊者,比起暴力破解金鑰,更常鎖定容易猜到的密碼,或欺騙人的手法。
進一步學習
- 用表格比較公開金鑰加密的種類:RSA加密、橢圓曲線密碼學、後量子密碼的差異
- 用AES加密長資料的方法:區塊加密操作模式、鑑別加密(一次完成加密與竄改偵測的方式)
- 保護過去通訊的想法:前向保密(即使日後私密金鑰外洩,過去的通訊也不會被讀到的性質)
- 保管金鑰的專用元件:TPM、HSM、安全元件的差異
- 用計算試試暴力破解要花多少時間:密碼暴力破解時間計算工具