[上課筆記] LAB實作練習 for RSA


題目:
同學A--

  1. 產生akey()apub()
  2. 產生a.txt(12345678)
  3. a.txtRSA加密傳給同學B(檔名ax.txt)須先取得同學B的公key-bpub
  4. 產生a.txt的簽章a.sign並傳給同學B使用自身私key akey簽章

同學B--

  1. 產生bkey()bpub()
  2. 接收ax.txt 並解密成a.txt,並解密成a.txt使用自身私key bkey解開
  3. 接收a.sign解出筆對黨(ay.txt),比對a.txtay.txt決定a.txt傳送者(須取得同學A的公key,apubverify)

------------------------------

解答:

A--

步驟2---openssl rsautl -in a.txt -out ax.txt -inkey bpub -pubin -encrypt

步驟3---openssl rsautl -in a.txt -out a.sign -inkey akey -sign

其他步驟略

B--

步驟2---openssl rsautl -in ax.txt -out a.txt -inkey bkey -pubin -decrypt

步驟3---openssl rsautl -in a.sign -out ay.txt -inkey apub -pubin -verify

其他步驟略

----------完整指令與教學----------------

聽完一整天的密碼學,似乎很多人搞不懂講什麼東西,我當初大學也學得很沒起勁呢()。密碼學說穿了就是搞心機罷了,因此大學的時候心機重的這門課學得比較好(*2)。開始探討RSA吧!

先講一下對稱式跟公鑰是什麼?我們可以想像成對稱式是摩斯密碼傳送的軍機,公鑰是需要鎖匙的藏寶箱;

拿 二次大戰來聊那個什麼德軍使用DES,透過某個規則把文字語言變成另一種不懂的文字語言傳送,也就是兩邊只要一個懂演算法的翻譯家就好了(感覺到字面的意 思嗎?對稱式很搭配這句話吧)。但是如果途中有一個間諜偷了這份軍機,他只要想辦法猜到這是哪國語言在去找翻譯家就破解了,所以很方便但是有可能被破解。

而 公鎖像把這份軍機放入寶箱上鎖內寄給對方,中間間諜看到根本不知道裡面裝什麼,需要鎖匙才能知道,當然鎖匙要怎麼寄送就是一個問題了,既然談到寶箱我們引 用到RSA算了。去買一組鎖頭與鎖匙,把沒封上的鎖頭寄給對方,要求對方把文件放到寶箱內並上鎖寄給你,你到時候再用鎖匙打開就好了,這就是公key跟私 key原理,很簡單吧又有點耍心機。

正式公佈解題--------

遊戲規則是這樣的,我與山凱大大進行了雙角色扮演互傳,所以這裡我的檔案為loki.txt(有副檔名)山凱的檔案為message(無副檔名),我的檔案可以用windows開啟而他的檔案只能用cmdtype開啟,後面可以看到。執行cmd進入DOS模式吧:

C:\Documents and Settings\student>d: //請先做好環境變數再來打這三行……
D:\>cd openssl\work //如果問這三行為什麼要這樣打

D:\openssl\work>openssl //只是為了方便檔案會建立在work

OpenSSL> genrsa -out ikey.pem -des -passout pass:12345 2048 //我先創造一個私key,名為ikey.pem,密碼為12345key長度為2048

Loading 'screen' into random state - done

Generating RSA private key, 2048 bit long modulus

................................................................................

.....+++

...............+++

e is 65537 (0x10001) //error字眼應該成功了,懶的理他寫什麼

OpenSSL> rsa -in ikey.pem -out ipub.pem –pubout //再從私key(ikey.pem)裡面把公key給撈出來,名為ipub.pem

Enter pass phrase for ikey.pem: //教你輸入密碼,我剛設12345

writing RSA key

OpenSSL> rsautl -in loki.txt -out i.sign -inkey ikey.pem –sign //再來建立你的數位簽章,你可以拿個可以象徵你的圖片當作私人印章,我是懶的做所以把loki.txt當作我的頭顱代表傳過去了。用私key

Loading 'screen' into random state - done

Enter pass phrase for ikey.pem: //又要輸入密碼12345

//都做好一切準備了,你手上有公私key各一個,還有一個機密文件與代表數位簽章的頭顱

//這時候,透過網芳之類的把你的公key交給對方。對方也要這樣做,等你拿到對方的公key(鎖頭)就快點拿來加密上鎖寶箱吧。

OpenSSL> rsautl -in loki.txt -out lokij.txt -inkey apub -pubin –encrypt //拿對方的公key對你的機密文件來上鎖寶箱

Loading 'screen' into random state – done

//這個時候把這個寶箱lokij.txt送給對方,對方也送一個寶箱amessage給我了,對方寶箱上有你的鎖頭

OpenSSL> rsautl -in amessage -out message -inkey ikey.pem –decrypt //我不知道原本檔名是啥,所以隨便取message,使用你自己的子key解開

Loading 'screen' into random state - done

Enter pass phrase for ikey.pem: //跟自己的子key有關,又是解我的密碼12345

OpenSSL> exit //離開程式回到目錄上去

D:\openssl\work>type message //檢查一下內文

Hello.

Today is September 24.

Tomorrow is Friday.

Weekend is coming.

Yeah!!

That is all. //耶,看到內容了

//再來是數位簽章,把加密過的數位簽章給對方,對方也把他的給你,這時候回想一下你在數位簽章上用私key鎖的,相反的需要公key解開,這時候還要跟對方討公key

D:\openssl\work>openssl //再回到程式去

OpenSSL> rsautl -in asign -out message1 -inkey apub -pubin –verify //這時候拿對方的公key解開

Loading 'screen' into random state - done

OpenSSL> exit

D:\openssl\work>type message1

This is Kenny.

Nice to meet you.//一樣成功。

D:\openssl\work>

結論:

傳送者-A

需準備[A-key][A-key][數位簽章A][欲傳送的明文M]

發送前要擁有[B-key]

對方要傭有自己的[A-key]

[B-key]+ [欲傳送的明文M]=狗大便,送給他

[A-key]+ [自己的數位簽章A]=鳥大便,送給他

傳送者-b

需準備[B-key][B-key]

發送前要擁有[A-key]

狗大便+[B-key]= [欲傳送的明文M]

鳥大便+[A-key] = [數位簽章A]

留言