Proof of ownership as an authentication method

[2016.05.02arrow-up-right] My name is Craig Wright and I am about to demonstrate a signing of a message with the public key that is associated with the first transaction ever done in Bitcoin.

var bitcoinPrivateKey = new BitcoinSecret("XXXXXXXXXXXXXXXXXXXXXXXXXX", Network.Main);

var message = "I am Craig Wright";
string signature = bitcoinPrivateKey.PrivateKey.SignMessage(message);
Console.WriteLine(signature); // IN5v9+3HGW1q71OqQ1boSZTm0/DCiMpI8E4JB1nD67TCbIVMRk/e3KrTT9GvOuu3NGN0w8R2lWOV2cxnBp+Of8c=

Was that so hard?

You may remember Craig Wright, who really wanted us to believe he is Satoshi Nakamoto. He had successfully convinced a handful of influential Bitcoin people and journalists with some social engineering. Fortunately digital signatures do not work that way. Let's quickly find on the Internetarrow-up-right the first ever bitcoin address, associated with the genesis block: 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNaarrow-up-right and verify his claim:

var message = "I am Craig Wright";
var signature = "IN5v9+3HGW1q71OqQ1boSZTm0/DCiMpI8E4JB1nD67TCbIVMRk/e3KrTT9GvOuu3NGN0w8R2lWOV2cxnBp+Of8c=";

var address = new BitcoinPubKeyAddress("1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa", Network.Main);
bool isCraigWrightSatoshi = address.VerifyMessage(message, signature);

Console.WriteLine("Is Craig Wright Satoshi? " + isCraigWrightSatoshi);

SPOILER ALERT! The bool will be false.

Here is how you prove you are the owner of an address without moving coins:

Address: 1KF8kUVHK42XzgcmJF4Lxz4wcL5WDL97PBarrow-up-right Message: Nicolas Dorier Book Funding Address Signature: H1jiXPzun3rXi0N9v9R5fAWrfEae9WPmlL5DJBj1eTStSvpKdRR8Io6/uT9tGH/3OnzG6ym5yytuWoA9ahkC3dQ=

This constitutes proof that Nicolas Dorier owns the private key of the book. Exercise: Verify that Nicolas sensei is not lying!

Sidenote

Do you know how PGP works? Pretty similar, right? Maybe this can be the foundation of a more user friendly PGP alternative. Please build it on top of NBitcoin :-)

Last updated