環境
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: コード全体はこちらにあります。