class CryptoToolchain::Tools::DSARecoverPrivateKeyFromNonce

Attributes

g[R]
message[R]
p[R]
public_key[R]
q[R]
r[R]
s[R]

Public Class Methods

new(public_key: , message: , r: , s: , p: DSA_P, q: DSA_Q, g: DSA_G) click to toggle source
# File lib/crypto_toolchain/tools/dsa_recover_private_key_from_nonce.rb, line 4
def initialize(public_key: , message: , r: , s: , p: DSA_P, q: DSA_Q, g: DSA_G)
  @public_key = numberize(public_key)
  @p = p
  @q = q
  @g = g
  @r = numberize(r)
  @s = numberize(s)
  @message = message
end

Public Instance Methods

execute(min: 1, max: 0xffffffff) click to toggle source
# File lib/crypto_toolchain/tools/dsa_recover_private_key_from_nonce.rb, line 31
def execute(min: 1, max: 0xffffffff)
  (min..max).each do |k|
    return private_key_from(k: k) if valid_k?(k)
  end
  raise RuntimeError.new("Could not recover key")
end
private_key_from(k: ) click to toggle source
# File lib/crypto_toolchain/tools/dsa_recover_private_key_from_nonce.rb, line 22
def private_key_from(k: )
  #     (s * k) - H(msg)
  # x = ----------------  mod q
  #             r
  numerator = ((s * k) - CryptoToolchain::Utilities::SHA1.digest(message).to_number) % q
  denominator = r.invmod(q)
  ((numerator * denominator) % q).to_bin_string
end
valid_k?(k) click to toggle source
# File lib/crypto_toolchain/tools/dsa_recover_private_key_from_nonce.rb, line 16
def valid_k?(k)
  x = private_key_from(k: k)
  kp = CryptoToolchain::BlackBoxes::DSAKeypair.new(p: p, q: q, g: g, private_key: x)
  kp.public_key == public_key
end