前言:
在我百寶箱中,最近新入的是ECC(橢圓曲線加密),它可以做為RSA非對稱加密的平替。
ECC的特點是,它是開放的,不是公司產品。
ECC相關的實做和過程學習,基本上完全是AI實做,但因為要進入百寶箱,我有查核和測試過程式碼。
程式碼:
這份程式碼裡面包括多個程式語言的ECDH和ECIES實做,也是我百寶箱中新加入的工具。https://gitlab.com/ycfunet/my_ecdh_ecies_code_test
說明:
ECC包括3種,ECDH、ECIES、ECDSA,其中ECDSA是簽章用的,這裡不談,ECIES是我們要用的,但它是ECDH的擴展,因此要先從ECDH說起。
- ECDH:
ECDH邏輯是,我有我的公鑰和私鑰,你有你的公鑰和私鑰,我用「我的私鑰+你的公鑰」可以生成共享金鑰,你用「你的私鑰+我的公鑰」可以生成相同的共享金鑰,沒錯,這就是神奇的地方,「我的私鑰+你的公鑰」,「你的私鑰+我的公鑰」都可以生成相同金鑰。那麼這個共享金鑰就可以拿來當AES金鑰加密和解密資料。
ECDH使用時,不會直接給共享金鑰,而是雙方會把公鑰給對方,加密和解密前,才會組合出共享金鑰後,再用共享金鑰以AES加密解密資料,所以ECDH又稱為「交換金鑰加密系統」。
- ECIES:
ECIES可以做為RSA的平替,它是以ECDH為基礎的擴展。使用概念上,一樣是接收端先建立一組公鑰和私鑰,然後把公鑰給對方,自己保留私鑰。
但在邏輯上,如何套入ECDH?ECIES引入「臨時金鑰」的概念,我(後稱接收端)會先產生一組公私鑰,公鑰提供,私鑰保存。發送端拿著我的公鑰,在每次傳送資料時,都先產生一組公私鑰,這組公私鑰就稱為「臨時金鑰」,發送端會用「臨時金鑰的私鑰+我的公鑰」「產生共享金鑰」,用這組共享金鑰以AES加密資料。
還記得AES提到加鹽的IV技巧嗎?這裡一樣的行為,發送端會把加密後的資料,在最前面加上「臨時金鑰的公鑰」,因此整個資料變成臨時金鑰的公鑰 + AES編碼後密文
接收端收到後,用「我的私鑰 + 臨時金鑰的公鑰」產生共享金鑰後,用共享金鑰以AES解密密文。因為臨時金鑰的公鑰長度不一定,AI在最前面加上4 Bytes,記載臨時金鑰的字元數,所以完整資料變成
臨時金鑰的公鑰長度數值(4Bytes) + 臨時金鑰的公鑰 + AES密文
因為這樣的設計,儘管加密解密流程比較複雜,但包裝後可以完全平替RSA的非對稱加解密,接收端只要產生一組公私鑰,公鑰提供後,不論是臨時金鑰、AES加解密,其實都包裝在Encrypt和Decrypt裡面了。
RSA是公司產品,同時也有專利,我懷疑ECIES是為了規避RSA專利而用ECDH流程設計出的標準。




沒有留言:
張貼留言