###### tags: `blockchain`
# ECDSA筆記
## ECDSA
ECDSA是透過ECC衍生的加密方法
橢圓曲線密碼學的方程式是基于以下形式的方程,屬於離散對數,具有加法和乘法,但沒有除法減法擁有Trapdoor function特性(單向的),K是公鑰、k是私鑰、G是方程式上的某點,K = k * G,我們能透過私鑰k推出公鑰K,但公鑰K無法進行回推,這確保了只要私鑰不洩漏,被破解的可能性就非常低。



ECDSA會與訊息一起加密,訊息會透過SHA產生一個很大的hash值,使其更難以預測,在SHA1中會產生20byte換算成160bit,一個bit有0、1兩種可能,160bit就有2^160次方個可能性,這個不可預測的特性讓SHA1算法成為一個非常好的哈希算法,非常安全且產生“碰撞(collision)”(兩個不同文件有相同的哈希)的可能性非常低,使得通過偽造數據獲得特定的哈希的變得不可能。
## why need to mod P(?)
例如,計算兩個大質數的乘積是微不足道的。但是給定兩個大質數的乘積,很難找到這兩個質數(稱為素因式分解問題)。假設我提供數字6895601並告訴你它是兩個質數的乘積。找到這兩個質數要比讓它們相乘生產6895601要困難得多。
普通的數字1000=A * B 能很輕易都配對 50 * 50、100 * 10
但若是透過質數 109 * 103 = 11227
算出11227很簡單 但要回推出109和103 幾乎只能透過窮舉的方式達成
後續關於ECC 方程式只有乘法 沒有除法 這使得演算法具有trap door單向門特性
代表我們能透過得知 109 * 103 = 11227
卻無法計算 11227/103
109 是私鑰 103則是ECC的G(常數) 11227是簽章
https://cypherpunks-core.github.io/ethereumbook_zh/05.html
## why dont use Symmetric-key 對稱式加密
對稱式加密 用同一把私鑰進行加密
這代表加解密都用同一把 若要在本地加密 私鑰便需要儲存在本地
一些遊戲廠商只要本地私鑰被找到 就等同檔案自動解密
透過連線解密也同理 若是連線中私鑰被得知 也是一樣
而非對稱式 私鑰加密 公鑰解密 私鑰是儲存於本地的 網路不會儲存私鑰
所以只要私鑰不洩漏 就幾乎沒有洩密的可能
## 從隨機數生成私鑰
使用安全的隨機演算法產生數字 或是長度足夠的字詞(記憶詞的概念)
SHA256(以太坊用Keccak-256)產出固定長度的hash 256位的2進制 64位的16進位數字
2^256=4^128=16^64
2進位 01 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 15是1111
表達16進位只需四個位數 256/4=64 所以轉換16進位是64位數
example address: f8f8a2f43c8376ccb0871305060d7b27b0554d2cc72bccf41b2705608452f315
可透過web3.js產生 經過""空字串驗證演算法為Keccak-256
這包含ETH使用的產生私鑰githubCODE geth
https://ethereum.org/zh-tw/developers/docs/accounts/
https://cypherpunks-core.github.io/ethereumbook_zh/05.html
https://ithelp.ithome.com.tw/articles/10251031
## SHA3
keccak是SHA3的原型 SHA-2 SHA-3 是一種加密的標準
https://zhuanlan.zhihu.com/p/97953640
# 2022/10/17 清交區塊演講ECDSA
談到P+Q是在驗證 加法 p+p 驗證乘法得合法性
私鑰就是個隨機數 EX:1
公鑰是私鑰做G次產生 實際看spec256
R跟ECDSA有關 S完全沒有 V基本是判斷負數用的
d私鑰 Q公鑰 生成簽章的
也有談到EC recover
https://hackmd.io/Q2KytbDZTcifdfkEn_e2_Q