LoginSignup
5
1

More than 5 years have passed since last update.

rubyでed25519

Posted at

環境

ruby v2.5
ed25519 v1.2.4

ed25519の鍵生成

generate.rb
require 'ed25519'

# generate key pair
signing_key = Ed25519::SigningKey.generate
verify_key = signing_key.verify_key
p signing_key
# => #<Ed25519::SigningKey:0x0000559c56048560>
p verify_key
#<Ed25519::VerifyKey:87638dba56966eb6971caea77420d62a880f80d066531875995fd272d39e6eb1>

鍵長は32byteです。

ed25519で署名

sign.rb
# sign
payload = 'plain text'
signature = signing_key.sign payload
puts signature.unpack 'H*'
# => ["b5498cc4377237fb1dbdf8238d79a978c42d7633c10330234b1620532775bb77e6d224d046142442164a1d5d38f51e520f4894b784ee84aa1c68efa3ca9f2a0a"]

署名サイズは64byteです。

ed25519検証

verify.rb
#verify
puts result = verify_key.verify signature, payload
# => true
wrong_payload = 'Diffrent from original message'
begin
  verify_key.verify signature, wrong_payload
rescue => e
  puts e.class
  puts e.message
end
# => Ed25519::VerifyError
# => signature verification failed!

署名の検証に成功したときはtrueを、失敗したときは例外:VerifyErrorを返します。

鍵を文字列として扱う

鍵を文字列として扱うことができます。
バイト列にシリアライズするにはto_bytesメソッドを用います。
16進数で表すにはString#unpackメソッドを用います。

serialize.rb
# serialize keys
signing_key_bytes = signing_key.to_bytes
verify_key_bytes = verify_key.to_bytes
puts signing_key_bytes.unpack 'H*'
puts verify_key_bytes.unpack 'H*'
# => ["0c4fa4bd9889b646051ca5c1c2dfc154b987c0af0a1ccc28d397367baae759bd"]
# => ["87638dba56966eb6971caea77420d62a880f80d066531875995fd272d39e6eb1"]

バイト列から鍵オブジェクトを生成

シリアライズしたバイト列から鍵オブジェクトを生成することができます。
当然、複号も正しく行うことができます。

resotore.rb
# You can make key objects form both serialized keys
# signing key
# Ed25519::SigningKey.new signing_key_bytes

# verify key
restored_verify_key = Ed25519::VerifyKey.new verify_key_bytes
second_result = restored_verify_key.verify signature, payload
puts second_result
# => true

SSHの鍵としても!

sshの鍵としてもed25519を使うことができます。
GitHubでEd25519鍵をつかう

もっとくわしく!

crypto-rb/ed25519
ruby/String::unpack
Gist: コード全体はこちらにあります。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1