블록 체인 의 WIF 비밀 키 에 대한 작은 인식 과 데모 실현

WIF (Wallet import format) 지갑 가 져 오기 형식 은 개인 적 인 ESCDSA (타원 곡선 서명 알고리즘) 비밀 키 로 이 형식 을 통 해 더욱 편리 하 게 복사 하고 저장 할 수 있 습 니 다.그 중에서 타원 곡선 서명 알고리즘 을 통 해 생 성 된 공개 키 는 일반적으로 타원 곡선 상의 x, y 좌 표를 연결 합 니 다.압축 된 공개 키 는 바로 x 의 좌표 이다. 타원 곡선 과 x 가 있 기 때문에 이치 에 맞 게 y 를 구 할 수 있다.1: 타원 곡선 알고리즘 에 따라 비밀 키 privateKey 2 를 생 성 합 니 다. Mainnet 주소 라면 앞 에 0x 80 접 두 사 를 추가 하고 testnet 주소 라면 앞 에 0xef 접 두 사 를 추가 합 니 다.비밀 키 가 압축 된 공개 키 에 대응 하면 끝 에 0x 01 접 두 사 를 추가 합 니 다.3: 생 성 된 비밀 키 privatekey 에 대해 두 번 연속 sha 256 을 한 다음 에 앞의 4 개의 바이트 를 검사 코드 checksum 4 로 하고 변 환 된 privatekey 의 뒤에 checksum 을 연결 하여 바이트 배열 result 5 를 얻 습 니 다. 마지막 으로 바이트 배열 result 에 대해 base 58 인 코딩 을 합 니 다.
코드 는 다음 과 같 습 니 다:
package main
import ("blockTest/tool""crypto/ecdsa""crypto/elliptic""crypto/rand""crypto/sha256""encoding/hex""fmt")
/ / / 무 작위 키 및 전체 26965 개의 원 곡선 에 따라 비밀 키 와 공개 키 를 만 들 수 있 습 니 다. func newKeyPair () (* ecdsa. PrivateKeyKey, [] byte) {curve: = elliptic. P256 () / / / 26965 개의 원 곡선 privateKey, err: = ecdsa. GenereKey (curve, rand. Reader) if err! = nil {fmt. Prinln (err)} publicke: = append (privateKey. PublicKey. X. Bites. X. Bites (), privateKey. Public. Y. Y. Y. Biytes (. Y. Y. Biytes)} publiKey: = = append (privateKey.)...) return privateKey, publicKey}
/ / WIF 비밀 키 생 성 / / hexprivatekey 타원 곡선 16 진수 데이터 / / copressed 가 압축 된 공개 키 인지 여부
func generatePrivateKey (hexprivatekey string, compressed bool) [] by te {versionstr: = "/ / 압축 된 공개 키 에 대응 하 는 지 판단 하려 면 뒤에 0x 01 이라는 바이트 가 필요 합 니 다. 또한 모든 비밀 키 는 앞 에 0x 80 바이트 if compressed {versionstr =" 80 "+ hexprivatekey +" 01 "} else {versionstr =" 80 "+ hexprivatekey}/ / 문자열 이 16 진수 바이트 privatekey 로 바 뀌 었 습 니 다.: = hex. DecodeString (versionstr) / / double hash 를 통 해 checksum. checksum 을 계산 합 니 다. 그 는 두 번 hash 256 이후 의 4 개의 바이트 입 니 다. firsthash: = sha 256. sum 256 (privatekkey)
secondhash:= sha256.Sum256(firsthash[:])

checksum := secondhash[:4]
//  
result := append(privatekey,checksum...)

//    base58   
base58result :=tool.Base58Encode(result)
return base58result

}
/ checkWIF 가 유효한 지 확인 합 니 다. 실질 적 으로 전 환 된 WIF 비밀 키 를 통 해 검사 코드 를 얻 고 WIF 비밀 키 문자열 에서 분 석 된 검사 코드 를 일치 시 키 며 일치 하면 합 법 적 인 WIF 비밀 키 로 표시 되 며 일치 하지 않 으 면 불법 입 니 다.func checkWIF (wiftprivate string) bool {rawdata: = [] byte (wiftprivate) / / 80, 비밀 키, checksumbase58decodedata: = tool. Base58Decode (rawdata) length: = len (base58decodedata) / / 압축 된 공개 키 가 아니라면 길 이 는 '80' + 32 비트 비밀 키 + 4 바이트 검사 코드 로 37 바이트 / / 압축 된 공개 키 라면 길 이 는 (80, 한 바이트) + 32 바이트 비밀 키 입 니 다.(64 비트) + (01, 한 바이트) + 4 개의 바이트 검사 코드 는 모두 1 + 32 + 1 + 4 = 38 개의 바이트 이기 때문에 압축 된 비밀 키 의 길 이 는 최소 37 개의 바이트 if (length < 37) {fmt. Printf (길이 가 37 보다 작 으 면 반드시 문제 가 있 습 니 다) return false} private: = base58decodedata [: (length - 4)] / / 검사 코드 / fmt. Printf ("private:% x", private) firstsha: = sha 256. sum 256 (private)
secondsha := sha256.Sum256(firstsha[:])

checksum := secondsha[:4]
//fmt.Printf("%x
",checksum) // orignchecksum:= base58decodedata[(length-4):] // fmt.Printf("%x
",orignchecksum) //[]byte if bytes.Compare(checksum,orignchecksum)==0{ return true } return false

}
finc main () {privateKey,: = newKeyPair () fmt. Prinf ("비밀 키:% x", privateKey. D. Bites () wiwifeprivatkey: = generatePrivateKeyKeyKeyKey (hex. EncodeToString (privateKey. D. Bites ()), true) fmt. Prinf ("WIF 형식 비밀 키:% s", wiprivatekkey) privateKey2: = getPrivKeyfromWIF (string) fmt. Prinf ("와 이 프 비밀 키 를 통 해 원래 비밀 키 를 가 져 오 려 면, 값 을 다음 과 같이 가 져 옵 니 다.% x:% x: = getPrivateKeyKeyfrom WIF (string (wifrprivatkey)) fmt. Prinf. Prin", privateKey 2)
}
운영 결 과 는 다음 과 같다. 4b68c 053 ea5cb 9 08901 WIF 형식 비밀 키 는 다음 과 같 습 니 다.GaDZgNkTFqYJEovqbase58decodedata: 800 b0f26365fc38d502e650f1e6c73fcee9c071492968a00d4b68c053ea5cb908901a9003c 22 WIF 비밀 키 를 통 해 원래 의 비밀 키 를 얻 습 니 다. 값 은 0b0f26365fc38d502e650 f1e6c73fcee9c071492968a00d4b68c053ea5cb 9089 입 니 다.

좋은 웹페이지 즐겨찾기