NEO改进协议提案2(NEP-2)
文章目錄
- 摘要
- 動機
- 基本原理
- 詳述
前綴
建議詳述
加密步驟
解密步驟 - 向后兼容性
- 測試用例
- 實現
摘要
提出了一種以58字符 Base58Check編碼的可打印字符串的形式對密碼保密型私鑰記錄進行加密和編碼的方法。加密私鑰記錄旨在用于紙質錢包。每一個記錄字符串都包含除了密碼之外重構私鑰所需的所有信息,并且該方法使用加鹽和scrypt來抵抗暴力攻擊。
動機
密碼和密碼保護型密鑰是個人間發送資產的新實踐。想要發送資產的人可以通過郵政郵件郵寄一個受密碼保護的紙錢包并通過電話或者email給接收者密碼,以保證傳遞的安全不受其他通道的攔截。紙錢包的使用者可以攜帶資金的加密私鑰并在家中留存一份拷貝以預防意外的遺失和偷竊。把資產存在銀行賬戶或者保險箱中的紙錢包的用戶可以把密碼留在家里或者與可信的伙伴分享已預防銀行中的某人乘機訪問紙錢包并花費其中的資產。預見和不可預見的關于密碼保護型私鑰的用例還有很多。
另一方面,標準的密碼保護型私鑰格式使得其能夠共享來自不同錢包客戶端的私鑰。
基本原理
用例:作為一個NEO紙錢包用戶,我喜歡添加加密的功能,如此我的NEO紙錢包可以拆解成兩個因子:我有的和我知道的。
用例:作為一個NEO用戶想要用一個私鑰向個人或者公司付款,我不必擔心任何通信渠道會攔截我的key和導致資產的被盜。我想要提供一個密碼保護型密鑰,伴隨一個可以通過其他渠道傳輸的密碼。
詳述
本提議運用到了以下函數和定義:
·AES256加密、AES256解密,是眾所周知的AES分組編碼不考慮初始向量和塊連接的簡單格式。這些函數每一個都需要一個256位的key和16字節的輸入和確定的16字節的輸出。
·SHA256,一種眾所周知的任意字節長度輸入和固定產出32字節長度hash的哈希算法。
·scrypt,一個著名的密鑰推導算法。它需要以下參數(string) password, (string) salt, (int) n, (int) r, (int) p, (int) length,并固定產生一個長度等于length長度的字節數組。
Base58Check,一個在NEO系統中廣泛使用的用58的字符byte[]編碼的方法。
前綴
建議將Base58Check編碼過后的字符串以6字開頭。數字6旨在從用戶的角度表示一種需要其他東西才能生效的私鑰–總的定義可以理解為將來包括特別是在多簽交易中的密鑰,并且被選遵從現有前綴5,多見于WIF格式表示一種非加密私鑰。
建議第二個字符應該給出提示所需什么因子,對于加密密鑰需要一個密碼,建議使用大寫字母P。
為保持加密密鑰的大小,在AES加密中不使用初始向量(IVS)。相反,使用scrypt從密碼以及NEO地址的32位hash作為鹽導出用于類似初始向量用途的合適值。
建議詳述
對象標識符前綴:0x0142。這是在Base58Check編碼記錄開頭的常量字節,它們的存在導致結果字符串具有可預見的前綴。
用戶如何判斷:58個字符總是以“6P”開頭
有效載荷字節數(不包括前綴):37
·1字節(FLAG字節):始終為0xE0
·4字節:Sha256(Sha256(expected_neo_address))[0…3]),用于拼寫檢查和加鹽。
16字節:AES加密密鑰材料記錄(加密半數1)
16字節:AES加密密鑰材料記錄(加密半數2)
在BASE58CHECK編碼(前綴6Py)中的范圍:
最小值:6PYJXKPVNKXUZAFD2B5ZSZAFJYNP4EZQQECJS39 449 QUUXLNXJLX6LG(基于01 42 E0加三十六個00)
最大值:6PyxG5TnGyLyxDrZiqxBuxxdotBNTBI3D61MQBXPPZQZEJTVQQHSCNK(基于01 42 E0加三十六個FF)
加密步驟
1、計算NEO地址(ASCII),
并獲取SHA256(SHA256())的前四個字節.我們將其叫做地址哈希。
2.使用Scrypt從密碼導出一個密鑰。
·參數:密碼是以UTF-8格式的密碼。鹽采用之前得到的地址hash,n=16384,r=8,p=8,length=64
·把結果的64字節分成2半,稱他們為導出半數1和導出半數2.
3.做AES256加密(block = privkey[0…15] xor derivedhalf1[0…15], key = derivedhalf2),把16字節的結果叫做加密半數1.
4.做AES256加密(block = privkey[16…31] xor derivedhalf1[16…31], key = derivedhalf2),把16字節的結果叫做加密半數2.
加密私鑰是以下Base58Check編碼下的串聯,總共39字節,沒有Base58 checksum:
·0x01 0x42 + flagbyte + addresshash + encryptedhalf1 + encryptedhalf2
解密步驟
1.從用戶那獲取加密私鑰和密碼。
2.把密碼和地址hash帶入Scrypt函數得到半導出數1和半導出數2.
3.用AES256Decrypt解密半導出數1和半導出數2,并合并兩部分并將結果和半導出數1做異或得到明文形式私鑰。
4.把明文私鑰轉化成NEO地址。
5.求NEO地址hash,并驗證加密私鑰記錄中的地址hash是否與之匹配。如果不是,則報告密碼錯誤。
向后兼容性
向后兼容性是最小的,由于它是一種新標準幾乎擴展了WIF格式。假設私鑰數據的入口可以接受現存格式的私鑰(比如16進制數或者WIF格式);本草案使用的密鑰格式不能被錯誤地用于任何現有的格式,并保留自動檢測能力。
測試用例
Test 1:
? Passphrase: TestingOneTwoThree
? Encrypted: 6PYVPVe1fQznphjbUxXP9KZJqPMVnVwCx5s5pr5axRJ8uHkMtZg97eT5kL
? Unencrypted (WIF): L44B5gGEpqEDRS9vVPz7QT35jcBG2r3CZwSwQ4fCewXAhAhqGVpP
? Unencrypted (hex): CBF4B9F70470856BB4F40F80B87EDB90865997FFEE6DF315AB166D713AF433A5
Test 2:
? Passphrase: Satoshi
? Encrypted: 6PYN6mjwYfjPUuYT3Exajvx25UddFVLpCw4bMsmtLdnKwZ9t1Mi3CfKe8S
? Unencrypted (WIF): KwYgW8gcxj1JWJXhPSu4Fqwzfhp5Yfi42mdYmMa4XqK7NJxXUSK7
? Unencrypted (hex): 09C2686880095B1A4C249EE3AC4EEA8A014F11E6F986D0B5025AC1F39AFBD9AE
實現
? neo-project/neo: https://github.com/neo-projec...
? CityOfZion/neon-js: https://github.com/CityOfZion...
原文:來自 https://github.com/neo-projec...
總結
以上是生活随笔為你收集整理的NEO改进协议提案2(NEP-2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POSTMAN 数据关联
- 下一篇: 将SVN的代码推送到码云的步骤