Cryptocurrency Research Lab.

Cryptocurrency関連技術についての調査・研究

【RippleAPI】⑥ Public key & Private key

XRPは、BitcoinやEthereumなど他の暗号資産と同様に、公開鍵暗号技術の応用によって実現されています。具体的には、XRPではecdsa-secp256k1ed25519という暗号化方式が使われています。

【RippleAPI】② XRP Test Net』でも解説したように、XRPではAddressとSecretが使われており、この2つを用いて送金等が行うことができます。送金を行う際には、送金トランザクションを行う者が確かに本人であることを確認するために、トランザクションデータに署名を行います。

公開鍵暗号方式では公開鍵(Public key)と自分しか知らない秘密鍵(Private key)を用います。そして、公開鍵で暗号化したデータは秘密鍵で復号でき、逆に秘密鍵で暗号化したデータは公開鍵で復号できるという特徴がありますので、前者はデータの暗号用に、後者は本人であることの署名に使われます。

XRPのAddressとSecret、公開鍵暗号の公開鍵と秘密鍵の間にどのような関連があるのか少し気になりましたので、下図の通り整理してみました。

f:id:halifax:20190507222056p:plain

関数 処理概要
generateAddress() addressとsecretを生成します
deriveKeypair(secret) secretから公開鍵と秘密鍵を取得します
deriveAddress(publicKey) 公開鍵からアドレスを生成します

この図から、Secretから秘密鍵、公開鍵、Addressが一意に決まるということが分かりました。 それぞれどのようなロジックで決定されるのかという点はAPI内部の話になりますのでここでは説明しません。

key.js
const RippleAPI = require('ripple-lib').RippleAPI;
const api = new RippleAPI();

let account = api.generateAddress();
console.log(account);

let keyPair = api.deriveKeypair(account.secret);
console.log(keyPair);

let address = api.deriveAddress(keyPair.publicKey);
console.log(address);
実行結果例
{ secret: '<シークレット>',
  address: 'rHw2kCtzxrBx6yj6C6emsj3cop5riaqKik' }
{ privateKey:
   '<秘密鍵>', 
  publicKey:
   '038BE681945CCBDFB6BCF529E7E5238F37A569D5E290889A29CBC99FAE50D0F806' }
rHw2kCtzxrBx6yj6C6emsj3cop5riaqKik

generateAddress()関数で得られたAddressと、明示的にSecretからキーペアを取得し、その公開鍵から取得したAddressが一致することを確認しました。generateAddress()関数が返すAddressも、内部では同じような手順でAdressを取得していると考えられますので、当然といえば当然ですね。色々と試しながら、少しずつ理解していければいいと考えています。