블록 체인 의 WIF 비밀 키 에 대한 작은 인식 과 데모 실현
코드 는 다음 과 같 습 니 다:
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 입 니 다.