BIP38 Test Vector
BIP38
BIP38은 암호로 보호된 개인키(Passphrase-protected private key)를 생성하는 알고리즘을 설명하고 있는데, https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki 에 자세히 설명되어 있다. (BIP38은 2012년에 제안된 것으로 Proposal에 코멘트되어 있듯이 실제 구현을 권장하지는 않는다.)
BIP38의 2가지 모드
- (1) No EC Multiply 모드: 개인키를 사용자가 정한 암호를 활용하여 암호화(AES256)하는 것으로 출력으로 암호화된 개인키(encrypted private key)를 얻게 된다.
- (2) EC Multiply 모드: 이는 2가지 Factor를 사용하여 개인키를 암호화하는 방식으로, 2개의 그룹 혹은 기관에서 독립적으로 하나의 Factor를 도출할 수 있게 한다. 예를 들어, 공장A에서 Passphrase를 사용하여 랜덤 factor(이를 passfactor라 함)를 넣어 중간코드(intermediate code)를 생성하고 이를 공장B에 전달하면, Passphrase를 모르는 공장B에서는 랜덤 factor(이를 factorb라 함)를 만들어 최종 개인키를 만들어 낸다. 이때 공장A는 passfactor만 알고, factorb를 모르고, 공장B는 factorb는 알지만 passfactor를 모르게 된다. 최종 개인키는 elliptic curve 상의 ECPoint (passfactor*factorb*G)로부터 만들어 진다.
BIP38 Test Vector
https://github.com/bitcoin/bips/blob/master/bip-0038.mediawiki 문서의 마지막에 Test Vector가 있는데, EC Multiply 모드 테스트 벡터의 경우 랜덤 factor들에 정보가 명시적으로 표시되어 있지 않다. (문서에 표기된 정보를 역으로 계산해서 값을 도출할 수 있지만 여기에 참고 자료로 이를 정보를 공유한다.)
EC multiply, no compression, no lot/sequence numbers
Test 1:
Passphrase: TestingOneTwoThree Passphrase code: passphrasepxFy57B9v8HtUsszJYKReoNDV6VHjUSGt8EVJmux9n1J3Ltf1gRxyDGXqnf9qm Encrypted key: 6PfQu77ygVyJLZjfvMLyhLMQbYnu5uguoJJ4kMCLqWwPEdfpwANVS76gTX Bitcoin address: 1PE6TQi6HTVNz5DLwB1LcpMBALubfuN2z2 Unencrypted private key (WIF): 5K4caxezwjGCGfnoPTZ8tMcJBLB7Jvyjv4xxeacadhq8nLisLR2 Unencrypted private key (hex): A43A940577F4E97F5C4D39EB14FF083A98187C64EA7C99EF7CE460833959A519 [추가정보] *ownersalt: a50dba6772cb9383 *seedb: 99241d58245c883896f80843d2846672d7312e6195ca1a6c
Test 2:
Passphrase: Satoshi Passphrase code: passphraseoRDGAXTWzbp72eVbtUDdn1rwpgPUGjNZEc6CGBo8i5EC1FPW8wcnLdq4ThKzAS Encrypted key: 6PfLGnQs6VZnrNpmVKfjotbnQuaJK4KZoPFrAjx1JMJUa1Ft8gnf5WxfKd Bitcoin address: 1CqzrtZC6mXSAhoxtFwVjz8LtwLJjDYU3V Unencrypted private key (WIF): 5KJ51SgxWaAYR13zd9ReMhJpwrcX47xTJh2D3fGPG9CM8vkv5sH Unencrypted private key (hex): C2C8036DF268F498099350718C4A3EF3984D2BE84618C2650F5171DCC5EB660A [추가정보] *ownersalt: 67010a9573418906 *seedb: 49111e301d94eab339ff9f6822ee99d9f49606db3b47a497
EC multiply, no compression, lot/sequence numbers
Test 1:
Passphrase: MOLON LABE Passphrase code: passphraseaB8feaLQDENqCgr4gKZpmf4VoaT6qdjJNJiv7fsKvjqavcJxvuR1hy25aTu5sX Encrypted key: 6PgNBNNzDkKdhkT6uJntUXwwzQV8Rr2tZcbkDcuC9DZRsS6AtHts4Ypo1j Bitcoin address: 1Jscj8ALrYu2y9TD8NrpvDBugPedmbj4Yh Unencrypted private key (WIF): 5JLdxTtcTHcfYcmJsNVy1v2PMDx432JPoYcBTVVRHpPaxUrdtf8 Unencrypted private key (hex): 44EA95AFBF138356A05EA32110DFD627232D0F2991AD221187BE356F19FA8190 Confirmation code: cfrm38V8aXBn7JWA1ESmFMUn6erxeBGZGAxJPY4e36S9QWkzZKtaVqLNMgnifETYw7BPwWC9aPD Lot/Sequence: 263183/1 [추가정보] *ownersalt: 4fca5a97 *seedb: 87a13b07858fa753cd3ab3f1c5eafb5f12579b6c33c9a53f ownerentropy: 4fca5a974040f001 passpoint : 02a6bf1824208903aa344833d614f7fa3ba46f4f8d57b2e219a1cfac961a9b7395 (hex) passfactor: 88469643539353826633573932400967225161250310422562217761837694721821251319371 (big-endian BigInteger) factorb : 51041525136325882627914407328954734227514226844922907135151774578012677075487 (big-endian BigInteger)
Test 2:
Passphrase (all letters are Greek - test UTF-8 compatibility with this): ΜΟΛΩΝ ΛΑΒΕ Passphrase code: passphrased3z9rQJHSyBkNBwTRPkUGNVEVrUAcfAXDyRU1V28ie6hNFbqDwbFBvsTK7yWVK Encrypted private key: 6PgGWtx25kUg8QWvwuJAgorN6k9FbE25rv5dMRwu5SKMnfpfVe5mar2ngH Bitcoin address: 1Lurmih3KruL4xDB5FmHof38yawNtP9oGf Unencrypted private key (WIF): 5KMKKuUmAkiNbA3DazMQiLfDq47qs8MAEThm4yL8R2PhV1ov33D Unencrypted private key (hex): CA2759AA4ADB0F96C414F36ABEB8DB59342985BE9FA50FAAC228C8E7D90E3006 Confirmation code: cfrm38V8G4qq2ywYEFfWLD5Cc6msj9UwsG2Mj4Z6QdGJAFQpdatZLavkgRd1i4iBMdRngDqDs51 Lot/Sequence: 806938/1 [추가정보] *ownersalt: c40ea76f *seedb: 03b06a1ea7f9219ae364560d7b985ab1fa27025aaa7e427a