블록 서명 검증 (catapult)

소개



Don't trust veryfy!

라고 잘 말하지만,

그런 말을 해도 어쨌든 괜찮습니다 ...

그렇지요. 거의 모든 사람이 스스로 확인하지 않는다고 생각합니다.
하지만 해보자. (서명 검증이지만)

이번에는 catapult에서 할 것입니다.

서명 확인할 블록



이번 서명 검증해 보는 블록은 아래와 같다. 서명되는 필드도 함께 확인하십시오.

스스로 만든 네트워크상의 데이터이므로, 테스트 넷의 데이터 등과는 전혀 관계가 없는 데이터입니다.



말할 필요도 없지만, 서명이 검증된다 = 데이터가 공개키에 묶는 비밀키의 소유자가 서명한 것을 확인할 수 있다는 의미를 가집니다. 즉, 블록을 릴레이하고 있을 때, 서명된 데이터 부분을 누군가가 변조하면 들키는 것이군요.

전자 서명은 무엇을 사용합니까?



catapult에서 사용되는 전자 서명은 ed25519입니다. 이 ed25519 는 내부적으로 해시 함수를 사용하고 있습니다만, 그 해시 함수가 catapult라면 SHA3_512 가 되어 있습니다. NIS1(현행 NEM)이라면 Keccak_512 를 사용하고 있습니다.

덧붙여서, NIS2에 관해서는, 여기는 NIS1의 것에 맞춘다고 합니다. 어디까지나 catapult에서는 SHA3_512 를 사용하고 있다고 하는 것입니다.
ed25519의 흐름은 이쪽.



그림 안에 HashFunction 가 있는 것을 알 수 있다고 생각합니다. 이것이 다르면 서명도 바뀌고, 검증할 수 있는 것도 할 수 없게 됩니다.

SHA3와 Keccak의 관계는 이쪽.
htps : // 코 m / 민코시 / ms / 4b8fd450f13637 6 아 1f2

확인해보기



언어는 무엇이든 좋았지만 이번에는 루비
require "ed25519_keccak"

class Deterministic_block_nis2
  attr_reader :size, :signature, :pubkey_of_signer, :version, :entity_type, :height, :timestamp, :diff, :prev_block_hash, :tx_hash , :private_key

  def initialize
    @size = "c0000000"
    @signature = "addb1df57ee20e94b43ba09b2789689be51dc80f3f3557cb7973d1fb7107ef32a7f5810d3a0c554d5d8a8dfab0e95e6ef1537ce1aafe62282d8a6186627c260d"
    @pubkey_of_signer = "f59240141852736bc2a23832833eb2114ce037b0066217e09207ddfea0e08478"
    @version = "0390"
    @entity_type = "4381"
    @height = "0200000000000000"
    @timestamp = "141e9dd512000000"
    @diff = "00407a10f35a0000"
    @prev_block_hash = "9050e352bb5bf321522a7067b78c87c3c3cd5c7c7fbc1c96fae82f6d73974452"
    @tx_hash = "0000000000000000000000000000000000000000000000000000000000000000"
  end

  def get_data_buffer
    data_buffer = @version + @entity_type + @height + @timestamp + @diff + @prev_block_hash + @tx_hash
    return data_buffer
  end
end

nis2_block = Deterministic_block_nis2.new

publickey = nis2_block.pubkey_of_signer
message   = nis2_block.get_data_buffer
signature = nis2_block.signature

ed25519 = Ed25519Keccak::SHA3_512.new

is_verify = ed25519.verify( publickey, message , signature, :hex )
puts( "is verify ? : " + is_verify.to_s )

실행하면 결과 true가 표시됩니다.

도서관 없음



루비를 사용했는데 깊은 의미는 없습니다. 반복되겠지만...

catapult에서 사용되는 전자 서명은 ed25519입니다. 이 ed25519 는 내부적으로 해시 함수를 사용하고 있습니다만, 그 해시 함수가 catapult라면 SHA3_512 가 되어 있습니다. NIS1(현행 NEM)이라면 Keccak_512 를 사용하고 있습니다.

여기서 어려운 일은 루비의 젬을 찾는 것입니다. SHA2_512 그렇다면 곧 발견되었습니다.

그래서 다른 언어를 사용할까라고 생각했는데, 어차피라면 여러가지 공부가 만들어 만들어 보았습니다. (구현 자체는 RFC8032 안에있는 python 코드를 ruby로 다시 쓴 것입니다)

암호는 스스로 만지고 싶지 않아요. 이 근처가 NEM의 매운 곳일지도 모릅니다.

참고

좋은 웹페이지 즐겨찾기