一、加密算法概述
數據加密的基本過程就是對原來為明文的文件或數據按某種算法進行處理,使其成為不可讀的一段代碼為 “密文”,使其只能在輸入相應的密鑰之后才能顯示出原容,通過這樣的途徑來達到保護數據不被非法人竊取、閱讀的目的。該過程的逆過程為解密,即將該編碼信息轉化為其原來數據的過程。
1、常見加密算法
常見加密算法可分為三類,對稱加密算法、非對稱加密算法、Hash 加密算法
1.1 對稱加密算法
特點是文件加密與解密使用相同的密鑰,密鑰較短。
優點:算法公開、加密速度快、計算量小、加密效率高。
缺點:加密方與解密方需要提前敲定好密鑰,并雙方保存好密鑰。
常見對稱加密算法:AES、SM4
1.2 非對稱加密算法
可以在不傳遞密鑰的情況下完成解密
優點:相比對稱加密算法其安全性更好
缺點:加解密時間花費更長,適合少量數據加密
常見非對稱加密算法:ECC、RSA、SM2
1.3 Hash 算法
算法特點是單向算法,不能通過 Hash 值還原目標信息
優點:不可逆、易計算、特征化
缺點:存在散列沖突(存在兩個不同的原始值經過哈希運算后得到同樣的結果)
常見非對稱加密算法:SM3、SHA256、SHA384、SHA512、SHA224、SHA512_224、SHA512_25
二、ECC256 算法
ECC(Elliptic Curve Cryptography,橢圓曲線加密)算法公私鑰的長度是 ECC 安全性的關鍵參數之一,ECC 算法后跟著的是橢圓曲線的域長度如 256 位,ECC256 是目前最常用的私鑰長度之一,它提供了一個良好的安全性和性能的平衡。
1、ECC 算法原理介紹
1.1 概述
ECC(Elliptic Curve Cryptography)加密算法是一種基于橢圓曲線數學理論的公鑰加密算法。
ECC 公鑰:是基于私鑰和橢圓曲線上的基點計算得出的,公鑰在加密過程中用于接收者加密消息,在數字簽名中用于驗證簽名。
ECC 私鑰:是一個隨機數,它在橢圓曲線加密算法中用于生成公鑰以及在解密和簽名過程中使用。
ECC 的安全性在很大程度上取決于曲線的選擇,目前美國國家標準與技術研究院(NIST)維護了一系列安全的橢圓曲線參數,即著名的 NIST 曲線。
ECC 公鑰長度的選擇應根據安全要求和可用資源來確定,一般來說 256 位和 384 位的 ECC 公鑰長度足以滿足大多數應用的要求。
1.2 算法概念
橢圓曲線離散對數問題,橢圓曲線上的兩個點 P 和 Q,P 稱為基點(base point)、k 為私鑰(private key)、Q 為公鑰(public key)
Q = k * P
給定 k 和 P,根據加法法則,計算 Q 很容易;
但給定 P 和 Q ,求 k 非常困難(實際應用 ECC,質數 P 取的非常?,窮舉出 k 非常困難)。
1.3 算法過程
選?條橢圓曲線 Ep(a,b), 并取橢圓曲線上?點作為基點 P。
選定?個大數 k 作為私鑰,并?成公鑰 Q= k * P。
加密:選擇隨機數 r,將消息 M 生成密文 C,密文是?個點對,即 C = (rP, M+rQ)。
解密:M+rQ-k(rP) = M+r(kP)-k(rp) = M
1.4 算法過程解析
點運算的加法
過點 A B 交于曲線的一個交點,取這個交點 X 軸對稱的點為 A+B
點運算的乘法
當 A 和 B 無限接近,A = B 時這條線為曲線上的切線,切線交于曲線的一個交點,取這個交點 X 軸對稱的點為 A+A 即為 2A
其中,6P 是由 3P 切線交線的來,也可由 2P 切線交線后 4P,再與 2P 交線的來
可得如下式子:
2(3P) = 3(2P)
密鑰生成
私鑰:選擇一個大的隨機整數 k 作為私鑰。這個私鑰應該保密,不應被泄露。
公鑰:選擇一個橢圓曲線上的基點 P(這個點是公開的,并且對于所有使用該曲線的用戶都是相同的)。然后計算公鑰 Q=kP,即私鑰 k 與基點 P 的標量乘法結果,公鑰 Q 可以公開。
加密過程
隨機數:選擇一個隨機數 r,這個隨機數在每次加密時都應該不同,以增加加密的安全性。
密文生成:將消息 M 編碼為一個與橢圓曲線上的點可以相加的數值(這通常涉及到一些數學轉換,比如將消息哈希為一個整數),然后計算密文 C,它是一個點對,即 C=(rP, M+rQ)。
rP 是隨機數 r 與基點 P 的標量乘法結果。 M+rQ 是消息 M 與 rQ(即 r 與公鑰 Q 的標量乘法結果)的加法,這里的加法是在橢圓曲線上的加法,不是普通的整數加法。
解密過程
解密過程:持有私鑰 k 的用戶可以解密密文 C。
從密文 C 中提取出 rP 和 M+rQ。
使用私鑰 k 計算 k(rP)。
然后計算 M:(M+rQ)?k(rP)
由于 Q=kP,所以 rQ=r(kP)。因此:M = (M+rQ)?rQ=(M+rQ)?k(rP)=M+r(kP)?k(rP)
這樣就成功地從密文中恢復出了原始消息 M。
安全性
ECC 的安全性基于橢圓曲線離散對數問題的難度,給定 P 和 Q=kP,很難計算出私鑰 k。
加密過程中使用的隨機數 r 增加了每次加密的多樣性,使得即使相同的消息被多次加密,產生的密文也會不同。
2、ECC 算法公私鑰數組長度
ECC 算法中,公鑰和私鑰的長度是固定的,并且與橢圓曲線的域長度(即 ECC256,256位)直接相關,以下是ECC256 算法中公鑰和私鑰的字節長度:
三、簽名驗簽過程
因為 ECC 通常用于加密密鑰交換或數字簽名,而不是直接用于數據加密,所以簽名驗簽過程分三部分:公鑰生成、明文簽名、簽名驗簽。
1、公鑰生成
1.1 密鑰生成工具
OpenSSL 是一個強大的開源安全套接字層密碼庫,它提供了豐富的密碼算法、密鑰和證書封裝管理功能,實現了目前大部分主流的密碼算法和標準,如對稱算法、非對稱算法、散列算法、數字簽名和認證、X509 數字證書標準、PKCS12、PKCS7 等。
特點:OpenSSL 是一個開源的軟件庫,用戶可以自由地使用、修改和分發它
1.2 工具使用
在 Git 中集成了 OpenSSL 庫,OpenSSL 主要作為一個加密庫來使用,為 Git 的通信和數據存儲提供安全支持,以下公鑰生成章節中生成公鑰等操作均在 Git 中調用 OpenSSL 庫使用。
2、生成 ECC256 密鑰
1.1 ECC256 公私私鑰
① Eg. ECC256 算法生成公私鑰 OpenSSL 命令
生成 ECC256 私鑰
openssl ecparam -genkey -name prime256v1 -param_enc explicit -out secp256r1-key.pem
提取公鑰
openssl ec -in secp256r1-key.pem -pubout -out ecpubkey.pem
打印私鑰
openssl ec -in secp256r1-key.pem -text > pri.hex
打印公鑰
openssl ec -pubin -in ecpubkey.pem -text > pub.hex
② 打開 pri.hex,查看文本,提取其中公鑰與私鑰數據
③ 提取出來的公鑰與私鑰數據數組如下:
// 軟件工程中使用的公私鑰
uint8 ecc_secp256r1_prikey[] = "ca085e45ec036d7a9bcd67d7990a89dd50816b9351141aafbbb75bb3c862cc51"
uint8 ecc_secp256r1_pubkey[] = "f227f1bd2dd624e211580207e248fcc077bc5a5a5877128d85e25a3aedb24b98b0efd869cd9953ca5aed03b9b4528164d2cbf203b35f391d3cd573aebd78646e"
3、ECC256 簽名
簽名方需要待簽名數據 test_data_raw.bin,需要 ECC256 密鑰 secp256r1-key.pem
① 生成簽名數據的哈希,首先對待加密數據文件的內容生成一個哈希值,使用 SHA-256 算法來完成。
# 生成文件的 SHA-256 哈希值
openssl dgst -sha256 -binary -out hash.bin test_data_raw.bin
② 使用 ECC 私鑰簽名上一步驟生成的哈希值。
# 使用 ECC 私鑰對哈希值進行簽名
openssl dgst -sha256 -sign secp256r1-key.pem -out signature.bin hash.bin
將簽名轉換為十六進制表示(用于查看)
openssl base64 -in signature.bin -out signature.hex
③ 對 test_data_raw 的哈希值進行簽名,簽名數據轉為 hex 查看
4、ECC256 簽名驗簽
驗簽方需要待簽名數據 test_data_raw.bin、由 ECC256 密鑰 secp256r1-key.pem 中提取的 ecpubkey.pe公鑰。
① 重新生成簽名數據的哈希,接收方在收到數據和簽名后,首先需要對數據重新生成哈希值,使用 SHA-256 算法來完成。
# 接收方重新生成文件的 SHA-256 哈希值
openssl dgst -sha256 -binary -out received_hash.bin test_data_raw.bin
② 使用公鑰驗簽:然后,接收方使用 ECC256 公鑰對簽名進行驗證,以確保數據在傳輸過程中沒有被篡改。
# 使用公鑰驗證簽名
openssl dgst -sha256 -verify ecpubkey.pem -signature signature.bin data_hash.bin
③ 如果簽名驗證成功,OpenSSL 不會輸出任何內容(或者可能會輸出一個 "Verified OK" 的消息,這取決于你的 OpenSSL 版本和配置);
如果驗證失敗,OpenSSL 會輸出一個錯誤消息,指出簽名無效;
printf >>
$ openssl dgst -sha256 -verify ecpukey.pem -signature signature.bin hash.bin
Verified OK
四、參考文檔
《【ECC加密算法】| ECC加密原理詳解| 橢圓曲線加密| 密碼學| 信息安全》
https://www.bilibili.com/video/BV1v44y1b7Fd/?spm_id_from=333.337.search-card.all.click&vd_source=9fe0b02e4f116cc091f5fa76d03c35c6
《Openssl》
https://www.openssl.org/
《橢圓加密算法》
https://baike.baidu.com/item/%E6%A4%AD%E5%9C%86%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95/10305582?fr=ge_ala
登錄大大通網站,閱讀原文,提問/評論,獲取技術文檔等更多資訊!
-
密鑰
+關注
關注
1文章
139瀏覽量
19769 -
加密算法
+關注
關注
0文章
216瀏覽量
25550 -
數據加密
+關注
關注
0文章
53瀏覽量
12718
發布評論請先 登錄
相關推薦
評論