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