class CryptoToolchain::Tools::LowExponentRSASignatureForgery

Attributes

keypair[R]
message[R]

Public Class Methods

new(message: , keypair: ) click to toggle source
# File lib/crypto_toolchain/tools/low_exponent_rsa_signature_forgery.rb, line 5
def initialize(message: , keypair: )
  @keypair = keypair
  @message = message
end

Public Instance Methods

execute() click to toggle source
# File lib/crypto_toolchain/tools/low_exponent_rsa_signature_forgery.rb, line 11
def execute
  digest = CryptoToolchain::Utilities::SHA1.digest(message)
  asn = ASN1.fetch(:sha1)
  max = (keypair.bits / 8) - (asn.bytesize + digest.bytesize + 3)
  (1..max).reverse_each do |padlen|
    forged = "\x01\xff\x00#{asn}#{digest}#{0.chr * padlen}".
      to_number.
      root(3, round: :up).
      to_bin_string
    found = keypair.verify(message, signature: forged)
    return forged if found
  end
  raise RuntimeError.new("Couldn't forge a signature")
end