Beispiel #1
0
 def __init__(self,
              n,
              oracle,
              callback,
              e=0x10001,
              pool_size=mp.cpu_count()):
     """Builds an object to compute the Bleichenbacher attack
 >>> def callback(*args):
 ...   pass
 >>> b = Bleichenbacher(1234123412341234, None, callback)
 Traceback (most recent call last):
 ValueError: Padding oracle must extend the Oracle base class
 >>> o = Oracle()
 >>> b = Bleichenbacher(1234123412341234, o, None)
 Traceback (most recent call last):
 ValueError: Callback must be a function evaluating oracle output
 >>> b = Bleichenbacher(1234123412341234, o, callback)
 >>> b.n
 1234123412341234
 >>> b.k
 64
 >>> hex(b.B2)[:3] == "0x2"
 True
 >>> hex(b.B3 - 1)[:5] == "0x2ff"
 True
 """
     self.n = NumUtils.to_int_error(n, "Modulus")
     bits_needed = NumUtils.bytes_to_hold(self.n) * 8
     self.k = NumUtils.pow2_round(bits_needed)
     self.e = NumUtils.to_int_error(e, "Exponent")
     self.B = 2**(self.k - 16)
     self.B2 = 2 * self.B
     self.B3 = 3 * self.B
     self.M0 = set([(self.B2, self.B3 - 1)])
     self.s_min_start = NumUtils.ceil_int(n, self.B3)
     self.s_search_running = False
     self.found_solution = False
     self.__logger = logging.getLogger(__name__)
     if isinstance(oracle, Oracle):
         self.oracle = oracle
     else:
         raise ValueError(
             "Padding oracle must extend the Oracle base class")
     if callable(callback):
         self.callback = callback
     else:
         raise ValueError(
             "Callback must be a function evaluating oracle output")
     if pool_size <= 0:
         raise ValueError(
             "Number of threads in the pool must be strictly positive")
     self.__pool_size = pool_size
     self.__logger.info("Bleichenbacher attack initialized with:")
     self.__logger.info("\tModulus: %i" % self.n)
     self.__logger.info("\tPublic exponent: %i" % self.e)
     self.__logger.info("\tKey size (in bits): %i" % self.k)
     self.__logger.info("\tOracle type: %s" %
                        self.oracle.__class__.__name__)
Beispiel #2
0
 def __init__(self, key_length):
   """
   >>> pad = PKCS1_v15(-1)
   Traceback (most recent call last):
   ValueError: Key length cannot be negative or null
   >>> pad = PKCS1_v15(500)
   >>> pad.k == 512 / 8
   True
   """
   if key_length <= 0:
     raise ValueError("Key length cannot be negative or null")
   self.k = NumUtils.pow2_round(key_length) / 8
Beispiel #3
0
 def __init__(self, key_length):
     """
 >>> pad = PKCS1_v15(-1)
 Traceback (most recent call last):
 ValueError: Key length cannot be negative or null
 >>> pad = PKCS1_v15(500)
 >>> pad.k == 512 / 8
 True
 """
     if key_length <= 0:
         raise ValueError("Key length cannot be negative or null")
     self.k = NumUtils.pow2_round(key_length) / 8
Beispiel #4
0
 def __init__(self, n, oracle, callback, e=0x10001, pool_size=mp.cpu_count()):
   """Builds an object to compute the Bleichenbacher attack
   >>> def callback(*args):
   ...   pass
   >>> b = Bleichenbacher(1234123412341234, None, callback)
   Traceback (most recent call last):
   ValueError: Padding oracle must extend the Oracle base class
   >>> o = Oracle()
   >>> b = Bleichenbacher(1234123412341234, o, None)
   Traceback (most recent call last):
   ValueError: Callback must be a function evaluating oracle output
   >>> b = Bleichenbacher(1234123412341234, o, callback)
   >>> b.n
   1234123412341234
   >>> b.k
   64
   >>> hex(b.B2)[:3] == "0x2"
   True
   >>> hex(b.B3 - 1)[:5] == "0x2ff"
   True
   """
   self.n = NumUtils.to_int_error(n, "Modulus")
   bits_needed = NumUtils.bytes_to_hold(self.n) * 8
   self.k = NumUtils.pow2_round(bits_needed)
   self.e = NumUtils.to_int_error(e, "Exponent")
   self.B = 2**(self.k - 16)
   self.B2 = 2*self.B
   self.B3 = 3*self.B
   self.M0 = set([(self.B2, self.B3 - 1)])
   self.s_min_start = NumUtils.ceil_int(n, self.B3)
   self.s_search_running = False
   self.found_solution = False
   self.__logger = logging.getLogger(__name__)
   if isinstance(oracle, Oracle):
     self.oracle = oracle
   else:
     raise ValueError("Padding oracle must extend the Oracle base class")
   if callable(callback):
     self.callback = callback
   else:
     raise ValueError("Callback must be a function evaluating oracle output")
   if pool_size <= 0:
     raise ValueError("Number of threads in the pool must be strictly positive")
   self.__pool_size = pool_size
   self.__logger.info("Bleichenbacher attack initialized with:")
   self.__logger.info("\tModulus: %i" % self.n)
   self.__logger.info("\tPublic exponent: %i" % self.e)
   self.__logger.info("\tKey size (in bits): %i" % self.k)
   self.__logger.info("\tOracle type: %s" % self.oracle.__class__.__name__)
    else:
        cleartexts = [
            cleartext.strip(linesep) for cleartext in stdin.readlines()
        ]

    print_encrypted = args.clear

    if args.tests == None:
        tests = (1, )
    else:
        tests = set(args.tests)

    if args.pubkey != None:
        try:
            rsa = RSA.importKey(args.pubkey.read())
            k = NumUtils.pow2_round(rsa.size())
        except Exception as ex:
            print("Can't load public key from file %s: " % args.pubkey.name,
                  ex,
                  file=stderr)
            parser.print_help()
            exit(1)
    else:
        print_encrypted = False

    if args.length != None:
        k = NumUtils.pow2_round(args.length)

    if args.hex:
        try:
            cleartexts = [unhexlify(cleartext) for cleartext in cleartexts]
Beispiel #6
0
  if args.cleartext != '-':
    cleartexts = [args.cleartext]
  else:
    cleartexts = [cleartext.strip(linesep) for cleartext in stdin.readlines()]
  
  print_encrypted = args.clear

  if args.tests == None:
    tests = (1,)
  else:
    tests = set(args.tests)

  if args.pubkey != None:
    try:
      rsa = RSA.importKey(args.pubkey.read())
      k = NumUtils.pow2_round(rsa.size())
    except Exception as ex:
      print("Can't load public key from file %s: " % args.pubkey.name, ex, file=stderr)
      parser.print_help()
      exit(1)
  else:
      print_encrypted = False

  if args.length != None:
    k = NumUtils.pow2_round(args.length)

  if args.hex:
    try:
      cleartexts = [unhexlify(cleartext) for cleartext in cleartexts]
    except TypeError as te:
      print("Cleartext provided is not in hex format: %s: " % cleartext, te, file=stderr)