2022年7月22日 星期五

札記-工業-現編的密碼學故事※


現編故事當筆記...


A國想跟B國秘密交換訊息,於是A國使者Alice跟B國使者Bob會面商討這事。
一.維吉尼亞密碼(Vigenère cipher)
Bob就說:
「那我們就將來往訊息(message)加密吧。加密的方法是,
 1. 將26個字母不按大小寫,照順序逐一編號,A=1, B=2, C=3,...以此類推。
 2. 承1,訊息(message)+密碼文(key)=加密文(ciphertext),加密文-密碼文=訊息。
  比如當訊息是A時,密碼文B時,1+2=3,C=3,C就是加密文。
  又比如加密文是D時,密碼文是A,4(D) - 1(A) = 3,C=3,C就是訊息。
 3. 我們共用同一密碼文(Key)。加密,解密都用這組。
  
 再舉兩個例子。
 第一個例子,訊息(message)是London,密碼文(key)是abc。
 12,15,14,04,15,14,加密後,12+1,15+2,14+3,04+1,15+2,14+3,加密文(ciphertext)是mqqeqq。
 第二個例子,加密文是uclqgl, 密碼文仍是abc。
 21,03,12,17,07,12,解密後,21-1,03-2,12-3,17-1,07-2,12-3,訊息是taipei」


二.兩重鑰匙
安全顧慮,密碼文每隔一段時間就要更換,
而密碼不能透過訊息傳遞,Alice和Bob就必須見一面。

某天兩人見面時,Alice說:
「我覺得我們應該找個方法,省去"更換密碼文就得見面"的麻煩。」
Alice又說我曾聽過一個故事是這樣的。
 張三把要給李四的信件,裝箱後用自己的鎖a鎖上,寄給李四。
 李四收到後,鎖上自己的鎖b,寄還張三。張三收到後,解開鎖a,再寄給李四。
 李四再收到後,解開鎖b,即能看到張三信件。
 以此概念運作,我們就可以用各自的密碼文(2 keys)傳遞訊息。


三.迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange)
運作一陣子後,
Bob想:為了簡單加密解密,當初設計的加密文(ciphertext)是可逆的(invertibility)。
可是,一旦敵人拿到密碼文(key),就可以反推訊息。
因此,和Alice商量,在加密的某個環節加入模運算(modular arithmetic, 簡稱mod)。

什麼是模運算呢?簡單說,就是作除法,取餘數。
比如,某一公式是 X * 3 (mod 5),當X= 4時,得出來的結果是 4 * 3 (mod 5) = 12(mod5) = 2,
即便知道 答案是2,也無法反推出X是多少,譬如 X=9時,得出的答案也是2。
然而,讓別人無法竊取(不可逆),同時自己要能解密。
所以,他們引入有模運算的「迪菲-赫爾曼密鑰交換法」。

直接舉例說明數學概念。為了容易解說,假設密碼文(key)只有一個字。
首先,Alice和Bob先談好「獲得密碼(key)的公式」為5 ^X (mod 7),這是可以公開的。
接著,
Alice隨便想一字F(不公開),即6,5^6(mod 7),5的6次方,除以7取餘數,等於1,即A。
Bob也隨便想一字C(不公開),即3,5^3(mod 7),等於6,即F。

Alice寫信跟Bob講,她公式算出來值是A;
同樣地,Bob也跟Alice講,他公式得到的值是F。公式得到的值被偷看沒差。
因為縱然別人知道,他也不能回推出Alice和Bob原先想到的字。
關鍵在後面這計算:「對方公式值^自己的數值(mod 7)」,兩人將得到一致的答案。  
Alice這邊,6^6 (mod 7)= 1; Bob這邊, 1^3(mod 7) = 1。
而這個答案便能拿來當密碼文(key),再以最早的加密法加密。
如此,既能(1)免去見面協調密碼文,又(2)不可逆性。


四,非對稱加密:RSA加密法
一段時日後,Alice想起她從前講過張三、李四的故事。
她就問Bob說:
「降低風險,有沒有辦法讓我們不要用同一把鑰匙(symmetric key)加密、解密?」
Bob就說:
「那就改用RSA加密法了。他是模運算,符合不可逆。
 每個人有兩把鑰匙,通常叫公鑰(public key/certificate),跟私鑰(private key)。
 用公鑰加密的加密文(ciphertext),要用私鑰才能解密;
 而私鑰加密的加密文,可以用公鑰解密。
 依然因為模運算,公鑰可以公開,但私鑰則獨自持有,不可以讓任何人知道。」

Alice就說:
「聽起來不錯,但我有一個問題,把公鑰公開,
 如果別人假裝你(Bob),用我(Alice)的公鑰發訊息給我,我怎麼區別?」

Bob說:
「可利用「私鑰加密的加密文,可以用公鑰解密」的特性。
 我先用我(Bob)的私鑰加密,再用你(Alice)的公鑰加密。
 用你的公鑰加密是保證除了你以外,別人看不到,所以,第一步,用你的私鑰解密。
 第二步,用我(Bob)的公鑰解密,假如解得開,
 不就可以證明訊息是我Bob所發出的(數位簽章Digital Signature)嗎?」

方法

Alice密碼本、Bob密碼本

來往郵件(可能被截取)

維吉尼亞密碼(Vigenère cipher)

兩人共用同一份密碼本

由同一份密碼本加密之加密文(ciphertext)

兩重鑰匙

兩人有各自密碼本

Alice寫機密信件給Bob,得跑三趟。
第一趟 To BobAlice加密送出;

第二趟 To AliceAlice加密 + Bob加密,送出;

第三趟 To BobAlice解密送出。
Bob加密,Bob解密後讀到。

迪菲-赫爾曼密鑰交換(DiffieHellman key exchange)

兩人共用同一份密碼本

Alice寫機密信件給Bob,得跑三趟。
第一趟 To Bob
Alice
送出(1)公式,(2)「公式算出數值」本;

第二趟 To Alice
Bob
得到公式後計算,送出他的「公式算出數值」本。

第三趟 To Bob
Alice
用密碼本加密機密信件(ciphertext)送出給Bob
Bob
用同一密碼本解密。

非對稱加密:RSA加密法

Alice有自己的公鑰、私鑰;
Bob
有自己的公鑰、私鑰。
所以,共4把,而公鑰能公開。

To Alice的信,用Alice公鑰加密,Alice收到,用她私鑰解開;

To Bob的信,用Bob公鑰加密,Bob收到,用他私鑰解開。




---------------------------------------------------------------------------------------------------------------
現編故事當筆記:
1. 維吉尼亞密碼(Vigenère cipher)
2. 兩重鑰匙
3. 模運算,迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange)
4. 非對稱加密:RSA加密法,數位簽章
---------------------------------------------------------------------------------------------------------------



2022年7月18日 星期一

中史(先秦)_一箭之仇※


正巧瞧見射箭比賽,一時心血來潮,
不如撰寫一篇聽過「一箭之仇」的故事,腦中當即有兩則,齊桓公(小白)和吳王闔閭。
但搜尋發現,早就有人寫類似的文章(註1),而且,他有四則。
既然已有,我僅列他所述故事的文獻出處。


一.齊桓公和管仲
先有的是:《春秋左傳·僖公二十四年》(註2)的「齊桓公置射鉤而使管仲相」。
白話文:
「齊桓公放下管仲從前射他的一箭之仇(當時射中腰帶的帶鈎,沒死),而拜管仲為相」。
比較詳盡是《史記》卷32〈齊太公世家〉:
而使管仲別將兵遮莒道,射中小白帶鉤。小白詳死,管仲使人馳報魯。
白話文:
「派管仲率兵擋在莒國通往旗國的道路上,管仲射中小白(後來齊桓公)的腰帶帶鈎,
 小白假裝死去,管仲便派人飛馳通報魯國」。
最後,齊桓公大局為重,重用管仲,並未報一箭之仇。


二.宋襄公和楚國
出自《春秋左傳·僖公二十二年》(註3):「宋師敗績,公傷股」。
白話文:「宋軍戰敗,宋襄公傷到大腿」。
《古文觀止》有選這篇,名<子魚論戰>(註4),使蠻多人都知道這事。
而在《春秋左傳》之後的《史記》卷40(註5):
射傷宋襄公,襄公遂病創死」(很白話不翻),才明確說出是箭傷。
後來,他兒子並沒有親手征服楚國,我覺得不算有復仇。


三.楚共王和晉國
源於《春秋左傳·成公十六年》(註6):
「(呂錡)射共王中目。王召養由基,與之兩矢,使射呂錡。中項,伏弢。以一矢復命。
白話文:
「(鄢陵之戰時,)呂錡(又稱魏錡)射中楚共公的眼睛(隔幾天才死),
 楚共公召喚養由基,給他兩支箭射呂錡。養由基一箭射中呂錡脖子,當場死亡。
 養由基另一支箭帶回來,繳還共王」。前面還有一段是呂錡作夢夢見射中月亮...蠻有趣的。
再者,養由基便是那位「百發百中」、「百步穿楊(柳葉)」的主人公,
典出《戰國策》卷二<西周>(註7)。


四.吳王闔閭和越王勾踐
吳王夫差和越王勾踐的事,應該熟悉到爛掉了,多少和四大美女的西施有關。
而夫差之所以要殲滅越國,就是要報他父親闔閭在檇李之戰被越國射一箭之仇恨。
詳於《史記》卷41(註8):
吳師敗於檇李,射傷吳王闔廬。闔廬且死,告其子夫差曰:『必毋忘越。』
白話文:
「吳國軍隊在檇李戰敗,呉王闔廬被射傷,將死時告訴兒子夫差:『一定不要忘記和越國的仇恨!』」
以及《史記》卷31(註9):
十九年夏,吳伐越,越王句踐迎撃之槜李。越使死士挑戰,三行造吳師,呼,自剄。
 吳師觀之,越因伐吳,敗之姑蘇,傷呉王闔廬指,軍卻七里。吳王病傷而死。
 闔廬使立太子夫差,謂曰:『爾而忘句踐殺汝父乎?』對曰:『不敢!』三年,乃報越。
白話文:
「19年夏天,吳國打越國,越王句踐在槜李迎擊。
 越國派敢死隊挑戰,排成三列至吳軍前,一邊高喊,一邊自刎。
 吳軍看傻,越軍趁機攻打吳軍,吳軍便敗於姑蘇,
 吳王闔廬被射傷手指(由前文知道是箭傷),軍隊再後退了七里。
 吳王闔廬因箭傷而死,死前派使者立太子夫差為國君,
 並叮囑:『你會忘記句踐殺死你父親嗎?』夫差答:『不敢忘!』。
 三年後,報了殺父之仇。」



---------------------------------------------------------------------------------------------------------------
四則「一箭之仇」的故事,有復仇的兩則。
---------------------------------------------------------------------------------------------------------------
圖片來源


註1:先秦那些一箭之仇是怎樣報復的


註2:










註6:《春秋左傳·成公十六年》 (西元前575年)







2022年7月16日 星期六

札記-天文-三伏天※

關係到日曆的,便納入天文類。

這一兩天,我跟不少人喊天氣好熱,有人回應我:要進入三伏天,會更熱。
三伏天,好熟悉又陌生的字詞。熟悉是因我自小就聽過;陌生是因我從未認真認識過。

見到最直接了當的定義(註1)是:
 三伏天是按照我國古代的“干支紀日法”確定的。
 每年夏至以後第三個庚日(指干支紀日中帶有“庚”字的日子)為初伏,
 第四個庚日為中伏立秋後第一個庚日為末伏,合起來稱為三伏。
 按陽曆計算則出現在7月中旬到8月中旬。此時我國大部地區是一年中最熱的時節。

而百度百科(註2)之簡要介紹云:
 伏天的長短主要在中伏的差別上。
 因為每年夏至節氣後的第三個庚日(初伏)出現的時間不同,所以導致中伏的天數也不相同。
 中伏時間有長有短,可能是10天,也可能有20天。
 於是就有了有些年份的伏天是30天,有些年份是40天,兩種情況。

換言之,初伏和末伏是"固定"的。
初伏是夏至後第三個庚日、末伏是立秋後第一個庚日。
初伏的十天後(天干有10個),到末伏開始前,就是中伏(起日亦是庚日)。
中伏有時是10天、有時20天。

以今年(2022年)為例,夏至是6月21日(每年的夏至不是6月21日,就是6月22日),
夏至後第3個庚日是7月16日星期六。




立秋是8月7日(每年立秋也是在這天的前後一兩天),立秋後第一個庚日是8月15日。
所以,今年的三伏天是7月16日到8月24日。

如百度百科所表:
2022年三伏天:
2022年7月16日至7月25日,初伏10天;
2022年7月26日至8月14日,中伏20天;
2022年8月15日至8月24日,末伏10天。


--------------------------------------------------------------------------------------------------------
三伏天,大部地區是一年中最熱的時節。
初伏是夏至後第三個庚日、末伏是立秋後第一個庚日。
初伏的十天後(天干有10個),到末伏開始前,就是中伏(起日亦是庚日)。
中伏有時是10天、有時20天。
--------------------------------------------------------------------------------------------------------