├── CHANGES.txt ├── LICENSE.txt ├── MANIFEST ├── MANIFEST.in ├── README.md ├── RSAExploits ├── __init__.py ├── exploits │ ├── __init__.py │ ├── boneh_durfee.py │ ├── common_factor.py │ ├── common_modulus.py │ ├── ecm.py │ ├── exploit.py │ ├── fermat.py │ ├── franklin_reiter.py │ ├── hastad.py │ ├── qsieve.py │ └── wiener.py ├── rsa_cracker.py ├── rsa_data.py └── util.py ├── dist └── RSAExploits-0.1.0.tar.gz ├── setup.py └── test_files ├── boneh_durfee_test.py ├── common_factor_test.py ├── common_factor_test.txt ├── common_moduli_test.txt ├── common_modulus_test.py ├── franklin_reiter_test.py ├── hastad_test.py ├── hastadlist.txt ├── rsa_mistakes.txt ├── wiener_list.txt └── wiener_test.py /CHANGES.txt: -------------------------------------------------------------------------------- 1 | v0.1.0, -- Initial release. 2 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /MANIFEST: -------------------------------------------------------------------------------- 1 | # file GENERATED by distutils, do NOT edit 2 | CHANGES.txt 3 | LICENSE.txt 4 | README.txt 5 | setup.py 6 | RSAExploits/__init__.py 7 | RSAExploits/rsa_cracker.py 8 | RSAExploits/rsa_data.py 9 | RSAExploits/util.py 10 | RSAExploits/exploits/__init__.py 11 | RSAExploits/exploits/boneh_durfee.py 12 | RSAExploits/exploits/common_factor.py 13 | RSAExploits/exploits/common_modulus.py 14 | RSAExploits/exploits/ecm.py 15 | RSAExploits/exploits/exploit.py 16 | RSAExploits/exploits/fermat.py 17 | RSAExploits/exploits/franklin_reiter.py 18 | RSAExploits/exploits/hastad.py 19 | RSAExploits/exploits/qsieve.py 20 | RSAExploits/exploits/wiener.py 21 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include *.txt 2 | recursive-include docs *.txt 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Project Writeup 2 | ###Overview 3 | Cryptography challenges are popular in Capture the Flag (CTF) competitions and many of them involve exploiting a vulnerability in a poorly implemented RSA cryptosystem. These vulnerabilities make it possible to either factor an RSA modulus in a reasonable amount of time or compute the plaintext message directly. Often the workflow for solving one these RSA problems involves figuring out which vulnerability is present, researching exploits for that vulnerability, and writing a program/script implementing an exploit. Assuming that the vulnerability is not revealed in the problem statement, each of these steps can take a significant amount of time. On top of that there is also the time spent debugging the exploit implementation. 4 | 5 | To help reduce the amount of time spent on each of these steps, we have developed an RSA exploit library for CTF challenges related to RSA cryptosystems. Many commonly known exploits, including Wiener's Attack, Hastad's Broadcast Attack, Common Modulus attack are already implemented for the user. In addition, various prime factorization methods each with their own special use cases are included. If the required exploit is already implemented by our library, the time required to research, code, and debug a solution is significantly reduced. If the RSA vulnerability or required exploit is not immediately known, a user could run a battery of exploits against the provided ciphertexts and RSA key data in an attempt to uncover more information. Moreover, a RSA problem may be vulnerable to more than one attack, which may be unknown to both user and problem author. Thus, the library can also be used to test CTF challenges for correctness, thus reducing the amount time required to implement solution scripts. 6 | 7 | 8 | ###Existing Research/Work 9 | ##### 1. Twenty Years of Attacks on the RSA Cryptosystem 10 | This paper provides a survey of many potential vulnerabilities in the RSA cryptosystem and describes the exploits for each. Among the discussed exploits are common modulus, Wiener's attack, Boneh Durfee attack, Hastad's Broadcast attack, and Franklin-Reiter Related Message attack. We used this paper as a basis for determining which exploits to include in our library. 11 | #####2. https://github.com/pablocelayes/rsa-wiener-attack 12 | Github user pablocelayes has written a collection of python scripts that implement Wiener's 13 | attack on RSA. When the private exponent(d) is less than N^(1/4), Wiener's attack can use continued fraction approximations to recover d. 14 | #####3 https://github.com/mimoo/RSA-and-LLL-attacks 15 | Github user mimoo appears to have written a collection of sage scripts that implement LLL 16 | lattice based attacks on RSA. LLL lattice reduction is an algorithm created by Coppersmith 17 | that can be used for finding roots of polynomial equations. His implementation of Boneh Durfee's attack is included in our library. 18 | #####4 http://ahack.ru/write-ups/ructf-quals-14.htm 19 | User Black Fan provided an implementation of the Franklin-Reiter Related Message attack that we modified to be more general. 20 | #####5 https://github.com/rk700/attackrsa/tree/master/attackrsa 21 | Github user rk700 has written implementations for both Hastad's Broadcast attack and the Fermat factorization method. Our library's implementations of both exploits were derived from his work. 22 | 23 | ###Approach and Implementation 24 | ##### Introduction 25 | During our research, we were unable to find a single library or tool that presented RSA exploits in coherent and easy to use fashion. We did find many implementations of RSA exploits that various CTF competitors around the world had posted in their writeups. However, many of them were coded in such a way that they were specific to the problem being solved and could not be applied to other problems. The implementations that were coded to be general often required different sets of parameters and it was unlikely that implementations for two different exploits would provide a common interface. To solve these issues, we decided to develop a library that provided both general implementations of various exploits for RSA vulnerabilities and a uniform interface through which these exploits could be run. 26 | 27 | ##### Architecture 28 | We implemented a class called RSAData to store all of the information associated with a particular RSA challenge, i.e. ciphertext plaintext pair and the RSA key elements used to manipulate that text data. At the moment, RSAData is implemented as a combination of the RSAObj class from pycrypto and a simple TextData class that we implemented ourselves. The RSAObj class is used to store and create all of the RSA key elements. This includes the modulus N, public exponent e, private exponent d, and primes p and q. We leveraged RSAObj's preexisting functionality for encryption and decryption. The TextData class stores the ciphertext, plaintext, and an ID number. Some of the exploits in our library only work if all ciphertexts were generated from the same plaintext. TextData objects with the same ID number contain ciphertexts that were generated from the same plaintext. The ID number field must be set by the user. 29 | 30 | Each exploit is implemented as a class that extends a base Exploit class. The base Exploit class only exports one method called run that takes two parameters. The first parameter is a list of RSAData objects and the second is a dictionary that can be used to specify additional information for particular exploits. For example, the Franklin-Reiter exploit requires a polynomial that specifies the relationship between two plaintext messages that were used to generate known ciphertexts. The presence of the run method provides a common interface that a user can use to call any exploit after the list of RSAData objects has been populated. Extracting the required information from the RSAData objects is handled by the run function and any subroutines called from there. 31 | 32 | ##### Usage 33 | We envision the common workflow as follows, first, the user will initialize a list of RSAData objects using information from the problem. Initializing an RSAData object reqires first initializing an RSAObj and a TextData object. The RSAObj should be initialized using our rsa_obj function which is actually a wrapper for pycrypto's construct function. The parameters to this function are as follows: 34 | 35 | ``` 36 | n: RSA modulus 37 | e: public exponent 38 | d: private exponent 39 | p: first prime factor 40 | q: second prime factor 41 | ``` 42 | All of the above parameters are long type. 43 | 44 | n and e are required parameters while the others are optional. We expect that in most CTF problems, the user will only provide n and e. 45 | 46 | The parameters to the TextData initializer are as follows: 47 | ``` 48 | c: ciphertext 49 | m: plaintext 50 | idnum: ID number identifies plaintext, two TextData object containing cipertext corresponding to same plaintext, have same idnum. 51 | ``` 52 | All of the above parameters have an integer type (they don't have to be explicitly declared as long type). 53 | 54 | None of these parameters are required and even the TextData object itself is an optional parameter in the RSAData init function. However, many exploits require ciphertexts, so the user needs to specify c and idnum in those cases. 55 | 56 | An example of initializing a RSAData object is shown below: 57 | ``` 58 | import RSAExploits 59 | 60 | n = #value 61 | e = #value 62 | c = #value 63 | idnum = #value 64 | 65 | rsaobj = RSAObj(n, e) 66 | txt = TextData(c_text=c, idnum=idnum) 67 | rsadata = RSAData(rsaobj, txt) 68 | ``` 69 | 70 | After the users have initialized a list of RSAData objects, they have two options. They can, either run a predefined list of exploits against their RSAData objects, or they can specify the desired exploit manually by instantiating a class for that exploit and invoking its run method. Examples of both scenarios are shown below: 71 | 72 | ``` 73 | # Run a predefined list of exploits 74 | rsadata_list = [] # Assume this list has already been populated 75 | rsa_cracker.init() 76 | rsa_cracker.attack(rsadata_list) 77 | ``` 78 | 79 | ``` 80 | # Specify an exploit to run 81 | rsadata_list = [] # Assume this list has already been populated 82 | exploit = Common_Modulus() 83 | exploit.run(rsadata_list) 84 | ``` 85 | 86 | The run function in each exploit attemptS to uncover missing information in each RSAData object in the provided list. For all of the currently implemented exploits, this means either recovering d,p, and q (private exponent and prime factors) or the plaintext message m. Any recovered information is updated in the corresponding RSAData object. If a run function is able to uncover any information in any of the RSAData objects, it returns True. Otherwise, it returns False. If a run function returns True, most CTF players would then want to know what the recovered flag is. Often, this flag is a string. If the successful exploit recovered the private exponent d, the user would first need to decrypt the ciphertext before attempting to print the message. If the successful exploit recovered the message, the user would just need to convert the plaintext from an integer form to ASCII. Examples of both scenarios are shown below: 87 | 88 | ``` 89 | # Exploit recovered the private exponent d 90 | rsadata.decrypt() 91 | print num2string(rsadata.get_m()) 92 | ``` 93 | 94 | ``` 95 | # Exploit recovered the private exponent d 96 | print num2string(rsadata.get_m()) 97 | ``` 98 | 99 | num2string is a function included when the user imports RSAExploits and it converts an integer to its hex representation and then interprets it as ASCII. 100 | 101 | Some of the exploits require extra information that did not fit cleanly into the RSAData object. To handle these special cases, a second optional parameter is accepted by each exploit's run() function. This parameter is a dictionary containing key-value pairs where the key is a string that is equivalent to the name of an exploit class and the value is the extra information required. For example, the Franklin-Reiter exploit requires a polynomial that describes the relationship between two plaintext messages that produced two known ciphertexts. The documentation for individual exploits should be checked to see if they require any extra information. An example usage of the dictionary is shown below: 102 | 103 | ``` 104 | from sage.all_cmdline import * 105 | rsadata_list = [] # Assume this list has been populated 106 | n = some_value 107 | x = PolynomialRing(ZZ.quo(n*ZZ), 'x').gen() 108 | poly = x - 5 109 | info_dict = {} 110 | info_dict["Franklin_Reiter"] = poly 111 | Franklin_Reiter().run(rsadata_list, info_dict) 112 | ``` 113 | 114 | ##### Exploits 115 | At the moment the following exploits/factorization methods are available: 116 | * Boneh Durfee attack on low private exponents 117 | * Common Modulus 118 | * Common Factor (common prime factors in moduli) 119 | * ECM Factorization (special condition: one of the primes should be much smaller) 120 | * Fermat Factorization (special condition: p and q are very close together) 121 | * Franklin-Reiter Related Message attack (special condition: relation between messages) 122 | * Hastad's Broadcast attack (special condition: number of RSAData should be greater than or equal to e) 123 | * Quadratic Sieve Factorization (2nd fastest general purpose factoring algorithm) 124 | * Wiener's attack (special condition: low private exponent) 125 | 126 | ##### Expansion 127 | Adding new exploits to our module is pretty straightforward. A new .py file should be created and placed in the exploits folder, that declares a new class extending Exploit. This new class must implement a run function that applies the exploit to a list of RSAData objects, and optionally uses the dictionary to receive extra information. 128 | 129 | ##### Sage 130 | Some of the included exploits in the library require sage to run. For example Franklin_Reiter relies on Sage's ability to handle polynomials. However, Sage is not required to use our library. If the user attempts to run any exploits that require Sage, an error message will be printed. Exploits that do not require Sage will run just fine. 131 | 132 | ##### Installation 133 | From command line run the following: 134 | ``` 135 | sudo apt-get update 136 | git clone https://github.com/vik001ind/RSAExploits.git 137 | sudo pip install RSAExploits/ 138 | 139 | # If sage is installed, run the following commands as well 140 | cd RSAExploits/ 141 | sudo sage -python setup.py install 142 | ``` 143 | 144 | ##### Pylint 145 | At the moment we are ignoring any errors concerning variable names or imports from sage. We know that the error messages about imports from sage are not correct and we feel that many of the variable names (eg: N, e, d) are named appropriately given the context of RSA. 146 | 147 | ###CTF Problem examples: 148 | 149 | ####CTF Problem: Hack You 2014 - CRYPTONET: 150 | We have intercepted communication in a private network. It uses a strange protocol based on RSA cryptosystem. 151 | Can you still prove that it is not secure enough and get the flag? 152 | 153 | Analysis of server RSA implementation and capture file: 154 | * Integer encoded plain-text message is less than modulus 155 | * Public exponent(e) remains constant (17), but modulus(N) varies 156 | * 19 ciphertexts are captured 157 | 158 | This cryptosystem is vulnerable to Hastad's Broadcast Attack. Hastad's attack uses the Chinese Remainder Theorem to recover the plaintext message given a list of ciphertexts, moduli, and the public exponent e. It is guaranteed to succeed if the same plaintext message was used to generate all ciphertexts, the public exponent e is the same in all encryptions, the number of ciphertexts is greater than or equal to e, all of the moduli are greater than the plaintext, all of the moduli are unique, and all of the moduli are coprime (if they are not coprime then they share a common factor and another exploit can be used). Ideally, a user needs to extract the ciphertexts, moduli, and public exponent from the packet capture file and provide that information to our library. Our library would run through a list of exploits that includes Hastad's attack and would recover the plaintext. If the user realizes that the correct exploit is Hastad's attack, they could specify the correct exploit and not have to wait for all of the other exploits to finish executing. The corresponding script might resemble the following: 159 | 160 | ``` 161 | from RSAExploits import rsa_cracker 162 | from RSAExploits import RSAData 163 | from RSAExploits import rsa_obj 164 | from RSAExploits import TextData 165 | from RSAExploits import num2string 166 | from RSAExploits import Hastad 167 | import sys 168 | 169 | sys.setrecursionlimit(10000) 170 | 171 | # Parse and store all of the ciphertexts provided by the file 172 | rsadata_list = [] 173 | c = None 174 | e = None 175 | N = None 176 | f = open("hastadlist.txt", 'r') 177 | for line in f: 178 | if line.startswith("e"): 179 | e = long(line.split(" ")[2]) 180 | elif line.startswith("n"): 181 | N = long(line.split(" ")[2], 0) 182 | elif line.startswith("ciphertext"): 183 | c = long(line.split(" ")[2], 0) 184 | rsadata_list.append(RSAData(rsa_obj(N, e), TextData(c, 1))) 185 | f.close() 186 | 187 | # Library specific call 188 | # Run the exploit by specifying it 189 | if Hastad().run(rsadata_list): 190 | print num2string(rsadata_list[0].get_m()) 191 | ``` 192 | 193 | 194 | ####CTF Problem: Hack.lu 2014 - Wiener: 195 | It’s gold rush time! The New York Herald just reported about the Californian gold rush. We know a sheriff there is hiring guys to help him fill his own pockets. We know he already has a dreadful amount of gold in his secret vault. However, it is protected by a secret only he knows. When new deputies apply for the job, they get their own secret, but that only provies entry to a vault of all deputy sheriffs. No idiot would store their stuff in this vault. But maybe we can find a way to gain access to the sheriff’s vault? Have a go at it: 196 | nc wildwildweb.fluxfingers.net 1426 197 | 198 | Analysis of server RSA implementation: 199 | * Public key is accessible through server 200 | * The size of the private exponent(d) in bits is around 1/5 of the modulus 201 | 202 | The name of the problem gives it away, but this cryptosystem is vulnerable to Wiener's Attack. Wiener's attack is able to recover the private exponent d when d < N^(1/4). Once again, our library could be used to reduce the amount of time needed to write a script that uses Wiener's attack to recover the private key and decrypt the message. The script that the user has to write might resemble the following: 203 | 204 | ``` 205 | from RSAExploits import rsa_cracker 206 | from RSAExploits import RSAData 207 | from RSAExploits import rsa_obj 208 | from RSAExploits import TextData 209 | from RSAExploits import num2string 210 | from RSAExploits import Wiener 211 | import sys 212 | 213 | sys.setrecursionlimit(10000) 214 | 215 | # Parse and store all of the ciphertexts provided by the file 216 | rsadata_list = [] 217 | rsadata_list.append(RSAData(rsa_obj(n, e))) # Assume n and e have been initialized 218 | if Wiener().run(rsadata_list): 219 | print (rsadata_list[0].get_d()) 220 | ``` 221 | 222 | 223 | ####CTF Problem: PicoCTF 2014 - RSA Mistakes: 224 | Daedalus Corp seems to have had a very weird way of broadcasting some secret data. We managed to find the server code that broadcasted it, and one of our routers caught some of their traffic - can you find the secret data? We think someone may have requested the secret using someone else's user id by accident, but we're not sure. 225 | 226 | Analysis of server RSA implementation and capture file: 227 | * All messages are encrypted using a public exponent of 3 228 | * Two messages have been encrypted using the same public key (N,e) 229 | * Those 2 messages are related by a known polynomial 230 | 231 | This problem is vulnerable to the Franklin-Reiter Related Message attack. When two messages differ by a known amount and are encrypted using the same public key, then we compute the message directly. However, the Franklin-Reiter attack will only terminate in a reasonable amount of time if the public exponent e is small. Lucky for us, that is the case. So, a user of our library should only have to provide the modulus, public exponent, two ciphertexts, and a polynomial representing the relationship of the two plaintext messages used to generate the ciphertexts. The rest of the work would be taken care of by the pre-implemented Franklin-Reiter exploit. The resulting script might resemble the following: 232 | 233 | ``` 234 | from sage.all_cmdline import * 235 | from RSAExploits import rsa_cracker 236 | from RSAExploits import RSAData 237 | from RSAExploits import rsa_obj 238 | from RSAExploits import TextData 239 | from RSAExploits import num2string 240 | from RSAExploits import mod_inv 241 | from RSAExploits import Franklin_Reiter 242 | import sys 243 | 244 | sys.setrecursionlimit(10000) 245 | 246 | # Assume N, e, c1, c2, a, and b have been initialized 247 | 248 | info_dict = {} 249 | rsadata_list = [] 250 | rsadata_list.append(RSAData(rsa_obj(long(N), long(e)), TextData(c1))) 251 | rsadata_list.append(RSAData(rsa_obj(long(N), long(e)), TextData(c2))) 252 | 253 | x = PolynomialRing(ZZ.quo(N*ZZ), 'x').gen() 254 | poly = a*x + b 255 | info_dict["Franklin_Reiter"] = poly 256 | 257 | # Run exploit 258 | if Franklin_Reiter().run(rsadata_list, info_dict): 259 | plaintext = rsadata_list[0].get_m() 260 | print num2string(plaintext) 261 | 262 | ``` 263 | 264 | The actual full script that solves RSA Mistakes would be a little more involved. The plaintext messages are transformed before they are encrypted resulting in a few more steps at the end. 265 | 266 | 267 | ### Future Work 268 | There are still many RSA exploits that have yet to be implemented/added to our library. Among these are Coppersmith's Short Pad attack, Partial Key Exposure attacks, and Hastad's generalized broadcast attack. Future work could involve implementing these new exploits, improving code quality of the library, improving code efficiency, and improving usability. 269 | -------------------------------------------------------------------------------- /RSAExploits/__init__.py: -------------------------------------------------------------------------------- 1 | """ Package implementing exploits for various RSA vulnerabilities """ 2 | from RSAExploits.exploits.fermat import Fermat 3 | from RSAExploits.exploits.hastad import Hastad 4 | from RSAExploits.exploits.wiener import Wiener 5 | from RSAExploits.exploits.boneh_durfee import Boneh_Durfee 6 | from RSAExploits.exploits.common_factor import Common_Factor 7 | from RSAExploits.exploits.common_modulus import Common_Modulus 8 | from RSAExploits.exploits.ecm import Ecm 9 | from RSAExploits.exploits.qsieve import Qsieve 10 | from RSAExploits.exploits.franklin_reiter import Franklin_Reiter 11 | 12 | 13 | # Auto import of RSA_Data and util classes and functions 14 | from RSAExploits.rsa_data import rsa_obj 15 | from RSAExploits.rsa_data import TextData 16 | from RSAExploits.rsa_data import RSAData 17 | from RSAExploits.util import compute_priv_rsa_exp, totient_from_primes, \ 18 | coprime, is_printable, int_nthroot, crt, mod_inv, egcd, extract_key_from_pem, \ 19 | num2string 20 | -------------------------------------------------------------------------------- /RSAExploits/exploits/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ['exploit', 'boneh_durfee', 'fermat', 'hastad', 'qsieve', 'ecm', 'wiener', 'common_factor', 'common_modulus', 'franklin_reiter'] 2 | -------------------------------------------------------------------------------- /RSAExploits/exploits/boneh_durfee.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for the boneh durfee low private exponent exploit 2 | 3 | Much of this file was *autogenerated* from the file boneh_durfee.sage 4 | taken from: https://github.com/mimoo/RSA-and-LLL-attacks 5 | """ 6 | 7 | 8 | sage_present = True 9 | try: 10 | from sage.all_cmdline import * # import sage library 11 | _sage_const_2 = Integer(2) 12 | _sage_const_1 = Integer(1) 13 | _sage_const_0 = Integer(0) 14 | _sage_const_60 = Integer(60) 15 | 16 | # Currently this exploit is set to work if the private 17 | # exponent is <= N ^ 0.27. Theoretical it could be set 18 | # to work as long as d < N ^ 0.292 but that takes a lot 19 | # longer to run 20 | _sage_m_value = Integer(6) 21 | _sage_delta_value = RealNumber('0.27') 22 | except ImportError: 23 | sage_present = False 24 | 25 | from RSAExploits.exploits.exploit import Exploit 26 | 27 | debug = False 28 | 29 | class Boneh_Durfee(Exploit): 30 | """ Class providing a run interface to the boneh_durfee exploit""" 31 | 32 | def run(self, rsadata_list, info_dict = None): 33 | 34 | """ Attempts to recover private exponent using the boneh durfee exploit 35 | 36 | This attack works when the private key d is < N ^ 0.27. This limit 37 | can be tweaked up to a theoretical N^0.292, but the computation 38 | begins to take a very long time. 39 | 40 | Args: 41 | rsadata_list: A list of RSA_Data objects on which to attempt the 42 | boneh durfee exploit 43 | info_dict: Not currently used 44 | 45 | Side Effects: 46 | If a private key is recovered, the corresponding field in the 47 | RSA_Data object will be set 48 | 49 | Return: 50 | True if at least one private key is recovered 51 | """ 52 | 53 | global sage_present 54 | 55 | if not sage_present: 56 | print "Boneh Durfee: Sage required, skipping exploit" 57 | return 58 | 59 | print "Boneh Durfee: Running Attack..." 60 | success = False 61 | for rsadata in rsadata_list: 62 | 63 | solx, soly = Boneh_Durfee.boneh_durfee_wrapper(rsadata.get_n(), rsadata.get_e()) 64 | if solx == None: 65 | continue 66 | 67 | A = int((rsadata.get_n()+_sage_const_1 )/_sage_const_2 ) 68 | d = (solx * (A + soly) + _sage_const_1) / rsadata.get_e() 69 | success = True 70 | rsadata.set_d(long(d)) 71 | 72 | if success: 73 | print "Boneh Durfee: Success, at least one private exponent recovered" 74 | else: 75 | print "Boneh Durfee: Failure, no private exponents recovered" 76 | return sucess 77 | 78 | 79 | @staticmethod 80 | def boneh_durfee_wrapper(n, e): 81 | """ Wrapper for the boneh durfee exploit """ 82 | P = PolynomialRing(Zmod(e), names=('x', 'y',)); (x, y,) = P._first_ngens(2) 83 | A = int((n+_sage_const_1 )/_sage_const_2 ) 84 | pol = _sage_const_1 + x * (A + y) 85 | 86 | delta = _sage_delta_value 87 | m = _sage_m_value 88 | t = int((_sage_const_1 - _sage_const_2*delta)*m) 89 | 90 | X = _sage_const_2*floor(n**delta) 91 | Y = floor(n**(_sage_const_1 / _sage_const_2)) 92 | 93 | return Boneh_Durfee.boneh_durfee(pol, e, m, t, X, Y) 94 | 95 | 96 | @staticmethod 97 | def boneh_durfee(pol, modulus, mm, tt, XX, YY): 98 | """ 99 | Boneh and Durfee revisited by Herrmann and May 100 | 101 | finds a solution if: 102 | * d < N^delta 103 | * |x| < e^delta 104 | * |y| < e^0.5 105 | whenever delta < 1 - sqrt(2)/2 ~ 0.292 106 | """ 107 | 108 | # substitution (Herrman and May) 109 | PR = PolynomialRing(ZZ, names=('u', 'x', 'y',)); (u, x, y,) = PR._first_ngens(3) 110 | Q = PR.quotient(x*y + _sage_const_1 - u) # u = x*y + 1 111 | polZ = Q(pol).lift() 112 | 113 | UU = XX*YY + _sage_const_1 114 | 115 | # x-shifts 116 | gg = [] 117 | 118 | for kk in range(mm + _sage_const_1 ): 119 | for ii in range(mm - kk + _sage_const_1 ): 120 | xshift = x**ii * modulus**(mm - kk) * polZ(u, x, y)**kk 121 | gg.append(xshift) 122 | 123 | gg.sort() 124 | 125 | # x-shifts monomials 126 | monomials = [] 127 | 128 | for polynomial in gg: 129 | for monomial in polynomial.monomials(): 130 | if monomial not in monomials: 131 | monomials.append(monomial) 132 | 133 | monomials.sort() 134 | 135 | # y-shifts (selected by Herrman and May) 136 | for jj in range(_sage_const_1 , tt + _sage_const_1 ): 137 | for kk in range(floor(mm/tt) * jj, mm + _sage_const_1 ): 138 | yshift = y**jj * polZ(u, x, y)**kk * modulus**(mm - kk) 139 | yshift = Q(yshift).lift() 140 | gg.append(yshift) # substitution 141 | 142 | # y-shifts monomials 143 | for jj in range(_sage_const_1 , tt + _sage_const_1 ): 144 | for kk in range(floor(mm/tt) * jj, mm + _sage_const_1 ): 145 | monomials.append(u**kk * y**jj) 146 | 147 | # construct lattice B 148 | nn = len(monomials) 149 | 150 | BB = Matrix(ZZ, nn) 151 | 152 | for ii in range(nn): 153 | 154 | BB[ii, _sage_const_0 ] = gg[ii](_sage_const_0 , _sage_const_0 , _sage_const_0 ) 155 | 156 | for jj in range(_sage_const_1 , ii + _sage_const_1 ): 157 | if monomials[jj] in gg[ii].monomials(): 158 | BB[ii, jj] = gg[ii].monomial_coefficient(monomials[jj]) * monomials[jj](UU,XX,YY) 159 | 160 | # check if vectors are helpful 161 | if debug: 162 | helpful_vectors(BB, modulus**mm) 163 | 164 | # check if determinant is correctly bounded 165 | if debug: 166 | det = BB.det() 167 | bound = modulus**(mm*nn) 168 | if det >= bound: 169 | print "We do not have det < bound. Solutions might not be found." 170 | diff = (log(det) - log(bound)) / log(_sage_const_2 ) 171 | print "size det(L) - size e^(m*n) = ", floor(diff) 172 | else: 173 | print "det(L) < e^(m*n)" 174 | 175 | # debug: display matrix 176 | if debug: 177 | matrix_overview(BB, modulus**mm) 178 | 179 | # LLL 180 | BB = BB.LLL() 181 | 182 | # vector 1 & 2 -> polynomials 1 & 2 183 | PR = PolynomialRing(ZZ, names=('w', 'z',)); (w, z,) = PR._first_ngens(2) 184 | 185 | pol1 = pol2 = _sage_const_0 186 | for jj in range(nn): 187 | pol1 += monomials[jj](w*z+_sage_const_1 ,w,z) * BB[_sage_const_0 , jj] / monomials[jj](UU,XX,YY) 188 | pol2 += monomials[jj](w*z+_sage_const_1 ,w,z) * BB[_sage_const_1 , jj] / monomials[jj](UU,XX,YY) 189 | 190 | # resultant 191 | PR = PolynomialRing(ZZ, names=('q',)); (q,) = PR._first_ngens(1) 192 | rr = pol1.resultant(pol2) 193 | 194 | if rr.is_zero() or rr.monomials() == [_sage_const_1 ]: 195 | if debug: 196 | print "failure" 197 | return None, None 198 | 199 | rr = rr(q, q) 200 | # solutions 201 | try: 202 | soly = rr.roots()[_sage_const_0 ][_sage_const_0 ] 203 | if debug: 204 | print "found for y_0:", soly 205 | 206 | ss = pol1(q, soly) 207 | solx = ss.roots()[_sage_const_0 ][_sage_const_0 ] 208 | if debug: 209 | print "found for x_0:", solx 210 | except IndexError: 211 | return None, None 212 | return solx, soly 213 | 214 | 215 | 216 | # display stats on helpful vectors 217 | def helpful_vectors(BB, modulus): 218 | nothelpful = _sage_const_0 219 | for ii in range(BB.dimensions()[_sage_const_0 ]): 220 | if BB[ii,ii] >= modulus: 221 | nothelpful += _sage_const_1 222 | 223 | print nothelpful, "/", BB.dimensions()[_sage_const_0 ], " vectors are not helpful" 224 | 225 | # display matrix picture with 0 and X 226 | def matrix_overview(BB, bound): 227 | for ii in range(BB.dimensions()[_sage_const_0 ]): 228 | a = ('%02d ' % ii) 229 | for jj in range(BB.dimensions()[_sage_const_1 ]): 230 | a += '0' if BB[ii,jj] == _sage_const_0 else 'X' 231 | if BB.dimensions()[_sage_const_0 ] < _sage_const_60 : 232 | a += ' ' 233 | if BB[ii, ii] >= bound: 234 | a += '~' 235 | print a 236 | -------------------------------------------------------------------------------- /RSAExploits/exploits/common_factor.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for common factor exploit """ 2 | 3 | sage_present = True 4 | try: 5 | from sage.all_cmdline import * 6 | except ImportError: 7 | sage_present = False 8 | 9 | from RSAExploits.util import compute_priv_rsa_exp 10 | from fractions import gcd 11 | from RSAExploits.exploits.exploit import Exploit 12 | 13 | # Used to hopefully limit calls to sage's Primes() function 14 | primes_seen = [] 15 | 16 | class Common_Factor(Exploit): 17 | """ Class providing a run interface to the common factor exploit""" 18 | 19 | def run(self, rsadata_list, info_dict = None): 20 | """ Attempts to recover plaintext using the common factor exploit 21 | 22 | This attack works when we have 2 RSA_Data objects with moduli 23 | that share a common factor and one of the moduli is the product 24 | of two primes 25 | 26 | Args: 27 | rsadata_list: A list of RSA_Data objects with moduli to search for 28 | common factors 29 | info_dict: Not currently used 30 | 31 | Side Effects: 32 | If a modulus is factored, the corresponding RSA_Data object's 33 | private key will be computed and initialized 34 | 35 | Return: 36 | True if at least one modulus is factored 37 | """ 38 | 39 | global sage_present 40 | 41 | if not sage_present: 42 | print "Common Factor: Sage required, skipping exploit" 43 | return 44 | 45 | print "Common Factor: Running Attack..." 46 | success = False 47 | for i in range(0, len(rsadata_list) - 1): 48 | for j in range(1, len(rsadata_list)): 49 | if self.common_factor_exploit(rsadata_list[i], rsadata_list[j]): 50 | success = True 51 | 52 | if success: 53 | print "Common Factor: Success, at least one private exponent recovered" 54 | else: 55 | print "Common Factor: Failure, no private exponents recovered" 56 | return success 57 | 58 | @staticmethod 59 | def common_factor_exploit(rsadata1, rsadata2): 60 | """ Attempt to recover the private keys of the RSA_Data objects 61 | 62 | Checks if the moduli in the two rsadata objects share a common factor. 63 | If so, this function will attempt to recover the private exponent 64 | used for decryption. Returns true if at least one private exponent 65 | has been recovered. Updates the d, p, and q fields of an rsadata 66 | object if the exploit is successful 67 | """ 68 | 69 | global primes_seen 70 | 71 | ret =False 72 | 73 | # If the two moduli have no common factors 74 | p = long(gcd(rsadata1.get_n(), rsadata2.get_n())) 75 | if p == 1: 76 | return ret 77 | 78 | # Compute a second factor for each modulus 79 | q1 = long(rsadata1.get_n() / p) 80 | q2 = long(rsadata2.get_n() / p) 81 | 82 | # If the two factors of the first modulus are both prime 83 | if (p in primes_seen or p in Primes()) and (q1 in primes_seen or q1 in Primes()): 84 | 85 | # Update primes list to hopefully save time in the future 86 | primes_seen.append(p) 87 | primes_seen.append(q1) 88 | 89 | # Recover d and update fields in rsadata object 90 | d = compute_priv_rsa_exp(rsadata1.get_e(), (p, q1)) 91 | rsadata1.set_d(d) 92 | ret = True 93 | 94 | # If the two factors of the second modulus are both prime 95 | if (p in primes_seen or p in Primes()) and (q2 in primes_seen or q2 in Primes()): 96 | primes_seen.append(p) 97 | primes_seen.append(q2) 98 | d = compute_priv_rsa_exp(rsadata2.get_e(), (p, q2)) 99 | rsadata2.set_d(d) 100 | ret = True 101 | 102 | return ret 103 | 104 | -------------------------------------------------------------------------------- /RSAExploits/exploits/common_modulus.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for common modulus exploit """ 2 | 3 | from RSAExploits.exploits.exploit import Exploit 4 | from RSAExploits.util import egcd 5 | from RSAExploits.util import mod_inv 6 | from RSAExploits.util import coprime 7 | 8 | class Common_Modulus(Exploit): 9 | """ Class providing a run interface to the common modulus exploit""" 10 | 11 | def run(self, rsadata_list, info_dict = None): 12 | """ Attempts to recover plaintext using the common modulus exploit 13 | 14 | This attack works when we have 2 RSA_Data objects with 15 | the same modulus, unique and coprime public exponents, and 16 | ` ciphertexts generated from the same plaintext message. This function 17 | checks for the presence of common modulus vulnerabilities in the 18 | provided list of rsaData objects. If one is found, it is exploited. 19 | 20 | Args: 21 | rsadata_list: A list of RSA_Data objects to search for 22 | common modulus vulnerabilities 23 | info_dict: Not currently used 24 | 25 | Side Effects: 26 | If a message is recovered, the corresponding RSA_Data objects 27 | will be updated with this information 28 | 29 | Return: 30 | True if at least one message was recovered 31 | """ 32 | 33 | print "Common Modulus: Running Attack..." 34 | success = False 35 | 36 | modulus_dictionary = self.group_by_moduli_and_id(rsadata_list) 37 | ids_decrypted = {} 38 | 39 | # Iterate through each (N, idnum) tuple in the dictionary 40 | for key in modulus_dictionary: 41 | 42 | # If the plaintext corresponding to the id has 43 | # already been recovered 44 | if key[1] in ids_decrypted: 45 | continue 46 | 47 | # Attempt to exploit the common modulus vulnerability in each 48 | # unique pair of rsaData objects 49 | for i in range(0, len(modulus_dictionary[key]) - 1): 50 | 51 | if key[1] in ids_decrypted: 52 | break 53 | 54 | for j in range(1, len(modulus_dictionary[key])): 55 | 56 | if key[1] in ids_decrypted: 57 | break 58 | 59 | # If the common modulus exploit was successful 60 | if self.common_modulus_exploit(modulus_dictionary[key][i], modulus_dictionary[key][j]): 61 | success = True 62 | 63 | # Used to skip unnecessary work and update other rsaData objects 64 | # with the same idnum 65 | ids_decrypted[key[1]] = modulus_dictionary[key][i].get_m() 66 | 67 | # Update plaintext in rsaData objects with decrypted IDs 68 | for entry in rsadata_list: 69 | if entry.get_id() in ids_decrypted: 70 | entry.set_m(ids_decrypted[entry.get_id()]) 71 | 72 | if success: 73 | print "Common Modulus: Success, at least one message decrypted" 74 | else: 75 | print "Common Modulus: Failure, no messages decrypted" 76 | return success 77 | 78 | 79 | # Create a dictionary of ciphertexts keyed by the modulus 80 | # used to encrypt them, and the user provided id number 81 | @staticmethod 82 | def group_by_moduli_and_id(rsadata): 83 | """ Group the RSA_Data objects by modulus and id """ 84 | 85 | modulus_dictionary = {} 86 | 87 | for entry in rsadata: 88 | 89 | # Only consider entries with an ID number for this attack 90 | if entry.get_id() == None: 91 | continue 92 | 93 | # Only consider entries with a ciphertext 94 | if entry.get_c() == None: 95 | continue 96 | 97 | # If the (N, idnum) tuple already exists in the dictionary, just 98 | # append the new entry to the already existing list 99 | if (entry.get_n(), entry.get_id()) in modulus_dictionary: 100 | modulus_dictionary[(entry.get_n(), entry.get_id())].append(entry) 101 | 102 | # Otherwise, create a new list for the new tuple 103 | else: 104 | modulus_dictionary[(entry.get_n(), entry.get_id())] = [entry] 105 | 106 | return modulus_dictionary 107 | 108 | 109 | 110 | @staticmethod 111 | def common_modulus_exploit(rsadata1, rsadata2): 112 | """ Perform the common modulus exploit on 2 RSA_Data objects""" 113 | 114 | if rsadata1.get_n() != rsadata2.get_n(): 115 | return False 116 | if not coprime(rsadata1.get_e(), rsadata2.get_e()): 117 | return False 118 | if rsadata1.get_id() != rsadata2.get_id(): 119 | return False 120 | 121 | N = rsadata2.get_n() 122 | c1 = rsadata1.get_c() 123 | c2 = rsadata2.get_c() 124 | 125 | # Because gcd(e1, e2) = 1, we know that there must exist two integers 126 | # X, Y such that Xe1 + Ye2 = 1. The values of X and Y can be computed 127 | # using the Extended Euclidean algorithm 128 | g,x,y = egcd(rsadata1.get_e(), rsadata2.get_e()) 129 | 130 | # If either x or y is negative, we need to compute the multiplicative 131 | # modular inverse of the corresponding ciphertext and negate x/y. 132 | # c1 ^ -a = c1* ^ a where c1* is the multiplicative modular inverse of c1. 133 | if x < 0: 134 | x = -x 135 | c1 = mod_inv(c1, N) 136 | 137 | if y < 0: 138 | y = -y 139 | c2 = mod_inv(c2, N) 140 | 141 | # Compute (c1^ x * c2 ^ y) mod N 142 | plaintext = (pow(c1, x, N) * pow(c2, y, N)) % N 143 | rsadata1.set_m(plaintext) 144 | rsadata2.set_m(plaintext) 145 | return True 146 | 147 | 148 | 149 | -------------------------------------------------------------------------------- /RSAExploits/exploits/ecm.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for elliptic curve factorization """ 2 | 3 | sage_present = True 4 | try: 5 | from sage.all_cmdline import * 6 | except ImportError: 7 | sage_present = False 8 | 9 | from RSAExploits.util import compute_priv_rsa_exp 10 | from RSAExploits.exploits.exploit import Exploit 11 | 12 | class Ecm(Exploit): 13 | """ Class providing a run interface to sage's ecm.factor function""" 14 | 15 | def run(self, rsadata_list, info_dict): 16 | """ Factors moduli using elliptic curve factorization 17 | 18 | This is currently the third fastest known general purpose 19 | factoring algorithm. However, its runtime is dominated by 20 | the size of the smallest factor. Therefore it is particularly 21 | well suited to finding the factors of moduli that contain a small 22 | prime factor 23 | 24 | Args: 25 | rsadata_list: A list of RSA_Data objects with moduli to factor 26 | info_dict: Not currently used in this exploit 27 | 28 | Side Effects: 29 | If a modulus is factored, the corresponding RSA_Data object's 30 | private key will be computed and initialized 31 | 32 | Return: 33 | True if at least one modulus was factored 34 | """ 35 | 36 | global sage_present 37 | 38 | if not sage_present: 39 | print "ECM Factoring: Sage required, skipping exploit" 40 | return 41 | 42 | print ("ECM Factoring: Running Attack...") 43 | success = False 44 | 45 | for rsadata in rsadata_list: 46 | roots = ecm.factor(rsadata.get_n()) 47 | if roots != None: 48 | rsadata.set_d(compute_priv_rsa_exp(rsadata.get_e(), roots)) 49 | success = True 50 | 51 | if success: 52 | print("ECM Factoring: Success, roots found, assigned in rsadata.") 53 | else: 54 | print("ECM Factoring: Failure, roots not found.") 55 | return success 56 | -------------------------------------------------------------------------------- /RSAExploits/exploits/exploit.py: -------------------------------------------------------------------------------- 1 | class Exploit(object): 2 | def __init__(self): 3 | pass 4 | def run(self, rsadata_list, info_dict = None): 5 | pass 6 | -------------------------------------------------------------------------------- /RSAExploits/exploits/fermat.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for fermat factorization """ 2 | 3 | from sympy import integer_nthroot 4 | from RSAExploits.exploits.exploit import Exploit 5 | from RSAExploits.util import compute_priv_rsa_exp 6 | 7 | class Fermat(Exploit): 8 | """ Class providing a run interface to a fermat facorization function""" 9 | 10 | def run(self, rsadata_list, info_dict = None): 11 | """ Factors moduli using fermat factorization 12 | 13 | This algorithm is best suited for finding prime factors when 14 | the difference between them is small 15 | 16 | Args: 17 | rsadata_list: A list of RSA_Data objects with moduli to factor 18 | info_dict: User can specify a bound on the runtime using the 19 | key "Fermat" and specifying a number 20 | 21 | Side Effects: 22 | If a modulus is factored, the corresponding RSA_Data object's 23 | private key will be computed and initialized 24 | 25 | Return: 26 | True if at least one modulus was factored 27 | """ 28 | 29 | print ("Fermat: Running Attack...") 30 | success = False 31 | limit = None 32 | if info_dict != None and "Fermat" in info_dict: 33 | limit = info_dict["Fermat"] 34 | 35 | for rsadata in rsadata_list: 36 | if limit != None: 37 | roots = Fermat.fermat_factor(rsadata.get_n(), limit) 38 | else: 39 | roots = Fermat.fermat_factor(rsadata.get_n()) 40 | 41 | if roots != None: 42 | rsadata.set_d(compute_priv_rsa_exp(rsadata.get_e(), roots)) 43 | success = True 44 | 45 | if success: 46 | print("Fermat: Success, roots found, assigned in rsadata.") 47 | else: 48 | print("Fermat: Failure, roots not found.") 49 | return success 50 | 51 | 52 | @staticmethod 53 | def fermat_factor(n, limit = 1000000): 54 | 55 | """ Attempt to factor n using fermat factorization 56 | 57 | Args: 58 | n: The modulus to factor 59 | limit: Limits the runtime of this function 60 | 61 | Assumptions: 62 | n is the product of 2 primes p and q 63 | 64 | Return: 65 | The two prime factors p and q 66 | """ 67 | 68 | a, exact = integer_nthroot(n, 2) 69 | _max = a + limit 70 | while a < _max: 71 | b2 = a*a - n 72 | if b2 >= 0: 73 | b, exact = integer_nthroot(b2, 2) 74 | if b != None: 75 | if b*b == b2: 76 | break 77 | a += 1 78 | if a < _max: 79 | p = a+b 80 | q = a-b 81 | return p, q 82 | else: 83 | return None 84 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /RSAExploits/exploits/franklin_reiter.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for the Franklin Reiter related message attack 2 | 3 | Much of the code in this file is derived from the writeup 4 | located at: ahack.ru/write-ups/ructf-quals-14.htm 5 | """ 6 | sage_present = True 7 | try: 8 | from sage.all_cmdline import * 9 | except ImportError: 10 | sage_present = False 11 | 12 | from RSAExploits.exploits.exploit import Exploit 13 | 14 | 15 | class Franklin_Reiter(Exploit): 16 | """ Class providing a run interface to Franklin Reiter's attack """ 17 | 18 | def run(self, rsadata_list, info_dict = None): 19 | """ Recovers plaintext message using Franklin-Reiter's attack 20 | 21 | This attack should work as long as the provided parameters 22 | are correct. However, if the public exponent e is not small, 23 | it may run for a long time. 24 | 25 | Args: 26 | rsadata_list: A list of RSA_Data objects on which to attempt the 27 | boneh durfee exploit 28 | info_dict: Specifies the relationship between the two plaintext 29 | messages as a polynomial under the key "Franklin_Reiter" 30 | 31 | Side Effects: 32 | If a message is recovered, the corresponding field in the 33 | RSA_Data objects will be set 34 | 35 | Return: 36 | True if the attack completes 37 | """ 38 | 39 | global sage_present 40 | success = False 41 | 42 | if not sage_present: 43 | print "Franklin Reiter: Sage required, skipping exploit" 44 | return success 45 | 46 | if len(rsadata_list) != 2: 47 | print "Franklin Reiter: Exactly 2 RSA_Data objects must be provided" 48 | return success 49 | 50 | if info_dict == None or "Franklin_Reiter" not in info_dict: 51 | print "Franklin Reiter: Polynomial relationship between messages required" 52 | return success 53 | 54 | print ("Franklin Reiter: Running Attack...") 55 | success = True 56 | n = rsadata_list[0].get_n() 57 | e = rsadata_list[0].get_e() 58 | c1 = rsadata_list[0].get_c() 59 | c2 = rsadata_list[1].get_c() 60 | poly = info_dict["Franklin_Reiter"] 61 | msg = Franklin_Reiter.franklin_reiter(n, e, c1, c2, poly) 62 | rsadata_list[0].set_m(msg) 63 | rsadata_list[1].set_m(msg) 64 | print ("Franklin Reiter: Message recovered") 65 | return success 66 | 67 | @staticmethod 68 | def franklin_reiter(n, e, c1, c2, poly): 69 | """ Recover the plaintext message using franklin-reiter attack """ 70 | x = PolynomialRing(ZZ.quo(n*ZZ), 'x').gen() 71 | poly1 = poly**e - c1 72 | poly2 = x**e-c2 73 | coefs = Franklin_Reiter.poly_gcd(poly1, poly2) 74 | msg = int(-pow(coefs[1], -1, n) * coefs[0]) 75 | return msg 76 | 77 | @staticmethod 78 | def poly_gcd(poly1, poly2): 79 | """ Compute the gcd of two polynomials """ 80 | a = poly1 81 | b = poly2 82 | i = 0 83 | 84 | while True: 85 | r = a % b 86 | if r == 0: 87 | c = rp.coeffs() 88 | return c 89 | rp = r 90 | a, b = b, r 91 | i += 1 92 | -------------------------------------------------------------------------------- /RSAExploits/exploits/hastad.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for simple hastad broadcast exploit """ 2 | 3 | from RSAExploits import util 4 | from RSAExploits.exploits.exploit import Exploit 5 | 6 | class Hastad(Exploit): 7 | """ Class providing a run interface to hastad broadcast exploit""" 8 | 9 | def run(self, rsadata_list, info_dict = None): 10 | """ Attempts to recover plaintext using Hastad's broadcast attack 11 | 12 | This attack works when we have a list of RSA_Data objects such 13 | that the length of the list is greater than or equal to e, 14 | unique and coprime moduli are used for each encryption, and the 15 | same plaintext message is encrypted to generate all ciphertexts. 16 | 17 | Args: 18 | rsadata_list: A list of RSA_Data objects on which to attempt 19 | Hastad's exploit 20 | info_dict: Not currently used 21 | 22 | Assumptions: 23 | None of the RSA_Data objects in rsadata_list have the same 24 | public exponent e, same id number, and same modulus N. This 25 | should be prevented by calling the remove_duplicates() function 26 | in RSA_Data.py 27 | 28 | Side Effects: 29 | If a message is recovered, the corresponding RSA_Data objects 30 | will be updated with this information 31 | 32 | Return: 33 | True if at least one message was recovered 34 | """ 35 | 36 | print ("Hastad: Running Attack...") 37 | success = False 38 | e_id_dict = self.group_by_e_and_id(rsadata_list) 39 | for group in e_id_dict: 40 | msg = self.hastad_broadcast_exploit(e_id_dict[group]) 41 | if msg != None: 42 | success = True 43 | for rsadata in e_id_dict[group]: 44 | rsadata.set_m(msg) 45 | if success: 46 | print("Hastad: Success, message found.") 47 | else: 48 | print("Hastad: Failure, message not found.") 49 | return success 50 | 51 | @staticmethod 52 | def group_by_e_and_id(rsadata_list): 53 | """ Group the RSA_Data objects by public exponent and id """ 54 | 55 | e_id_dict = {} 56 | 57 | for rsadata in rsadata_list: 58 | 59 | # Only consider entries with an ID number 60 | if rsadata.get_id() == None: 61 | continue 62 | 63 | # Only consider entries with a ciphertext 64 | if rsadata.get_c() == None: 65 | continue 66 | 67 | # If the (e, idnum) tuple already exists in the dictionary, just 68 | # append the new entry to the already existing list 69 | if (rsadata.get_e(), rsadata.get_id()) in e_id_dict: 70 | e_id_dict[(rsadata.get_e(), rsadata.get_id())].append(rsadata) 71 | 72 | # Otherwise, create a new list for the new tuple 73 | else: 74 | e_id_dict[(rsadata.get_e(), rsadata.get_id())] = [rsadata] 75 | 76 | return e_id_dict 77 | 78 | 79 | @staticmethod 80 | def hastad_broadcast_exploit(rsadata_list): 81 | """ Recover the plaintext message using chinese remainder theorem """ 82 | 83 | e = rsadata_list[0].get_e() 84 | if len(rsadata_list) < e: 85 | return None 86 | 87 | ns = [] 88 | cs = [] 89 | 90 | for index in range(e): 91 | ns.append(rsadata_list[index].get_n()) 92 | cs.append(rsadata_list[index].get_c()) 93 | 94 | s = util.crt(ns, cs) 95 | pt = util.int_nthroot(s, e) 96 | if pt is not None: 97 | return pt 98 | else: 99 | return None 100 | 101 | 102 | -------------------------------------------------------------------------------- /RSAExploits/exploits/qsieve.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for quadratic sieve factorization """ 2 | 3 | sage_present = True 4 | try: 5 | from sage.all_cmdline import * 6 | except ImportError: 7 | sage_present = False 8 | from RSAExploits.util import compute_priv_rsa_exp 9 | from RSAExploits.exploits.exploit import Exploit 10 | 11 | class Qsieve(Exploit): 12 | 13 | def run(self, rsadata_list, info_dict = None): 14 | """ Factors moduli using quadratic sieve factorization 15 | 16 | This is currently the 2nd fastest known general purpose 17 | factoring algorithm 18 | 19 | Args: 20 | rsadata_list: A list of RSA_Data objects with moduli to factor 21 | info_dict: Not currently used in this exploit 22 | 23 | Side Effects: 24 | If a modulus is factored, the corresponding RSA_Data object's 25 | private key will be computed and initialized 26 | 27 | Return: 28 | True if at least one modulus was factored 29 | """ 30 | 31 | global sage_present 32 | success = False 33 | 34 | if not sage_present: 35 | print "Qsieve Factoring: Sage required, skipping exploit" 36 | return success 37 | 38 | print ("Qsieve Factoring: Running Attack...") 39 | 40 | for rsadata in rsadata_list: 41 | roots = qsieve(rsadata.get_n()) 42 | if roots != None: 43 | rsadata.set_d(compute_priv_rsa_exp(rsadata.get_e(), roots[0])) 44 | success = True 45 | 46 | if success: 47 | print("Qsieve Factoring: Success, roots found, assigned in rsadata.") 48 | else: 49 | print("Qsieve Factoring: Failure, roots not found.") 50 | 51 | return success 52 | -------------------------------------------------------------------------------- /RSAExploits/exploits/wiener.py: -------------------------------------------------------------------------------- 1 | """ Class defintion for Wiener's attack """ 2 | 3 | import re 4 | import math 5 | from sympy.solvers import solve 6 | from sympy.core.numbers import Integer 7 | from sympy import Symbol 8 | from RSAExploits.exploits.exploit import Exploit 9 | from RSAExploits.util import compute_priv_rsa_exp 10 | 11 | class Wiener(Exploit): 12 | """ Class providing a run interface to Wiener's attack """ 13 | 14 | def run(self, rsadata_list, info_dict = None): 15 | """ Attempts to recover private exponent using Wiener's attack 16 | 17 | This attack works when the private key d is < N ^ 0.25. 18 | 19 | Args: 20 | rsadata_list: A list of RSA_Data objects on which to attempt 21 | Wiener's attack 22 | info_dict: Not currently used 23 | 24 | Side Effects: 25 | If a private key is recovered, the corresponding field in the 26 | RSA_Data object will be set 27 | 28 | Return: 29 | True if at least one private key is recovered 30 | """ 31 | 32 | print ("Wiener: Running Attack...") 33 | success = False 34 | 35 | for rsadata in rsadata_list: 36 | roots = self.wiener_attack(rsadata.get_n(), rsadata.get_e()) 37 | 38 | # If wiener's attack was successful for the current rsaData object 39 | if roots != None: 40 | rsadata.set_d(compute_priv_rsa_exp(rsadata.get_e(), roots)) 41 | success = True 42 | 43 | if success: 44 | print("Wiener: Success, roots found, assigned in rsadata.") 45 | return True 46 | else: 47 | print("Wiener: Failure, roots not found.") 48 | return False 49 | 50 | @staticmethod 51 | def conFraction(fraction): 52 | (a,b) = fraction 53 | v=[] 54 | v.append(0) 55 | while not a == 1: 56 | (x,y) = fraction 57 | try: 58 | r = y / x 59 | a = y % x 60 | except ZeroDivisionError as details: 61 | print ("Exception occured:",details) 62 | print("Continuing to next RSA data...") 63 | return None 64 | b=x 65 | fraction = (a,b) 66 | v.append(r) 67 | v.append(b) 68 | return v 69 | 70 | @staticmethod 71 | def makeIndexedConvergent(sequence, index): 72 | (a,b)=(1,sequence[index]) 73 | while index>0: 74 | index-=1 75 | (a,b)=(b,sequence[index]*b+a) 76 | return (b,a) 77 | 78 | @staticmethod 79 | def makeConvergents(sequence): 80 | r=[] 81 | for i in xrange(0,len(sequence)): 82 | r.append(Wiener.makeIndexedConvergent(sequence,i)) 83 | return r 84 | 85 | @staticmethod 86 | def wiener_attack(N,e): 87 | v = Wiener.conFraction((e,N)) 88 | if v is None: 89 | return None 90 | conv = Wiener.makeConvergents(v) 91 | for frac in conv: 92 | (k,d)=frac 93 | if k == 0: 94 | continue 95 | phiN=((e*d)-1)/k 96 | if ((pow(N-phiN+1, 2) - 4*N) <= 0 ): # (b^2 -4ac) <= 0 97 | continue 98 | 99 | # solving equation (a**2 + b*x + c) 100 | x = Symbol('x', integer=True) 101 | roots = [] 102 | roots = solve(x**2 -(N-phiN+1)*x + N, x, rational=False) 103 | 104 | if len(roots) == 2: 105 | if type(roots[0]) is Integer and type(roots[0]) is Integer: 106 | 107 | if(roots[0]*roots[1] == N): 108 | return roots 109 | 110 | 111 | -------------------------------------------------------------------------------- /RSAExploits/rsa_cracker.py: -------------------------------------------------------------------------------- 1 | """ RSA_Cracker: Cracks RSA key set by using various attacks """ 2 | 3 | from RSAExploits.exploits.common_modulus import Common_Modulus 4 | from RSAExploits.exploits.wiener import Wiener 5 | from RSAExploits.exploits.boneh_durfee import Boneh_Durfee 6 | from RSAExploits.exploits.hastad import Hastad 7 | from RSAExploits.exploits.fermat import Fermat 8 | from RSAExploits.exploits.common_factor import Common_Factor 9 | from RSAExploits.exploits.franklin_reiter import Franklin_Reiter 10 | 11 | __Exploit_Classes__ = [] 12 | 13 | def init(): 14 | """ Populate the Exploit_Classes list with exploits to run """ 15 | global __Exploit_Classes__ 16 | 17 | __Exploit_Classes__ = [] 18 | __Exploit_Classes__.append(Franklin_Reiter()) 19 | __Exploit_Classes__.append(Common_Modulus()) 20 | __Exploit_Classes__.append(Common_Factor()) 21 | __Exploit_Classes__.append(Wiener()) 22 | __Exploit_Classes__.append(Boneh_Durfee()) 23 | __Exploit_Classes__.append(Hastad()) 24 | __Exploit_Classes__.append(Fermat()) 25 | 26 | def attack(rsadata_list, info_dict = None, break_on_success = True): 27 | """ Run all of the exploits in the list on the provided rsadata objects 28 | 29 | Args: 30 | rsadata_list: A list of RSA_Data objects to exploit 31 | info_dict: Dictionary providing extra info to certain exploits 32 | break_on_success: Stop after first successful exploit if true 33 | """ 34 | 35 | success = False 36 | for exploit in __Exploit_Classes__: 37 | if exploit.run(rsadata_list, info_dict): 38 | success = True 39 | if success and break_on_success: 40 | return success 41 | 42 | -------------------------------------------------------------------------------- /RSAExploits/rsa_data.py: -------------------------------------------------------------------------------- 1 | """ The class defintion for RSAData """ 2 | 3 | from Crypto.PublicKey import RSA 4 | import fractions 5 | import random 6 | 7 | class RSAData: 8 | """ Conttains all RSA information used by currently implemented exploits 9 | 10 | RSAData is built on top of two other classes. The first is the RSAObj 11 | taken from the pycrypto library. This class stores the RSA modulus n, 12 | public exponent e, private exponent d, and prime factors p and q. We 13 | currently leverage the decrypt method from RSAObj. The second class is 14 | TextData which currently holds the ciphertext/plaintext 15 | information. 16 | 17 | Unfortunately the underlying implementation of RSAData is not 18 | completely hidden from the user given the way the __init__ function 19 | receives parameters. However, from a user's perspective, RSAData 20 | should be a container that has the following fields (along with an 21 | encrypt and decrypt function): 22 | 23 | n: RSA modulus 24 | e: Public exponent 25 | d: Private exponent 26 | p: First prime factor 27 | q: Second prime factor 28 | c: Ciphertext 29 | m: Plaintext 30 | id_num: Used to specify which ciphertexts are generated from the 31 | same plaintext 32 | """ 33 | 34 | def __init__(self, rsaobj, txt=None): 35 | """ Initialize the 2 classes using the provided parameters """ 36 | self.rsaobj = rsaobj 37 | self.txt = txt 38 | 39 | def encrypt(self): 40 | """ Encrypt the current plaintext and assign it to the ciphertext """ 41 | if self.get_m() != None: 42 | c_text = self.rsaobj.encrypt(long(self.get_m())) 43 | self.set_c(c_text) 44 | return True 45 | else: 46 | return False 47 | 48 | def decrypt(self): 49 | """ Encrypt the current ciphertext and assign it to the plaintext """ 50 | if self.get_c() != None and self.rsaobj.has_private(): 51 | m_text = self.rsaobj.decrypt(self.get_c()) 52 | self.set_m(m_text) 53 | return True 54 | else: 55 | return False 56 | 57 | def get_e(self): 58 | """ Return the public exponent """ 59 | if hasattr(self.rsaobj, "e"): 60 | return self.rsaobj.e 61 | else: 62 | return None 63 | 64 | def set_e(self, key_e): 65 | """ Set the public exponent """ 66 | self.rsaobj = rsa_obj(self.get_n(), key_e, self.get_d(), \ 67 | self.get_p(), self.get_q()) 68 | 69 | def get_p(self): 70 | """ Return the first prime factor """ 71 | if hasattr(self.rsaobj, "p"): 72 | return self.rsaobj.p 73 | else: 74 | return None 75 | 76 | def set_p(self, key_p): 77 | """ Set the first prime factor """ 78 | self.rsaobj = rsa_obj(self.get_n(), self.get_e(), \ 79 | self.get_d(), key_p, self.get_q()) 80 | 81 | def get_q(self): 82 | """ Return the second prime factor """ 83 | if hasattr(self.rsaobj, "q"): 84 | return self.rsaobj.q 85 | else: 86 | return None 87 | 88 | def set_q(self, key_q): 89 | """ Set the second prime factor """ 90 | self.rsaobj = rsa_obj(self.get_n(), self.get_e(), \ 91 | self.get_d(), self.get_p(), key_q) 92 | 93 | def get_n(self): 94 | """ Return the modulus """ 95 | if hasattr(self.rsaobj, "n"): 96 | return self.rsaobj.n 97 | else: 98 | return None 99 | 100 | def set_n(self, key_n): 101 | """ Set the modulus """ 102 | self.rsaobj = rsa_obj(key_n, self.get_e(), self.get_d(), \ 103 | self.get_p(), self.get_q()) 104 | 105 | def get_d(self): 106 | """ Return the private exponent """ 107 | if hasattr(self.rsaobj, "d"): 108 | return self.rsaobj.d 109 | else: 110 | return None 111 | 112 | def set_d(self, key_d): 113 | """ Set the private exponent """ 114 | self.rsaobj = rsa_obj(self.get_n(), self.get_e(), key_d, \ 115 | self.get_p(), self.get_q()) 116 | 117 | def get_c(self): 118 | """ Return the ciphertext """ 119 | if self.txt == None: 120 | return None 121 | return self.txt.c 122 | 123 | def set_c(self, c_text): 124 | """ Set the ciphertext """ 125 | if self.txt == None: 126 | self.txt = TextData(c=c_text) 127 | return 128 | 129 | self.txt = TextData(c_text=c_text, idnum=self.get_id(), \ 130 | m_text=self.get_m()) 131 | 132 | def get_m(self): 133 | """ Return the plaintext """ 134 | if self.txt == None: 135 | return None 136 | return self.txt.m 137 | 138 | def set_m(self, m_text): 139 | """ Set the plaintext """ 140 | if self.txt == None: 141 | self.txt = TextData(m_text=m_text) 142 | return 143 | self.txt = TextData(c_text=self.get_c(), idnum=self.get_id(), \ 144 | m_text=m_text) 145 | 146 | def get_id(self): 147 | """ Return the id """ 148 | if self.txt == None: 149 | return None 150 | return self.txt.idnum 151 | 152 | def set_id(self, idnum): 153 | """ Set the id """ 154 | if self.txt == None: 155 | self.txt = TextData(idnum=idnum) 156 | return 157 | self.txt = TextData(c_text=self.get_c(), idnum=idnum, \ 158 | m_text=self.get_m()) 159 | 160 | 161 | def rsa_obj(key_n, key_e, key_d=None, key_p=None, key_q=None): 162 | """ Wrapper for the RSAObj constructor 163 | 164 | The main reason for its existance is to compute the 165 | prime factors if the private exponent d is being set. 166 | In testing, the construct method threw exceptions because 167 | it wasn't able to compute the prime factors. The 168 | recover_prime_factors function seems work better. 169 | """ 170 | if key_n != None and key_e != None and key_d == None \ 171 | and key_p == None and key_q == None: 172 | key = RSA.construct((key_n, key_e)) 173 | elif key_n != None and key_e != None and key_d != None \ 174 | and key_p == None and key_q == None: 175 | key_p, key_q = recover_prime_factors(key_n, key_e, key_d) 176 | key = RSA.construct((key_n, key_e, key_d, long(key_p), long(key_q))) 177 | elif key_n != None and key_e != None and key_d != None \ 178 | and key_p != None and key_q == None: 179 | key = RSA.construct((key_n, key_e, key_d, key_p, key_n/key_p)) 180 | elif key_n != None and key_e != None and key_d != None \ 181 | and key_p != None and key_q != None: 182 | key = RSA.construct((key_n, key_e, key_d, key_p, key_q)) 183 | return key 184 | 185 | class TextData: 186 | """ At the moment, a container for the cipher/plaintext information """ 187 | def __init__(self, c_text=None, idnum=None, m_text=None): 188 | """ Standard initializer """ 189 | self.c = c_text 190 | self.idnum = idnum 191 | self.m = m_text 192 | 193 | 194 | def fail_function(): 195 | """ Basic fail function for recover_prime_factors() """ 196 | print("Prime factors not found") 197 | 198 | def output_primes(a_num, n_num): 199 | """ Returns the recovered prime factors """ 200 | p_num = fractions.gcd(a_num, n_num) 201 | q_num = int(n_num / p_num) 202 | if p_num > q_num: 203 | p_num, q_num = q_num, p_num 204 | return p_num, q_num 205 | 206 | 207 | def recover_prime_factors(key_n, key_e, key_d): 208 | """The following algorithm recovers the prime factor 209 | s of a modulus, given the public and private 210 | exponents. 211 | Function call: RecoverPrimeFactors(n, e, d) 212 | Input: n: modulus 213 | e: public exponent 214 | d: private exponent 215 | Output: (p, q): prime factors of modulus""" 216 | 217 | k_num = key_d * key_e - 1 218 | if k_num % 2 == 1: 219 | fail_function() 220 | return 0, 0 221 | else: 222 | t_num = 0 223 | r_num = k_num 224 | while(r_num % 2 == 0): 225 | r_num = int(r_num / 2) 226 | t_num += 1 227 | for i_num in range(1, 101): 228 | g_num = random.randint(0, key_n) # random g in [0, n-1] 229 | y_num = pow(g_num, r_num, key_n) 230 | if y_num == 1 or y_num == key_n - 1: 231 | continue 232 | else: 233 | for j_num in range(1, t_num): # j \in [1, t-1] 234 | x_num = pow(y_num, 2, key_n) 235 | if x_num == 1: 236 | key_p, key_q = output_primes(y_num - 1, key_n) 237 | return key_p, key_q 238 | elif x_num == key_n - 1: 239 | continue 240 | y_num = x_num 241 | x_num = pow(y_num, 2, key_n) 242 | if x_num == 1: 243 | key_p, key_q = output_primes(y_num - 1, key_n) 244 | return key_p, key_q 245 | 246 | -------------------------------------------------------------------------------- /RSAExploits/util.py: -------------------------------------------------------------------------------- 1 | """ Contains functions common to many exploits """ 2 | 3 | from sympy import integer_nthroot 4 | from fractions import gcd 5 | from Crypto.Util.asn1 import DerSequence 6 | from Crypto.PublicKey import RSA 7 | from binascii import a2b_base64 8 | 9 | def num2string(hexnum): 10 | """ Interprets a hex number as ASCII """ 11 | if hexnum == None: 12 | return None 13 | else: 14 | string = hex(hexnum)[2:-1] 15 | if len(string) % 2 != 0: 16 | string = '0' + string 17 | return string.decode('hex') 18 | 19 | def compute_priv_rsa_exp(key_e, prime_factors_list): 20 | """ Compute RSA private key 21 | 22 | Computes an RSA private key given a public exponent 23 | e and a list of the primes factors of the modulus 24 | """ 25 | totient = totient_from_primes(prime_factors_list) 26 | key_d = long(int(mod_inv(key_e, totient))) 27 | return key_d 28 | 29 | def totient_from_primes(prime_factors_list): 30 | """ Compute euler's phi function from prime factors 31 | 32 | Computes the euler's phi function of the number that is the 33 | product of the provided list of primes 34 | """ 35 | totient = 1 36 | for factor in prime_factors_list: 37 | totient = totient * (factor - 1) 38 | return totient 39 | 40 | def coprime(num1, num2): 41 | """ Returns True if n1 and n2 are coprime and False otherwise """ 42 | return gcd(num1, num2) == 1 43 | 44 | def is_printable(str1, codec='utf8'): 45 | """ Returns True if s can be decoded using the specified codec """ 46 | try: 47 | str1.decode(codec) 48 | except UnicodeDecodeError: 49 | return False 50 | else: 51 | return True 52 | 53 | def int_nthroot(num, nthroot): 54 | """ Returns the nth root of r if it is an integer and None otherwise """ 55 | (root, exact) = integer_nthroot(num, nthroot) 56 | if exact: 57 | return root 58 | else: 59 | return None 60 | 61 | def crt(divs, rems): 62 | ''' 63 | Chinese Remainder Theorem 64 | ds: array of dividers 65 | rs: array of remainders 66 | Return the number s such that s mod ds[i] = rs[i] 67 | ''' 68 | length = len(divs) 69 | if not length == len(rems): 70 | print "The lengths of the two must be the same" 71 | return None 72 | 73 | p_num = i_num = prod = 1 74 | s_num = 0 75 | for i_num in range(length): 76 | prod *= divs[i_num] 77 | for i_num in range(length): 78 | p_num = prod / divs[i_num] 79 | s_num += rems[i_num] * mod_inv(p_num, divs[i_num]) * p_num 80 | return s_num % prod 81 | 82 | def mod_inv(a_num, mod): 83 | ''' 84 | Return r such that a*r mod m = 1 85 | ''' 86 | g_num, x_num, y_num = egcd(a_num, mod) 87 | if g_num != 1: 88 | print("no inverse") 89 | return None 90 | else: 91 | return x_num % mod 92 | 93 | def egcd(a_num, b_num): 94 | ''' 95 | Extended Euclidean gcd. Return g, x, y such that ax+by=g=gcd(a, b) 96 | ''' 97 | if a_num == 0: 98 | return (b_num, 0, 1) 99 | else: 100 | g_num, y_num, x_num = egcd(b_num % a_num, a_num) 101 | return (g_num, x_num-(b_num//a_num)*y_num, y_num) 102 | 103 | def extract_key_from_pem(pemfile): 104 | """ Returns extracted key from a pem file """ 105 | try: 106 | f_desc = open(pemfile, 'r') 107 | except IOError: 108 | print "Error: PEM file not found" 109 | else: 110 | pem = f_desc.read() 111 | 112 | lines = pem.replace(" ", '').split() 113 | der = a2b_base64(''.join(lines[1:-1])) 114 | 115 | # Extract subjectPublicKeyInfo field from X.509 certificate(see RFC3280) 116 | cert = DerSequence() 117 | cert.decode(der) 118 | tbs_certificate = DerSequence() 119 | tbs_certificate.decode(cert[0]) 120 | subject_public_key_info = tbs_certificate[6] 121 | 122 | # Initialize RSA key 123 | rsa_key = RSA.importKey(subject_public_key_info) 124 | 125 | f_desc.close() 126 | return rsa_key 127 | -------------------------------------------------------------------------------- /dist/RSAExploits-0.1.0.tar.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vik001ind/RSAExploits/3c54f0a5e7227a2ce3de801fc8bab74b1efe2e78/dist/RSAExploits-0.1.0.tar.gz -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from distutils.core import setup 2 | 3 | setup( 4 | name='RSAExploits', 5 | version='0.1.0', 6 | author='Kumar Vikramjeet, Eric Azebu', 7 | author_email='', 8 | packages=['RSAExploits', 'RSAExploits.exploits'], 9 | license='LICENSE.txt', 10 | description='Collection of RSA exploits', 11 | long_description=open('README.md').read(), 12 | setup_requires=["pycrypto >= 2.4.1","sympy >= 0.7.1.rc1",], 13 | install_requires=[ 14 | "pycrypto >= 2.4.1", 15 | "sympy >= 0.7.1", 16 | ], 17 | ) 18 | -------------------------------------------------------------------------------- /test_files/boneh_durfee_test.py: -------------------------------------------------------------------------------- 1 | from RSAExploits import rsa_cracker 2 | from RSAExploits import RSAData 3 | from RSAExploits import rsa_obj 4 | from RSAExploits import TextData 5 | from RSAExploits import num2string 6 | from RSAExploits import Boneh_Durfee 7 | import sys 8 | 9 | sys.setrecursionlimit(10000) 10 | 11 | # Parse and store all of the ciphertexts provided by the file 12 | rsadata_list = [] 13 | c = None 14 | e = None 15 | N = None 16 | f = open("wiener_list.txt", 'r') 17 | for line in f: 18 | line = line.strip("{}").split(":") 19 | N = long(line[0], 0) 20 | e = long(line[1], 0) 21 | c = long(line[2].split("}")[0], 0) 22 | rsadata_list.append(RSAData(rsa_obj(N, e), TextData(c))) 23 | f.close() 24 | 25 | # Run the exploit by specifying it 26 | if Boneh_Durfee().run(rsadata_list): 27 | for rsadata in rsadata_list: 28 | if rsadata.get_d() != None and rsadata.get_c() != 0: 29 | rsadata.decrypt() 30 | print num2string(rsadata.get_m()) 31 | 32 | print "----------------------------------------------------" 33 | 34 | # Run list of exploits 35 | # Not done because Wiener will solve it first 36 | -------------------------------------------------------------------------------- /test_files/common_factor_test.py: -------------------------------------------------------------------------------- 1 | from RSAExploits import rsa_cracker 2 | from RSAExploits import RSAData 3 | from RSAExploits import rsa_obj 4 | from RSAExploits import TextData 5 | from RSAExploits import num2string 6 | from RSAExploits import Common_Factor 7 | import sys 8 | 9 | sys.setrecursionlimit(10000) 10 | 11 | # Parse and store all of the ciphertexts provided by the file 12 | rsadata_list = [] 13 | c = None 14 | e = None 15 | N = None 16 | f = open("common_factor_test.txt", 'r') 17 | for line in f: 18 | if line.startswith("ciphertext"): 19 | c = long(line.split(" ")[2], 0) 20 | elif line.startswith("e"): 21 | e = long(line.split(" ")[2]) 22 | elif line.startswith("N"): 23 | N = long(line.split(" ")[2], 0) 24 | rsadata_list.append(RSAData(rsa_obj(N, e), TextData(c))) 25 | f.close() 26 | 27 | # Run the exploit by specifying it 28 | if Common_Factor().run(rsadata_list): 29 | for rsadata in rsadata_list: 30 | if rsadata.get_d() != None and rsadata.get_c() != 0: 31 | rsadata.decrypt() 32 | print num2string(rsadata.get_m()) 33 | 34 | print "----------------------------------------------------" 35 | 36 | # Run list of exploits 37 | rsa_cracker.init() 38 | if rsa_cracker.attack(rsadata_list): 39 | for rsadata in rsadata_list: 40 | if rsadata.get_d() != None and rsadata.get_c() != 0: 41 | rsadata.decrypt() 42 | print num2string(rsadata.get_m()) 43 | -------------------------------------------------------------------------------- /test_files/common_factor_test.txt: -------------------------------------------------------------------------------- 1 | ciphertext = 0x0 2 | e = 65537 3 | N = 0x9bd81d1485b39495b0506728527602e9d930a0d73a9e3df7439b056a218a6c4f6c761d651edae9b3441d5ef60b1d625c081906d87b9db8fa79d855efa263c7e235d6e013c94b8738c016f0908243257768678440ba99b8762993937d883b7357381a007bf29800e6066f531027f51fd92c16e67200da385adf744260206bb73bL 4 | 5 | ciphertext = 0x0 6 | e = 65537 7 | N = 0xb1d89966b4e656cd32f55231292d1157a38de0e05d1f12035512da25610d4b694f20c1436f14521494656f4262afd25caf9247a9d53acfdefbae0b200b0c0aa6f6d0675ad296f51207ce515cd15c43b44e8ab7df4f7052ec251ed27108a521cc7111c3dcb0426bedd38656d85b4656b83ae9dcec1dae31af3b6868c802fd7737L 8 | 9 | ciphertext = 0x0 10 | e = 65537 11 | N = 0xad6597032a2b47677aa5faa38998d9af4dee9b075777e0a4504f2d408a0294b232748da729f2daf704d7ed94acea2ae39585948ab1bed929335bcf932a26b032e59d6b413394b77a2343c30cbcbaeaa36f7abdac43cb79850376c0db8c06bb666a1c2c6c47570bd859ffe1312fc4ff7999e39ee1d0ff9ab967185759d954fba3L 12 | 13 | ciphertext = 0x0 14 | e = 65537 15 | N = 0xa05fda87850c684d410680f6de6303a7591e67bdad2d8166f2d4222545f0b16728615d0b543e56d697f1c77095b9328daf8a4dadb662295b3d8ad781e7bb7dd9013a5bde03da61c20afe8dcb7f5571bcb454c33fbb3a094e35370769a2fad3ade211569b141203394663990b8b36e8ac67be08ecdc9ed37e3104e5b9b41c5f75L 16 | 17 | ciphertext = 0x49f573321bdb3ad0a78f0e0c7cd4f4aa2a6d5911c90540ddbbaf067c6aabaccde78c8ff70c5a4abe7d4efa19074a5249b2e6525a0168c0c49535bc993efb7e2c221f4f349a014477d4134f03413fd7241303e634499313034dbb4ac96606faed5de01e784f2706e85bf3e814f5f88027b8aeccf18c928821c9d2d830b5050a1eL 18 | e = 65537 19 | N = 0xc20a1d8b3903e1864d14a4d1f32ce57e4665fc5683960d2f7c0f30d5d247f5fa264fa66b49e801943ab68be3d9a4b393ae22963888bf145f07101616e62e0db2b04644524516c966d8923acf12af049a1d9d6fe3e786763613ee9b8f541291dcf8f0ac9dccc5d47565ef332d466bc80dc5763f1b1139f14d3c0bae072725815fL 20 | 21 | ciphertext = 0x0 22 | e = 65537 23 | N = 0xa6e54809e7867cf4fbc4da1f24993f03ddd85d4c624fb600d22f83839b45dc48dca38a3bb3b2b04790126f5705a6651c335281834a0888cb83685e6151983201d8d570c1f9c41be0fd432f49455e6042b92ce393ffcb79e95231ea1f16e6a5be173fa702d139920fca50a250b50230802a467f158b5b9d97874ea3c0408d7ed3L 24 | 25 | ciphertext = 0x0 26 | e = 65537 27 | N = 0xa8fd269a05184dd3f59cceae4750d6e10805dffea44b40413cda19905090eed1dd35259a55acc9c1d875f5cb7e68a5800b1e3d71b058ffc53d3bb6990d7c8f34f03f9817b63e3e0fd84e137874b83a42d422832739f2af9bb96110158a2cbc8d510a16ae80c4f2d2d41575da342d89018237308f1e57bac256beef65f4c04433L 28 | 29 | ciphertext = 0x0 30 | e = 65537 31 | N = 0xc09cbd27ee0abcfabf1dc1c48c54f9042842d01dfe8b41df696924f94f31635498c542ddd84ed64b339c62ec7c20cfe1da2471ff83fe713381d86de875bded7a33060d4cfad4001be9ae91599d37ce6fb91c01dd3392e3f61e83f0c0105a3fe592107f76970eb1f4dac73a2603f0df4bf06a3e32913eedf4efdfa09a287084c7L 32 | 33 | ciphertext = 0x0 34 | e = 65537 35 | N = 0xaaaab30abbb73870d1fe8bda8af8e2eb2fa8d0e633aee4506d325bfc9ea744a2f9251eb1c4d2aca7978ac9ea5d1f149cd6c61d946a33377061946bf9cb3439179467b9edcd3c9e81651df500373ac740570cdebb9503353dca629e8b1676606129c82e6e85411461e31abae3c02a6de17ea102fe6eea4756cc3a9c2d0a076843L 36 | 37 | ciphertext = 0x0 38 | e = 65537 39 | N = 0xb35c1ef9b9d6ba509de52e0a6bb387bd4d5738b63d223180fa5a26fe6c7c8682069bf9f880075742ad021eab3516f5cfdf2a526eaa70e556b27b8f4a72847ac75872ac1d82d499f084886d4a84c7a9e2a0a55c6a83d6b41b79a6beb553093f4d5c63f21eba9f3e0781c2bc6ef41a61b71a1273d84367988cbb34ee5f50e28955L 40 | 41 | ciphertext = 0x0 42 | e = 65537 43 | N = 0x9f3d977cb5d20aedab3d85780b4e8767e2fb2588454e3fb199fc10109feeec2024b57b6404622ce1b31efedf8d190947e47d07b6c3935fa69c44b4e08ae8b676c3545218dee1a289dd7be8c6902f6e3af865a97637c0409c58721a5808517e578436033e51e627227c2e1f832ffb94ce6ca98e37d0ed5317dfa3b07210f22f57L 44 | 45 | ciphertext = 0x0 46 | e = 65537 47 | N = 0xa4c3211c7d21abf9da1246f800b7261a3b60a637a0ba3ae17e5b4330f7259b6d94ff00f89ace47c173762d67d2957bbc5a050b6080459598f05e26181e481ffdcb84aa46a85f88e315f0723c349d225a00d22fdb7b01d5ca25fcaae790dae11d5166912efffdc89964ec0c5e0cc9bb042b36fc8197f06a49a7bef752c19afc21L 48 | 49 | ciphertext = 0x0 50 | e = 65537 51 | N = 0x99ed807831b10f3993b9e2a8a4d4fc3e1c836383e68884d8140d5ca333e3e6b4277729a46a2bf7b03198dbcc65b15a346dced787f7ada9292b27d9a7a342b72f87d78f54020a88a78b814b846dc698d3f3f00519a87ffc5eef109a222812bc918ed7a8765089925b71384dd0bd05ed4f85bb5e287f2a543cc59e67dfcce660e9L 52 | 53 | ciphertext = 0x0 54 | e = 65537 55 | N = 0xc03567d6065b72d0c7e0a1e5d10d0b40f86f30581f2fa71c2d8dc99207d80682f4a27db23012819535b616d1e5c50f5cf9739cb5f188b378bb290c0253b684d3483668b7ccdede8a74bcb7d50f057f0d1fac9d89ef63dfb7b11169030c36516fce4268efc1b5709ecefed15d24945d2afcb598cd022d1114e53a07aeb63abca3L 56 | 57 | ciphertext = 0x0 58 | e = 65537 59 | N = 0xb990ad5c2feb27b5f32f0c4cde0187c5c4a7d644bcab78f663c234637c525696775f51d1de7b2daa886185092e9994f527fc37583284a79dc9a814f76a02af0d2ef68c338f6c53a64f7c12c835d49004eb7b81621a011f68ec9aedbb755ef26dacc46acf52ba5971bc159398ac9b55cb5761ecd7305ceeef8f9ef815d6dc2577L 60 | 61 | ciphertext = 0x0 62 | e = 65537 63 | N = 0x9ff7ce9470675d9d563138b74a724cedc35fa92a946601aa49c85dd71d008cb748ec5f55a63c8be95c3935349daed1b9f0309735d88de5102dad37eecb5d68152e5a73dacfebafbf6a98d62eb009981c750ee1833cd2f36b39ba7d5206d821131e97bb322ea00a948cb9fedec20ea50d4b652c34784a59f757232b0392bc707dL 64 | 65 | ciphertext = 0x0 66 | e = 65537 67 | N = 0x9982a9c74ec6c286cb0d52d369cdafe5cde5c161e2c33b9300ff4e264fd0afe4217293c997ccfd0a4ffdd5c57d2cfd11b6c0265b4038b3eafbcb20036a34ecb1e6055bdfbdbf5d928cd619216e2cc5182da45be32d6dc6198246e638977349fe1a497685d019f63c33cca067d478af5eb463818db74bd221b46a0b2e99620a81L 68 | 69 | ciphertext = 0x0 70 | e = 65537 71 | N = 0x996d0ddb5d1b87208546a6a2aaec5f90f66f9aa9b6326bbdaaf6e84784651ae70ef7d936f78ff0f06ecb3938fb2ad5afb4dcc9062bd9f1e74ad458148852091b809f67e33b330913a5ab39e855f091342edda0077c502bc321c537dfe76aa4760177da908e9fc2a3eefd30ebff5404a092b520253d01339e42420ffe69d8c163L 72 | 73 | ciphertext = 0x0 74 | e = 65537 75 | N = 0xd99500dbf015195e1483e46c1731ab53b65af86bb74e6ed93829fad5ff8e45dc2230eb1513b3204ab2154c71487c362e35c3a7253937098c31eb348b9d35638841ff30d8c0fe58b9622465d1e3e5ec56746112f6e1903972471d6dc7055321b819c0c72e5618c36d1480b72a5b0c53c157afbb4f20d122c1657f5a6ae189dd4dL 76 | 77 | ciphertext = 0x0 78 | e = 65537 79 | N = 0xb79d8bb2e12d4a6778ff7aea4376e91a3f6a8c7d87ed64d44f260b9f09cc90b5f55f20392b0693d8aebc630823426a8ba9e2f9d621003335e11a9d4641a95d586e99a587c4156b332b249287aec12f18048e218066774688a4ca590602f1777557a9c273c787296ac86ac0564840e28437a1b43a28723346589cf72f9837d1ebL 80 | 81 | ciphertext = 0x0 82 | e = 65537 83 | N = 0x9fac6b1dcb8673ed80de321bd0be744a40e724c768850a619f9a76e307eaa4e4e2e7c5c421bbb1ced616a909e791155740326a23187a4adc06e6e4cfdeb20e39eb01be8ed414a33369a95a8d065da53aff8042897b573c5970500f1345368055e6a79ed15a47d470e194651886023dbe0f8b06ee80cdab85743a8504dfbe88afL 84 | 85 | ciphertext = 0x0 86 | e = 65537 87 | N = 0xdfea5e54e5682b3f97903d836f8d8eec439ab6228ce65c1d7abae0d9d908baa4cc30d255476b9e5de9b2e4cee1460a683ae9ca26c77537a2d067c4afbdabd6b819671ef3183b6ad38721064a5a656024b3c539a77974b595cfd60572dbe1f4ac8e01a8a6f1a9760d0f76b04db38530d9cfe122945dcee9bc3eb4fdd73cf0e24dL 88 | 89 | ciphertext = 0x0 90 | e = 65537 91 | N = 0xd81815f04c7c24cfcc7d3f27dd49fda43f5802ab2e1ea5d3ad8afcd6622e24678cb89781c4fad92e227393c3a384685b05dbad4d012916ba71b4bf8cb62c8133deb097e87e39bfbfc4146ed632a715fd7da68596a98da24ed3e8ac4623762b51c0c36276999416e6990f5ceb7f24e78622724293d4c3e7299043a2af00d412f3L 92 | 93 | ciphertext = 0x0 94 | e = 65537 95 | N = 0xd8a3b256b377f1f759e95141cfbfc78c7a034ff8fff65f0804fea78541a745419672b6edfacc4a5c650841e8c8cfba97f6d487408b4264e09b4900bafdd92f0a1ea345a92eab34bc411b5c8a13b2bb42bec1ec12fac48e2cc21a4fec17faeadac6952e97afcce643a9e4ac415f1ef9e7c4846d69ff26f4ed54279b39266fe213L 96 | 97 | ciphertext = 0x0 98 | e = 65537 99 | N = 0xca723ba7ba4b3803fd92737765be5d19ac52076e16f987bfc66006c502a923d548b1da5e3a874dbbc3fdc91dff3f61617433bd46f1cc6e916e1ca678b1ae17764f1c51ee55f6c9ee9acab968597ee9a006ef09232a04ed75b7245bd84244b1baa00600af9de01540f95f130af88494c745973efe2f55f77bd91b15dce552c67bL 100 | 101 | ciphertext = 0x0 102 | e = 65537 103 | N = 0xd24b2221a47ccc3e234e77340788efacb5f75ee75095828c9666e93d69a915c8a5d43e74c2622f57f89ea5affd3174efcd7f049069183687f51265fdba7056f41fc863c645fc793a66ae29f7a7747b652d1c99a7218171c8beffe546d2cdcb67f6ce95554e829d6228579bd09ee6901c11a9a6399ed2f38bc732dc3f51ee7db1L 104 | 105 | ciphertext = 0x0 106 | e = 65537 107 | N = 0xbb8ebf41b748cc4430ed79acfbeeabb48b1cdd17e849c6a5c48b80eeea0869d02c64024152e6ed8dee65978acaee50f47a342939415ae2b684dc9dc43c3b1a10a7a594c77745ffd302122d948233b784d7dbbd2cfa6e30b6598b59e85738200d23d6fe5cd834510179eaa63cf96fa117a898faf959e0a680428a43c03627a921L 108 | 109 | ciphertext = 0x0 110 | e = 65537 111 | N = 0xc4e99bb797133465963c548bb1deb921b168d8efb6b8b7f0fdc62e085f82041eabc890878744e7e3d4c26921fc726e0d4ff11c9214d07a91be3928608564dcfac15e28f91a012920777a4492a13201533162163a28850aabf4536aa0c79bd94925801869215906394eeecf487e5d63ce3256d36fc3f7b3d43a38ba268928cbbbL 112 | 113 | ciphertext = 0x0 114 | e = 65537 115 | N = 0xa50b2c79b3a455abdfab1cd1407cac67e41424edaeb73fec3a056fe8ef742a9213e06c93206ef9e699ed8e05b9ebb961ee93d6d29fa949be262594ddc9e4fac3ff167f9c7f9101087998e8a6553f966c41e9c895e151715a7d528f7d432635b4756ec37756194b871100a6d0d1541091e90d9628af920bad39499d0392bfdd4dL 116 | 117 | ciphertext = 0x0 118 | e = 65537 119 | N = 0xc187dafa0090eb4ee53b6104bde64a2f2309ca34c62aa338cf31ebc647a28fdcc71934b1d174eb4cc8f5a326d26d7dba7e8bba7769619f66635f27b62fe34b93523d6a5cd92bcf770ba53e375ddd1a75a34344acd818b9855a7cf37012dfa9a5da93b780eaf506019fcdcb6bd25711c8074e56a751660bbcd24ac66cd8737adbL 120 | 121 | ciphertext = 0x0 122 | e = 65537 123 | N = 0x8e25bc8390c1bcfbf690d31309867fbf6a61ddb05112438a5cbb66a53aaf7410d9c6504e75207a70ebd9b8f721b554cd69ab6b21a18a07442543012e8fb174ff4e95b409fd6b23690f5cd29e6105633cbc60df6d4bcbfc631ed8a807c3b3c4f7e0ad2bb47446f05e280f1fcde40f4185eec29933f5f6ba560312ccab75a95975L 124 | 125 | ciphertext = 0x0 126 | e = 65537 127 | N = 0x9e57206a7b7934fe20426e17196eab2f61d8a20edac758544df9dd6eecd4962d64cfb16dd16010815ace5593fca70b1115f18e73d4df4b7d86bea59f9c20e174d9b2088d3aff83e9e8a6c13ba8b81f8fd9a2b47c1db5214fdb8d20df965339e16df97045e07eeddc4673c8a010e32bc5653f04fa696bd3e8ae7ee14c9821d41fL 128 | 129 | ciphertext = 0x0 130 | e = 65537 131 | N = 0xa9652b10d43f44d4b48a4330801c8f14a2559839210b537f074ae035a284996ccaaa8f2bd3a93162c16e2c640e39422b776155b0be5ff0f2ee15a3f771aad294b1037032363844b3a042e16afac74d615662be56bb8fb7f06df6e5fd671a9bf884bb994d4a5ca97982cb2cb10afb5d0c5675d86ef35a89f9952e43a24c4e5d35L 132 | 133 | ciphertext = 0x0 134 | e = 65537 135 | N = 0x9b69a104315cf72be5946c55cc505ad0ad446aa874ee8afb8bdbafe41601fb1ae96ef2bef1e12dbe291edba1ea6c465cc11e0246fd3eaa4288597ba3110d444392f45e1a8bc9dd0ea62a16b169f140533b0dc9cafbddfb9039e05f16f619e7310b915147ce9e82a1b3732205030ccb5147855a21b38b2ed5f1430159ecb59379L 136 | 137 | ciphertext = 0x0 138 | e = 65537 139 | N = 0x959ba44fb29b3c03328424697bbe9bc8e44faca263802a965e04efad1ee0f1ec8be004ad9b1191e9eaf557f2dce9aac8cac043e6b009b7a64a90ee489d689f349cfa128a2e0233473dc909766c05197889f7054f770ae841408d968dbfa8ce1ba0ff3c4936f3a5cef6075bf31e83a558d6bae4e130d2d80493597da3b77420b1L 140 | 141 | ciphertext = 0x0 142 | e = 65537 143 | N = 0xc3b88e5d6fdc3b3c045c991145665ab816b06d825a0930b7eeee732883b8bb87ae0ba7547011154ebe47cac3f2eafabf001e1ae6f810cfc149054c142259938d854d140856f69b555007d8941b2e5cb0eada522b2184078813f5b79a3bb189b6c7a8d80541752cd1b20dc482805aebd0bcfb0d8cf70c72ae46d89a87be86e9adL 144 | 145 | ciphertext = 0x0 146 | e = 65537 147 | N = 0x987cd190f7c3c18244e79983dbd7b167abc5d0d18140d336ad08dda8df2574852ad88b6add14f6c6a660805b27cc96eedfaf5be545cead3cbd067e63f7215e7835bbcd22bc875acc902cf02292f72581f1c83780ac80e136a5ccb7036bdb143cf073c5ee5be7b705a2a28b72fbedd051749a61a300c0548545dee3726d4684d9L 148 | 149 | ciphertext = 0x0 150 | e = 65537 151 | N = 0xe60fb4b75dafbbfe03f4406e7bb6ef5cf7e623fd48df0dc75d2ba55046dc9581b26a9c0e900875fa8e63cedc005c36e5faa57fa9139317f3c100be951018cd3f4d2f53863e06f671bab868eef74f501552ec0a09ad65eb4cc05195a02745ef09ceb582baef1af832cdafde2d16508a459e5f194a32324ebe7417897592500787L 152 | 153 | ciphertext = 0x0 154 | e = 65537 155 | N = 0xa175155a1184b1216493f49e0920d18798ae0aa087e8854d97a8419a8689f1461ead569c6bb7949bb498b8066fe69342b77418b9e1e6829573c6b573ecbb9263c68fef932fa6d957a48d133dd452daa7ea49c7e50c027eb49e82f4fd91a2f9bf3c22a41e9531d6b509eb828bace6cc34293f3763a4f37fa34b62c218ea222ee5L 156 | 157 | ciphertext = 0x0 158 | e = 65537 159 | N = 0xab74f2e7390332cda4ea8f4cc845554c29b9e4cb5c7fbe72879e384cdd1aaed0148c8ad8412ea710dcd439e2b5aea353257d2e3f857b48b6ecf5681076f7770a95faaa8ff8ae976c81ee6fd4a3fbeb851853657232b085b8c2c3856d857d87e6025876353b44d186a013051f9ccee47e94e97380ac6414191bfa115602fb6993L 160 | 161 | ciphertext = 0x0 162 | e = 65537 163 | N = 0xa0f42d9050e481fd5302a68d1181b503cbbd908af121a0e4d06362bb4d1bdba2f429e7862554ea979eb8cc47cf7d4be0650eade7584b74c279f81cfb81ed4b3ea29c3a4d18f654e399782fa377995dc5ac0ee6b6057e76a7ec6b89f79a097ba0896c444b382ad918dbba0d221039d18de7b3e9dd97f172834dfbb0ee00a47595L 164 | 165 | ciphertext = 0x0 166 | e = 65537 167 | N = 0xb03cb8314300cc39e64aecc0de7e7a9d956be9adcf830950cb28c9dd7278accc6b62dc442b019c8959fa277add5a6edb6dfc9aa2d317e0bcba2401665f1ddceb29fbe05c7b2937bb064cb5eb75b63defdfd79a49c58440ba3f5d8823c9c0eab71c791dd4bddfca06275bb722844e096196c9670e81c49e657a6abb70b1a17029L 168 | 169 | ciphertext = 0x0 170 | e = 65537 171 | N = 0x9d9a05f121cc7beec5518711422f8c2f23c39f3e384424d7edd3fd73a0602a06ced85cc23fd6c6f8ea2e097efd828af223aadb5ef499d72012b557ead30cf2abb501238d0d9f21b6b0ec72c88c9d7e08e6f66f0db45c8b9a67524df65a6de831d771e8de5a202716badee934ea140d5625d8349edf7293c89d1a8bb5d7482299L 172 | 173 | ciphertext = 0x0 174 | e = 65537 175 | N = 0xabdb5b49eb543f03c08e855214214aa48a94c5c76c1369e7b01a294d4f52572b626fc3e43c077a06d09210ae6ab69d2f8a575efff64bf2a89169d391c0b799317c0b2db8c2e3fbcd04be1f3e38c9fd17853963cf47c8e86e8df2f0738581bfc32d6a12947a1984769f0b31e91a381dbae2ba53d5e15570b9e3a3adbf203a0813L 176 | 177 | ciphertext = 0x0 178 | e = 65537 179 | N = 0xc751f270bddd893a9a671f055b4926b2092b60bc36b56380e3e6f082db38b7b635c01e605c629599bfd0e949f5f52f604934e81d6587288934e23e707e6d9308bb2d6199a5598811ff00201be308f4c54b678c58f84384365fa1522ab666b15a7381d42661e5a09d78ef418f82db6b7e71760961d39df25c8c3da1f2ef7f5dc3L 180 | 181 | ciphertext = 0x0 182 | e = 65537 183 | N = 0xacfb63f2dcd4b8271f12b83fe3bc152602610ebc6e74908ce2ce8a79e5b2a9e5a4590f6664415a8713a538a26530524bd4ede310bd3bcd4720a9071dd7a093eab44f09a36a5252666659d3b0a38ad9d638fc6bda24ae98667e6e4c2b030dda91f2d20e3665fa9748865d813eea28a3b7a6888ade15cc508f8acecfdd4e7b279bL 184 | 185 | ciphertext = 0x0 186 | e = 65537 187 | N = 0xae44a0a4213c57ea45f972c2f3c10c115464f9cfe68bf97e6554e5b761680519fb3d88a1942b0fd48391c0113ff41d4300bef30121fee9c680d4f897f4956fd6752887f2cd07e103a974f94b388981a6c633a3442a4c41f957b17cb81b7c8b7986ab218c7c0f426c64ac8c3bec3e6c79dd74824fd8bf3ec68776ab41bcce3873L 188 | 189 | ciphertext = 0x0 190 | e = 65537 191 | N = 0xc975c9c9a8c06a86dad8e5b67ab4f17d8de2219e5866fe9114cba92af621184a0e219c8f89922c8a08c82bf61fca8a1a32c0fa0e06ae4789619954133c2bf87ceaea6d6deac7a2c47f29bad940616df8a50e3172da4ce9ba4d1b766ec94a2c910b1849d5475d3cb2b72fd6a77883c60aa677e1da111aff31c990d89586848a1fL 192 | 193 | ciphertext = 0x0 194 | e = 65537 195 | N = 0xbb76c3d84e9d4dd4ec81e47e5a029fd1c7b244ac0199947a40aaa8f8142c6748dcd4595c2c70bfb85e05b348ebb39c12622b5cce40478e5c0e25be7b024f584ebfd91bae90e3fdcf9cb3fe757bb0a38e9daf75c3c7b684ed940a1af619816dc8bbafba1a1a7783ec4886085a12468e737e0eac461b14b4b8ac71b25ade782f3dL 196 | 197 | ciphertext = 0x0 198 | e = 65537 199 | N = 0xab81a7bcbd3f1a8759a116c2175613702d10ebe2cac55f3b906ce621259000507bc3dbdbd305296fc671b10be8a7769ea4273782175cd75a7e82a6e2687e7bb6fbb89cffc85f882ea918bb9474570f0fa4fd0a04edb052834e43695e5b25e66bcbab2cf5a15ca3abe55a9042299a291770aac2306004289276b9aed73cbb6583L 200 | 201 | ciphertext = 0x0 202 | e = 65537 203 | N = 0x9224fb97c913e3b9d830c6424983a1d95c0e99a5bc317dfabad7e569e9b310d5618526f8162dce4c8f29f5f7c4ea825bde44c53b9019963cd67f8b919c21b4034ed8ba51199c9d243a73a61e99625b2e49801b4097b161e85bb6883a55030f0be2878f853cfaa4410f6429225e5256c0509e5af6a2fc2643804036f1207d8719L 204 | 205 | -------------------------------------------------------------------------------- /test_files/common_moduli_test.txt: -------------------------------------------------------------------------------- 1 | ciphertext = 0xb3faca5b217fb38026ea06ad314f17656f8b2f155e1709afac5fd91d5b55ae6ac09eafb8c8065065a4bee53b21143fd0b20e8245e1550b7ff5b5c5df05e25d820d469113dd64f944760ec596a4628f155a66b3bd20c8d37341155441e331832c808403b390a3f7c55ba7cae740c4dcab632dae5d50b07e2bf0bfdd12ad840107L 2 | e = 3 3 | N = 0x458c120ce1d39f1e1acd5d7f5f8dd51d5a88ce57980cf78f9b346d48362b851dff81af3b4f9678fbcdca8e74e2262f46735d00e8c2bfb00b8fd7857c84b2816653f49657c4466996c763bb75330ed401decdef4fc86e797dc99d51e2bec3ac696c67c06960f75102f166f2a92f7ef030371ec256abe96b7e420e62971e88fdf2L 4 | 5 | ciphertext = 0xa04f35d80cb1d204c8d74ab48e658b081fb3250775c28c37807d4d0d669ff87f92add4ca150ab4a1fee6978cd1e26f7f5b124a2656252a6d5a8624e0ded5e508460611fa9b0034f2e35c49e2d0fbed10feda06e30102604acfc197327f5da0afe8e33cd66510693e81e838f28ab5164026dfb3dac014696b79463e65d90407ebL 6 | e = 3 7 | N = 0x1bba15a7386dfaa8a54289adf2031979671aade84780b880149d1de7027d85b4c25f7110793873083f36e4ce300a1b1dcf1d18eeebce65f00e6e5409235a43ff435f685b8527c322b772b86d2936cc4d26b4d6578a04dc54cdeb61dc5de76a339eb00f7ef3a6dd10aa1b5afde092b028e92318049baf7c286c50e06d1a7668deL 8 | 9 | ciphertext = 0x702f3ee5a52e44f5af0d74f389659e2cd91918de370f60c67574edc59a391a5630965a56ce9e8646ee64348910de3ba3e670da53f73f5da360d63436e365e9108d1dcfd8d4756b080b5dc58be805fa61351964588016f15802811f2d333057f971857c14658449f1d9cfe41c7af55743013a7ba178d49c701ade66de12257bc3L 10 | e = 327381934393961 11 | N = 0x90d472ac7939ea71b387bf5ab1605c74db4dee8db8048afc406173880c2a7334eaa48ad89b08a4cb4f73da1d3d2c9421b62cbe89470d7fa62d3d22169ed70ea7f296e996f8def6a30275a72d71f15503e9e007359cda78358e8fcf46c1999c25e9bd345fd96b07c44c5a209dc998fb693644b451c2252bc3671cf7895f3ffb25L 12 | 13 | ciphertext = 0x8dacc54322dd8b88980d29aca6c9bacdf88f2e1bcb70865f8c2c9554a55e56444718f0da8edf74d8b94c18fb8f23509f388291c0bdf3b1d63c087f630955130bd077f3dc96cbef43ca68a4c36eaf0bbbf8aae486b9c567e18c5755911c6c252cb2335e583724379bfebe1928bc75eecb6d733e2be1fb58db71956eaa85c594ebL 14 | e = 229345007 15 | N = 0x90d472ac7939ea71b387bf5ab1605c74db4dee8db8048afc406173880c2a7334eaa48ad89b08a4cb4f73da1d3d2c9421b62cbe89470d7fa62d3d22169ed70ea7f296e996f8def6a30275a72d71f15503e9e007359cda78358e8fcf46c1999c25e9bd345fd96b07c44c5a209dc998fb693644b451c2252bc3671cf7895f3ffb25L 16 | 17 | ciphertext = 0x3acb5736767a1c3d083223879e00c3e3c4e309b23993706a4b0a8837ad7599c8952f860151cc3bf10f69d304648e60c1a6a96d4595770c556b8c9e17aea70380114993a857e8d2580cd6db8ae0de33811bea871af6123c5b79c3d586c45b78fa9bb3021ff07244275a9262934a0a39d3cb174ebb17a04270da4be89e1db6c53eL 18 | e = 493170072613343 19 | N = 0x90d472ac7939ea71b387bf5ab1605c74db4dee8db8048afc406173880c2a7334eaa48ad89b08a4cb4f73da1d3d2c9421b62cbe89470d7fa62d3d22169ed70ea7f296e996f8def6a30275a72d71f15503e9e007359cda78358e8fcf46c1999c25e9bd345fd96b07c44c5a209dc998fb693644b451c2252bc3671cf7895f3ffb25L 20 | 21 | ciphertext = 0x50db7a84304eb8c5d3d14ad83462b8910e84d9b967719309ffd65c3bd8102dffa262f562660626a02d1f16c61e7924b652edc19fb252fd91b2d1ee90f4e53a52eeaedaabb8b9f24f3f934b9bc87db2d368caacf52a33bba4214b23f04926bf2b5da417f82d7dc2c00ce69b530efff7dd08ec2b93e53e0571ed16192e61cc867eL 22 | e = 58695430075608541063 23 | N = 0x90d472ac7939ea71b387bf5ab1605c74db4dee8db8048afc406173880c2a7334eaa48ad89b08a4cb4f73da1d3d2c9421b62cbe89470d7fa62d3d22169ed70ea7f296e996f8def6a30275a72d71f15503e9e007359cda78358e8fcf46c1999c25e9bd345fd96b07c44c5a209dc998fb693644b451c2252bc3671cf7895f3ffb25L 24 | 25 | ciphertext = 0x3214393771f3be87aaa061db4e9a69bac38acd974b7bfa9a5f14eef1b730b84c849d739b37e134643d177669189c79596ae76539b88c88489319a0daaf6ba4fba0189252b006fa324bdf5724c673353d88cb7ab9ee7b26a1c4110ab885132f7d585c4ebe26e8514a8d61e32caa098d0584ac8b50ab470870b603d0f2dec2683bL 26 | e = 1431595855502647343 27 | N = 0x90d472ac7939ea71b387bf5ab1605c74db4dee8db8048afc406173880c2a7334eaa48ad89b08a4cb4f73da1d3d2c9421b62cbe89470d7fa62d3d22169ed70ea7f296e996f8def6a30275a72d71f15503e9e007359cda78358e8fcf46c1999c25e9bd345fd96b07c44c5a209dc998fb693644b451c2252bc3671cf7895f3ffb25L 28 | 29 | ciphertext = 0x53f61167c948c02dae251757d1a34f25873fb4db489c97ef6a2ac15a713cfbcba79e1fc8a67156ffa5df64d6385ee9af335af50db549e875a92ffd4f649c9ed2c12bc0370a43275c251e67ba13ef4a251a0fb580ac28e27e22fb4b73855e9628d5a3cc80065ef8a248913822680975d920e8c1bdab7601d9dc78b9bd6695756dL 30 | e = 255926348009 31 | N = 0x90d472ac7939ea71b387bf5ab1605c74db4dee8db8048afc406173880c2a7334eaa48ad89b08a4cb4f73da1d3d2c9421b62cbe89470d7fa62d3d22169ed70ea7f296e996f8def6a30275a72d71f15503e9e007359cda78358e8fcf46c1999c25e9bd345fd96b07c44c5a209dc998fb693644b451c2252bc3671cf7895f3ffb25L 32 | 33 | ciphertext = 0x6f595585fe4c58683eb44d56b89152642e2e241dccac3191dfea6c787b544c13de18bbcad58b689b2763bf87da5053bb522b59954d91a6f4c4a1f30d484aa4e75546178459c8e692f1aebca885b49af59d9bea8bc05aa5403e2351f02360c095e39d30ffb2b3b56ae8254820a032fa16312df7275563c7a5e1d68fafb6914545L 34 | e = 98667017957097957526903 35 | N = 0x90d472ac7939ea71b387bf5ab1605c74db4dee8db8048afc406173880c2a7334eaa48ad89b08a4cb4f73da1d3d2c9421b62cbe89470d7fa62d3d22169ed70ea7f296e996f8def6a30275a72d71f15503e9e007359cda78358e8fcf46c1999c25e9bd345fd96b07c44c5a209dc998fb693644b451c2252bc3671cf7895f3ffb25L 36 | 37 | ciphertext = 0x26078e8237dd2ec6cfec6f45203ba787431b7e3beea12440d1955db666fc1a6398d3a6ff82bb998be38a63d12da017c3d1e219a20fcc7a76c440a09cdf5099ee5618427e0f91dddbdf4adf85b46c9d061b6efe536dd1532f4e2a9a6836cf5ff2da6fb3384f0fa6b6ea3580f36ba8201ebbb8ffdc80a73e1a0026d0ae92378500L 38 | e = 13788812262241 39 | N = 0x90d472ac7939ea71b387bf5ab1605c74db4dee8db8048afc406173880c2a7334eaa48ad89b08a4cb4f73da1d3d2c9421b62cbe89470d7fa62d3d22169ed70ea7f296e996f8def6a30275a72d71f15503e9e007359cda78358e8fcf46c1999c25e9bd345fd96b07c44c5a209dc998fb693644b451c2252bc3671cf7895f3ffb25L 40 | 41 | -------------------------------------------------------------------------------- /test_files/common_modulus_test.py: -------------------------------------------------------------------------------- 1 | from RSAExploits import rsa_cracker 2 | from RSAExploits import RSAData 3 | from RSAExploits import rsa_obj 4 | from RSAExploits import TextData 5 | from RSAExploits import num2string 6 | from RSAExploits import Common_Modulus 7 | from Crypto.PublicKey import RSA 8 | import sys 9 | 10 | sys.setrecursionlimit(10000) 11 | 12 | # Parse and store all of the ciphertexts provided by the file 13 | rsadata_list = [] 14 | c = None 15 | e = None 16 | N = None 17 | f = open("common_moduli_test.txt", 'r') 18 | for line in f: 19 | if line.startswith("ciphertext"): 20 | c = long(line.split(" ")[2], 0) 21 | elif line.startswith("e"): 22 | e = long(line.split(" ")[2]) 23 | elif line.startswith("N"): 24 | N = long(line.split(" ")[2], 0) 25 | rsadata_list.append(RSAData(rsa_obj(N, e), TextData(c, 1))) 26 | f.close() 27 | 28 | # Run the exploit by specifying it 29 | if Common_Modulus().run(rsadata_list): 30 | print num2string(rsadata_list[0].get_m()) 31 | 32 | print "----------------------------------------------------" 33 | 34 | # Run list of exploits 35 | rsa_cracker.init() 36 | if rsa_cracker.attack(rsadata_list): 37 | print num2string(rsadata_list[0].get_m()) 38 | -------------------------------------------------------------------------------- /test_files/franklin_reiter_test.py: -------------------------------------------------------------------------------- 1 | from sage.all_cmdline import * 2 | from RSAExploits import rsa_cracker 3 | from RSAExploits import RSAData 4 | from RSAExploits import rsa_obj 5 | from RSAExploits import TextData 6 | from RSAExploits import num2string 7 | from RSAExploits import mod_inv 8 | from RSAExploits import Franklin_Reiter 9 | import sys 10 | 11 | sys.setrecursionlimit(10000) 12 | 13 | N = 0xfd2adfc8f9e88d3f31941e82bef75f6f9afcbba4ba2fc19e71aab2bf5eb3dbbfb1ff3e84b6a4900f472cc9450205d2062fa6e532530938ffb9e144e4f9307d8a2ebd01ae578fd10699475491218709cfa0aa1bfbd7f2ebc5151ce9c7e7256f14915a52d235625342c7d052de0521341e00db5748bcad592b82423c556f1c1051 14 | e = 3 15 | id1 = 37 16 | id2 = 52 17 | c1 = 0x81579ec88d73deaf602426946939f0339fed44be1b318305e1ab8d4d77a8e1dd7c67ea9cbac059ef06dd7bb91648314924d65165ec66065f4af96f7b4ce53f8edac10775e0d82660aa98ca62125699f7809dac8cf1fc8d44a09cc44f0d04ee318fb0015e5d7dcd7a23f6a5d3b1dbbdf8aab207245edf079d71c6ef5b3fc04416L 18 | c2 = 0x1348effb7ff42372122f372020b9b22c8e053e048c72258ba7a2606c82129d1688ae6e0df7d4fb97b1009e7a3215aca9089a4dfd6e81351d81b3f4e1b358504f024892302cd72f51000f1664b2de9578fbb284427b04ef0a38135751864541515eada61b4c72e57382cf901922094b3fe0b5ebbdbac16dc572c392f6c9fbd01eL 19 | b = -555 20 | a = 37 * mod_inv(52, N) 21 | 22 | info_dict = {} 23 | rsadata_list = [] 24 | rsadata_list.append(RSAData(rsa_obj(long(N), long(e)), TextData(c1))) 25 | rsadata_list.append(RSAData(rsa_obj(long(N), long(e)), TextData(c2))) 26 | 27 | x = PolynomialRing(ZZ.quo(N*ZZ), 'x').gen() 28 | poly = a*x + b 29 | info_dict["Franklin_Reiter"] = poly 30 | 31 | # Run specific exploit 32 | if Franklin_Reiter().run(rsadata_list, info_dict): 33 | plaintext = rsadata_list[0].get_m() 34 | message = (plaintext * mod_inv(id2, N) - id2) % N 35 | print num2string(message) 36 | 37 | # Run list of exploits 38 | rsa_cracker.init() 39 | if rsa_cracker.attack(rsadata_list, info_dict=info_dict): 40 | plaintext = rsadata_list[0].get_m() 41 | message = (plaintext * mod_inv(id2, N) - id2) % N 42 | print num2string(message) 43 | -------------------------------------------------------------------------------- /test_files/hastad_test.py: -------------------------------------------------------------------------------- 1 | from RSAExploits import rsa_cracker 2 | from RSAExploits import RSAData 3 | from RSAExploits import rsa_obj 4 | from RSAExploits import TextData 5 | from RSAExploits import num2string 6 | from RSAExploits import Hastad 7 | from Crypto.PublicKey import RSA 8 | import sys 9 | 10 | sys.setrecursionlimit(10000) 11 | 12 | # Parse and store all of the ciphertexts provided by the file 13 | rsadata_list = [] 14 | c = None 15 | e = None 16 | N = None 17 | f = open("hastadlist.txt", 'r') 18 | for line in f: 19 | if line.startswith("e"): 20 | e = long(line.split(" ")[2]) 21 | elif line.startswith("n"): 22 | N = long(line.split(" ")[2], 0) 23 | elif line.startswith("ciphertext"): 24 | c = long(line.split(" ")[2], 0) 25 | rsadata_list.append(RSAData(rsa_obj(N, e), TextData(c, 1))) 26 | f.close() 27 | 28 | # Run the exploit by specifying it 29 | if Hastad().run(rsadata_list): 30 | print num2string(rsadata_list[0].get_m()) 31 | 32 | print "----------------------------------------------------" 33 | 34 | # Run list of exploits 35 | rsa_cracker.init() 36 | if rsa_cracker.attack(rsadata_list): 37 | print num2string(rsadata_list[0].get_m()) 38 | 39 | -------------------------------------------------------------------------------- /test_files/hastadlist.txt: -------------------------------------------------------------------------------- 1 | e = 17 2 | n = 27658060678038715780470429570597987144542213875178081185638364125349217264266787337266356239252353691015124430930507236433817624156361120645134956689683794554169169254645287613480048966030722812191823753459580311585866523664171185580520752591976764843551787247552790540802105791272457516072210641470817920157370947681970410336005860197552073763981521526496955541778866864446616347452950889748333309771690509856724643918258831575902389005661750464296924818808365029037591660424882588976607197196824985084365272217072807601787578262208488572448451271800547820717066767396857464594301327160705353075064322975430897551911 3 | ciphertext = 11433488612991990768536086698965180146550356348457563234735402111134701115830423042016221831657484325065472609147436229496479358788735270448637824809543880271526735635196884978639585020518147152207002685868984199742884443523231593245377292570809368330956970290791633106067116466080014631110596564728982066569618319541351401820732547227122970369299780366876340403436785218211729531092484723580223801525992510782266856454394478372421830988205823368541860973674259795969870252832216828042174346473447490557323038031625277043161510854825069681462499200978561823301487118145650943076528233694749306585201212677836363102350 4 | 5 | e = 17 6 | n = 18856599160001833299560082802925753595735945621023660831294740454109973698430284916320395522883536507135735383517926050963512440162483065097256884040938259092582892259657340825971260278387406398529168309426241530551396056450450728728601248269612166083300938497235910244979946020059799495231539400114422748104072550004260736766137354572252872437140063474603268146956570787143010441293268321641092743010805639953103578977668248726500636191043930770036787317928372179939360510179438436665591755940224156131460271763912868322774604558314812111335691108887319827579162188169744014973478052491398688611046800951698773893393 7 | ciphertext = 9537600333774561965347809713893729543607050845183365456822389928272539309054686047543168922742589173859871008938711574330675462024831693796734766356934966684018899382045308313458440052017835494802986355673813464215184924837019853399388984893499187144821922554214143314640377079505897680854314880035458832414257859211958802973880776732222536460326269825765449639225220135735729106020282618914111685220841901015367575108920943148006106714487046602965253293770388951872741849791157534395777330833976209975828865170184061768114280467192574451716204110866562270737220078456700440400847759035001437357717203367869014507886 8 | 9 | e = 17 10 | n = 23536517244565831304957548822169291652207666754083340160306298208076886665065064843803465469409961704414510544566548897045751559184520942970858445270483458341528037499088946028024476760938334724064432942414803725235245083424464022066205458380170453189950900307248048617678876232312945996520402058770976469558803007764420552804210174247648614671097046399148333316029580244153775977135880775921663886951776404864678251750085264792097984094013284691977749495264267344834078278955171634785277609298558886471141768976455150174601039402280137908104589898954351484608783306378026577123527889651575952772820003380025546341093 11 | ciphertext = 2787570158312133794000264568955228362505478580337508384369847495327630702109418180218855630800765419691714135680571469213835542379448821209732447589306506369895651911135089075762137873889141680195343215032414145506957429427948190720862478335515596644926205381293106417410261520242246013085300698437878525197927303400003852408888917470597700285690342597850461091636279688711415205788329646890595805415907084665612141657880165938739423616058100283432682214722969192114128403177592988697839575450529126584549296274365360257579336454484779207708578834457262472129009056129647722165160424055970728939468425924742795247404 12 | 13 | e = 17 14 | n = 22182114562385985868993176463839749402849876738564142471647983947408274900941377521795379832791801082248237432130658027011388009638587979450937703029168222842849801985646044116463703409531938580410511097238939431284352109949200312466658018635489121157805030775386698514705824737070792739967925773549468095396944503293347398507980924747059180705269064441084577177316227162712249300900490014519213102070911105044792363935553422311683947941027846793608299170467483012199132849683112640658915359398437290872795783350944147546342693285520002760411554647284259473777888584007026980376463757296179071968120796742375210877789 15 | ciphertext = 16279989825796156802547712583633798298339885806436476356497796047229021124610630851145390462136716298450342674217575569196543919171078736243934669612002081179432014315465408489156509075853163302037413161239227506465361288161349464334942343016752593577869091378915378775289174914088843177811858916838452126433042585745992994815140378356718198629815818784659700720051966660786554920296721138381405607252098516473395177368859057746002895683463397630717358844874557866924382768279446164993249061647243362602307728771126094369384362246840728274885512559106673543101063171808938427459691773785819336680808200730383909434687 16 | 17 | e = 17 18 | n = 20692935323456318857339636506121661409781600706918188791579569287363925379425076174758120076604134447812506062875425652061813752876711066070389233324351070782264123950482732919402628782987702034544299244918439112034234610691454353578647793100554890386226509128280993176780063155185886470116528236906519407444238424523493151082789442134440461004320839591569157239343299865825958454617581990948186838151424941117137818356712476559230872711658730923799079308488965817006179693410669320825141974869847267757553830878658559853061666130127729833856270147578804267991192625989184535593836836877723580138193263333297569871679 19 | ciphertext = 3149880252209031344712912478150309339789690396685866282400905925814536568350616764434288908486968492252351255022161340923513529850192573780350157980373627989388396346845656970516353356298790654832486310492079962338672745285854665147406015543850517102001543987674241995267846019477920439984122318278402925428057397039652213642437095694526592410641576952281061504190238132151689288080423425867830015832927809704559212420233819682781217618789216812964682441589327621971863380979777355679805008775337364919278947618188598427198109821307637144473819840409743353235834034795849314936322245339378447572244022235758755318197 20 | 21 | e = 17 22 | n = 23980852037830754961843810384842109198680213599160124627608485316452067979221814287579031744661623974638029208789156178351485676131492416093947908129410491693261731404401473508295054358751129977958761373804386612048163148740071525591509234298601816819182717519183021983010112798883286143566969631969002952806398266165159329990930567027893909276078886841121244401773915309649928992691723658667402744292184927500507621943557420540056270730461740897601661594495028880708798531876866777269713984635553934853524715534003465120928659881608776745499441872048908380726942161563974610455635903901327036597201663594811207962219 23 | ciphertext = 6500753041357449855790208700753809194331642408448330624975108109751859721113916040913210608530117147284032825775613945416295553599499663257233673509345038912634968979540222246220460441613513695959331196716737175735741187191935319073270722811433035516074289343637773607521789970734447289501012767670625043452129332667983332570596510412510389935486708833483704894688513193020406791505432203906745860054901025547265075193156070642716676601268698224891768784422675343094235950805128869705790800102590177489342374151286188584127528879203511712056047898651580309669143955726928687269246843562481439718815596302692298516533 24 | 25 | e = 17 26 | n = 20991361604317638769781823650579915779070848318189821239839863416933546421097820271887796260918963289144354691357223973152195364244222103627141268032857145421152363842224398828703305592221616019678102879125957325674007444034541160527072712208844228077449624475289619712846717432293230773279322231288635231839457560272849165524911202814516841260722542666841002263011069065414760944278124011800036869640840312097012211808948108758865722731922057521488153991477824974687229720412552981052793827211890557079895492457992364345889589127536307112174252490433421772585442393590767593690124636778449673348970938028847369589017 27 | ciphertext = 1176089662945377859394485590647428302230902074038834532187683920441006896963622996580792552532208518328678256998366963208028743204946660302538358531574765644007432906847438011315702121691613005078019506672007476291213237939507650616659336489497035998458925997634519034425449883103272960672562772204663037400144823802245320606039938019714906919958257594477982151857672916895153818922550365638890064326384677879791487276278839159022778493427572161764299809764447703117493013786755368150005501909964140795978310287946809348754988288402304994584145696550845106776916203635572397815715801968943287729470010695704992513284 28 | 29 | e = 17 30 | n = 25492165341402870943193342194243878583550091830588300179983190484677536677783878770091771426745020581968485223806403482688708690916599646206863308796421682192123291604607235755107364431209342465647517951497018019170871611821471577647494718032136027446239385000016582048814012025961200909864909126220898470337474181564969111740549293849528764155308076160637626891491670481790680054394999454113154731685789729310781453533838696397873008408145290785550608424077599753426457559997966726766077860415133627965054965186926286998932683118114065698789972581403018027054849591593302510627959868541308908688742433116746685957413 31 | ciphertext = 6666419060534882063445608631701254352058920974421822069727027885698959797948070412066328188514278918986722361742912500893728424745043197562231410354633167915385978833339701529722766937863212423943888214894271923064950171580353934178748023608466389268996754295631668202047874774966518214639701079489902676101992190471567121772228753020078695924075081945558620706927179092603126041395606016633822502612954885417984184184737630487502072507997213412593690188577996870365218951232207636278621674542750965270226225337180320970384418820119666789283194398074172939976925377054214851752639573115850958399373724855553234690869 32 | 33 | e = 17 34 | n = 24360507764722702236982664735328841420311376027120399241078325497875531961885056309904114723678048613901842270612025644417215018351512175660269184968149109110209563435463873211914594529847294730496535258882010197028842516927468678843924092706088182566726725380495130934316582041447010080540555792802432876873205758297773353354773400601269072565235285553745651262991130015382601486699000167692446155692416347390954126585612460075052988874628884097103408004610717498543307677173210168954439627061348158046928463114067813191846253937179490050784167037265795606665046543869952157800016132040847485597002954075447344679099 35 | ciphertext = 2091608690891505258645949208946395204695041893228619053197065370886625848151228416356718762070352835427065857428605476603762875777761221509564315249418937215791628816353819422446178413024109351330646491084678357651148045128554746141683169277567849074245394149157710582616155738686711539953583528181614701953172972027101545253676978964454897005216320952879719740377602813279137554307680715749682175447559417772077472349519490785782899751615833622828868651966927604858524345638792811839384317780948838203430577334783095834911402913673850996431719159112716370014509918436690080118494876223156361387987999829094801210890 36 | 37 | e = 17 38 | n = 24196427886175544349183151853220199349004334700026598710073455177858086301574503667298550711896472441115488666905450709605686892168468755356865839253905196330957826522203721667534054840325504585224175556167326100374628995111103938603447308160978852917872087343333848311844292367100647648063686677699135973596041567307784602998888789211145238333237613511049640509935260207585999606022736214748154785163367146044878537220691272581381812904389596150391959046627047758159235384420979630615278721284429066540058110867810807414175942667916940934372027878979861244401198531405584211810881235860988295519048177492135610751359 39 | ciphertext = 22296229997452473240404864600165019763565238056149885081619043661295445875270023158334098350603026725837611396891344057244652143898149482532106315521575872089742565470821567522946361662445964027209388657746191967435348044945947483621482721538186361050633595041353278781238956486769506373730884495108039610798833232749139421109269053404110580969203157360738738757856465985684697862079893042321411866940484105462672034009048091117594209570962168395344960105313171255329582011213721766675322731331965794652525786585751148977132545042466983433106614477836969990881581169493890539450115893703987635774477858244270608426284 40 | 41 | e = 17 42 | n = 26181530231990596208912553982832841408036769882768643576772592303571004331051012292548525104394717484252349998434031623438917061404178468743247357634872314865905132523154238118481540371615056806756673945897771283881615017345596477766231957968854622033499073650939380455320632540323169565251694316300843433445667057555206872698949047971459662093473609973167299463621536822302820363096764742010575821082948519766535657152613824870739004432505303862201505469354785224205708777422229564239113870271947768783809029625932248575272642464554827073657622048405963388795704112995209429712517330431946725366254154641804680636843 43 | ciphertext = 6596498503473090384156122948918457693225694527543771961484972133896304927525029433085731957072789891646290597692421323936231128201822432631159176346646447011338805190482179145913035869942714613486895588754112366313438192851954663748505238329830016450238817308208066971617432717047936473721490905750275563930145038394216747562079905090073621918898708464447477835510214346908545028865672847041949340101722558962541612836311085196500521238354347015877914823677634283521373575663416167402249149782097385550791425270622816978948552969790013217066937461634555711434991830871731594480554761087920979267051612013063691897091 44 | 45 | e = 17 46 | n = 21127940129465859529449290710465142401626099761120448822896227957140612250511186166751154941578458258054285578274511450860570540828102070111370941358023009904308008795394643585864471986075987747216086746123427597776886622933600026324537947907678164739969468650427560672262831484437166952755098875024996456298734488381416586155715216067643259554486571154930556222002298362539331180176023831109425436177078457326927485711697356496728959762158514131974253928871967648747022232011642161107225163919743383709749413596786170516661129884422397760268997322898954161891328103774133077184028190158020665184081778231669390621447 47 | ciphertext = 3025342965063970983290961997148038673244905555308289391392896371605967574831912573039170667272658109340534212720805676884032065407092138739865486740854024452063900964324730683963944994250537553102328024132087660954040726648939149676030355851576763910670469390583200661923104138267998714166483656478619852365437776250801008285867722681155855008497404084448836122553221951674607943082229713841396761939215145379881979676835537964953725808825354819362797503568722134701601966504482232887162578922823026182148541889898696868501626860530484834082878781257554947276873624962134091380186322272011345017295000538738940807566 48 | 49 | e = 17 50 | n = 22418240669078782395650685709211154715963189697089263104799144782938556049238670824036504767273510569815649054522706833230147726835488621722481390416868271627116267103118088021697808807092496788890564153300558617457948161343658932652189856049810225397121264480931341652674373238956664385611007077903271999938666531870525476577337484325119704138317723687164049779101614572637615019989722168840820998326371954897496744184510021746784303032310300111064058399012572181069622479162656626630666689745901678446100898000876596201969536772169761074060718581442841244466714693693744538078059538322489346225247976911833748299831 51 | ciphertext = 12741916458848035965674277226994440579915129055105462698845221890770558867890065973150125863687106455321192524282688850919026924493363241183706112792662939894532011809709158105688708409813198696055548036573709488504352009446189240170056000380659861236761237694775468132858916502459186242385986053427650331045218524574666652583364331482577973877822911369427036861116411565934292335204172142173748941863013032301778764886328258476195697934305418334527182261876183838908107190767800857337092015153451318295610430683371731834190637342265695335154669307530426675001781782217407160875559782488264585128426108095378548497650 52 | 53 | e = 17 54 | n = 22840174333461757597258965063503187552495604936013453813620970124752854692025931772152482715744058240571638175460349150353012889988723597821978579743499713766809084692254297539180932689148176677208822562008650864838388158004011554059006621226560748426334342736035675518932164604927602370423087532589029111052023317750367568915149473019058579728528211621618516222534404936592529521724927756742450435643292165615017136698859157488474841102297647488008004924900405006989945846311096537399030509947027554824768198503677139485403433484337602107191422279674605462427176871354240310242684337649527314815937448142118014471869 55 | ciphertext = 7269879938285087105060326068602691458154834670489063661854932312114567012381462325708324462473335735747751985833951832304054546004436096189761282474552769255043106817537407079708725883409397856635437608590617899532129476884853580275762892523609169600551500977086971018619327642914168273376084417345670925345416864822282780628646416374712921155883117431305185117831110048721693951865267141962666069350614792416053836803149161735632213430960384988586996269807413280397202373128437527421378900814241234271529460443131737298476049472736692048979564047934967259654010923397531158463241672904787724046355796318156683211693 56 | 57 | e = 17 58 | n = 22563350736629808264395772922819808510705484822245634475903533464108273973359621048788502042378085143059458230242646589967392945320090987067961491654357416853755261074531634683509015394347409817614889849143844247148479574777870355411207636748917532445668322051861338052906797819332259215278552079454184458015646487703430124222965707626399501332317111449272813630361908462924849723439803107908568327484445685641242797481816740336203447956828486867818411976997494338407256234593013250778655132122780432402623365698921928370817670245911505312288465537126236680323692662919137486755722237256218345361985595174086335811073 59 | ciphertext = 20135971165126329834498721501784512951499984648652660104821647741072871489936836442504197592142991669369919035304425516258391511301425226375564892415339365148509645261565560913559856659645387805198871549146172257882053281268795760344994001608956789940307816388486468042693545041073838774812997395437209060397149458050765177205158052575861667488415782153713633691372314235926019032628836133660245109281683465499593548858659962576728675714563027957143405441096816687188373864658407934159173393698714390810577718268693096568336071207238450039773940104963444157704166286892082172461258702049072827677476706096904316460964 60 | 61 | e = 17 62 | n = 18375116136153390105382127878395045588105857107246922094470216545244337357987681718168448429849698069981688291927806366721855289976121993055091218569849787514394507275481429728206429948836923251296672175100798033529862498578044854162615314211321712132747044363074981129056925717085204066189560133707352709019771792017200539059204024262019592851381317279368957556414371834469907989489823310736060223258994989400405121984031058976855896631117913090748375198718936570595983429517914008170697730495897896134771484309035561040862223201385431761693343426402858632921946359721016131084165400212811848077899966364178485645209 63 | ciphertext = 14450411368079644952604705871870024872670263251365527266862703716230778731191117713744962010138824834514424908701300856449356388617430510950535877723758382120583446269291649779277478125202353436896123871466945681583403794725306243733343462009791759823657466902546992816090954580754519785729524996046358307197773786618439603452776474869740548426942373102466687002398105444228516302695737600836706505822006007382861266883167162032588362091247091029707841718663522787461434574458986841049123553142254769053444081497788062775004085437066317446657655214417638414799100287660747244854718117257942197065271633812453504802118 64 | 65 | e = 17 66 | n = 21996468204721630460566169654781925102402634427772676287751800587544894952838038401189546149401344752771866376882226876072201426041697882026653772987648569053238451992877808811034545463363146057879646485465730317977739706776287970278094261290398668538232727000322458605289913900919015380904209692398479885177984131014170652915222062267448446642158394150657058846328033404309210836219241651882903083719822769947131283541299760283547938795574020478852839044803553093825730447126796668238131579735916546235889726257184058908852902241422169929720898025622336508382492878690496154797198800699611812166851455110635853297883 67 | ciphertext = 18919626944919001746434424216626233185707755539125451453498872012547818089480281584466165481221804279035723497497262166426771134459922980759121024951390547522550510734782168869364945944106404378597344695227319394862905382593128694330512816879360904284025740295670026092938765777154761403682710878968080966485091090198109371223563090698724814081281842426885356314840392128767155541449360105460941384985904101420698734690361896580259169275867969219822351776569430617405034594385605780084981880407657528516176335362438505224655581522137130777263875034088903829280901936110414932437809315770012018024957989707333743935907 68 | 69 | e = 17 70 | n = 19697677554331221267369641184167188448335213481430897452143918418367154993523756864868509098839783053011355139590418269119504715550443490754762988015861768839038067134509092125205376509678043881070558825637905431885254727168679069330416776166369184375970521838169214107508952264240335498312849019213361951991190975616614804433716772411184993774461040690673753098373736933084616647869336141707774024488317582512216162403209135110515778522772939206567850540704356683976987508523230996026019768603629874558741038975853009975048175519392495212857366577161641687502674304846608725983145033337187267988999492371626182417551 71 | ciphertext = 14300174742950957133230867352717457897986205104543265825218842008467109972830138620119291505539500355334723376879888409251809364632635010202950500050892997355318105884900306620239365641681252935777362167024611054220484107153146560621083009306565476636270883588514007454668850327310521718849400741849368048026759782889674614052640379573508042637071620721869972662416840328750772187247907576009995766111841008793044576343182936834713229276992314777759684829492003814595802694592792453101320053268786720734738162720052909591108493186651733642823133001888727983206566194875945734575411295063088173363528901413605439659186 72 | 73 | e = 17 74 | n = 22946690762018202432990887189358840679847544298138130593179782494313283235656708793278294817370704179431587028797820098265221065047094111469387707851755805572030960917620048531944164128853858185996116085402185608208505862268300069081634690281361741089802822427014733500818400628218120217701065238981427409232531524810373504821405505784194458324112411450898914981925380408035843501140943840375415504531028291728110941191868468403264579853022847273710668909241386840084506302813524686512443804790681324357699954553042087787664048340322301999798211625015533291431249576149925507273846582715275085720997988716732564925247 75 | ciphertext = 22114155655659890875804525321139229042160702983880183010190613534988342335473532979092956071940843014846115113869717993343361412775761899123003515398037548495421246487341345482541093940292149812612966738017954607042366694074210348507360409383994155996445275183175086308877643260816760841714256410898269814908129813108551478627448054932601176813323889809069498060147451905095827442175810001123067159848367040168783825044279052630935945891964134230385303127654483691228319146427451587693985548002268250053416426728753739573823133295951972853182187229046285977320129680613905801285437766686995325893960172376926445625122 76 | -------------------------------------------------------------------------------- /test_files/rsa_mistakes.txt: -------------------------------------------------------------------------------- 1 | 2 | ciphertext = 0xb3faca5b217fb38026ea06ad314f17656f8b2f155e1709afac5fd91d5b55ae6ac09eafb8c8065065a4bee53b21143fd0b20e8245e1550b7ff5b5c5df05e25d820d469113dd64f944760ec596a4628f155a66b3bd20c8d37341155441e331832c808403b390a3f7c55ba7cae740c4dcab632dae5d50b07e2bf0bfdd12ad840107L 3 | e = 3 4 | N = 0x458c120ce1d39f1e1acd5d7f5f8dd51d5a88ce57980cf78f9b346d48362b851dff81af3b4f9678fbcdca8e74e2262f46735d00e8c2bfb00b8fd7857c84b2816653f49657c4466996c763bb75330ed401decdef4fc86e797dc99d51e2bec3ac696c67c06960f75102f166f2a92f7ef030371ec256abe96b7e420e62971e88fdf2L 5 | 6 | ciphertext = 0xa04f35d80cb1d204c8d74ab48e658b081fb3250775c28c37807d4d0d669ff87f92add4ca150ab4a1fee6978cd1e26f7f5b124a2656252a6d5a8624e0ded5e508460611fa9b0034f2e35c49e2d0fbed10feda06e30102604acfc197327f5da0afe8e33cd66510693e81e838f28ab5164026dfb3dac014696b79463e65d90407ebL 7 | e = 3 8 | N = 0x1bba15a7386dfaa8a54289adf2031979671aade84780b880149d1de7027d85b4c25f7110793873083f36e4ce300a1b1dcf1d18eeebce65f00e6e5409235a43ff435f685b8527c322b772b86d2936cc4d26b4d6578a04dc54cdeb61dc5de76a339eb00f7ef3a6dd10aa1b5afde092b028e92318049baf7c286c50e06d1a7668deL 9 | -------------------------------------------------------------------------------- /test_files/wiener_list.txt: -------------------------------------------------------------------------------- 1 | {0xd4ea811b16f5a9c58faea98e752c60f146d8a4ced9ab2510d8007098c4a4d17d87e0a5fe33dabc39709607bf94cc3961ea9460bdaa6fbcf8891c7eee8f4a0ce3487d76bfcd738d4a0c886268cbae817e6fa4ac35fe9e50b537499874445fcf52a874e2075ef073ceaba2833e4302b0c8212256326bf36e0aa3bae32b49b7d737L : 0x9fd1a37544cc0ecea41758aed5938eb1a5f702b400df806ac363ff2b661f9f385f77f65e9fcb2b1e6ab43959234193e1769871f7ad0ecc69f6e342710d97583f227efa4701d6664c01e92d276ef94a3a8b6c3080fda58b6227c44d42048e09e47a1d3ac817866f2d596e370348ef8beabcec5800419b49986fab36380a7a80cbL : 0x36e1a9e6fed9710dff3830d49cf41360fe868138372b8c0e7b3e6c635af33cb060446397c505b2297761f357605c18e4de59a4710fb042dd1fd7c2bd1526072d53b5bceecb089311fa7d849ad955b073027854659e21e13c0d34883047274dea23c504d67587d1d27c8242045970e1eaf35e5ad9da12078ab90a056f5a1dc3afL} 2 | {0xccae54d880e825cd0138b10ef5c972c4be590127ef79529db8951b2651f28279fe955fded78024610b64b1a85db4a36fd45289a0ba77e9a42a055e6613e63ae3516a20853669d9fad3486d4618d57c5dc38bd08240b1f3d1d5d0c8046e57621e21900fb3d2b20c423a3e36b6696341be5e4262f467142663c2a10bd613d0c2a5L : 0xa409da4dbaab715823cb1d2c9b9c354f90456a5e14cefb9a7a65c23a4cc38498ca92239eaaf08ca371015dbc3c2ce5335d5c9a329f4537419e9dba6496248851c098d5eb7fb5a799d54abe772679d0f98f5ab1706c2f58be5c6bf4274444cbf00318b1152dfd44ea9bcb45fc3a7f1e0a72cea5caf784df17ef28ec1586567d03L : 0xbe78a540168e966601a7ddaf06106953fcbc3df46e03edbd578f09a43a3f4e1e468202b075ded775efa2915d0ec372b80f29f7a71d2b1b915f1c6f37992ef4544e98693e3f2f79325004ee90f59a10ea4255eceac96ad062ec6e34d8c5f888ac9c4a408b358ea523e0d989f62b819c6db2fdd4113dc9d29c555e7ebdcbcda0d1L} 3 | {0xb9dfdd5e37ccdd53a3729e9d1779763b967c784b3873987d03607ac079de9680ce3b89d084e7b99e4bbd54e446f9f89861ed6f89ead786633dcf7682892210ea8dd5d5d960e76adaebbe3591964cea5b61a556661849a3995118b2d9bcee0afb43a99e32ad959f5b6cbaff9843ce540d3c4b4cef690abf40d16839cf43fb7067L : 0x587adc03f1beefd00eafc604dd65d2e586cab49bd58fcafe6aa3b418c887bc10eb2cb481a8382039109ac6d70f5c1e5aa77cfebedb2db0bb6f8ba9064dc33481ea73a4884d8f940473549c3731bad1506cf0c0d3bcdbf7f0f9ec632c2bdbc72ea4249493fcb508d6f300490f2a9aa4edf7d72d62c0eb9bc819aea29313dc937L : 0x11b926432b7d0a92843bbba21556d3e717b0d8d939bd7e64d8d92beac1b583a43cf1cb11611d64b33132fcdcb47e64fb5134886947670c2326a4d7179e938e8e728c7ecf49b4976724f5ed27b26839dbab0b706d04e7434c9508e384c6c3db0b30217256892aa6cac235ffe0e754b03db771c4d126fb75e88e314e7f2a7a4a41L} 4 | {0xbdc6ef3625ca3b2fb4d37687f0719e7d6d4cccf80f63d1fc7255b60732e32ef5eace7a79cfc58679d09c18776c0a23922d64691ded7290b5dc4fc0a2335b32a3e600823695602b2bcdc61a11d2f362b5e39c27d070af5987c88edeca1c7713a7788309fd4ea6a0a14a06bf74d7e8c1482c5331dd54c1c4e751d821d2741b139fL : 0xbf0193ad871f60bded2f9747f2d5eb0922e5cfd5319239eb3867e42482ae9948a1fdad741762ae4c99b8dd696e3677d4211e77c1ec6c4de77bf60c99c0593237634b3985867392f94e7bc475c59d522f22bbd1c0a07ce0b5acab1a3d94f55320243ec887c8be021f43add95f6fdc7ee1847088631996f1e2f1a5b73dd4f81125L : 0xb7cdc34bb31f5b7af2eeb1635e3c986bf62f70208d7bc2c77dddeee1d6cbc7e4ee3e2c3e0028ca9cf30a14c0edd57ff5c16cc7bed3ea09f4bbcd8f6754ae80893e8a18732cbe933a643e67893b059f7a682ebfcd6e223af631c28918f312a2cd364a310bd353f37001daf8a3b859f188251a56ab4d4b1deb283dda863b80e089L} 5 | {0xc22de074539eff94ad5743bc3734e96b8a5ed29ed8fbb593302984d8b8d852ffde098e66d30d3c719b20da75ac9ac15fb7f48d7d398765394ed167e5aa84e5534056b238f9b448a85d722de35c3dd5178de19c53fe5d94bebd94e4d084b85850347fd92a1ba6baeaf8ad720057af7c63ea63d0fc8ebd60175cedc5ab4fbdd90fL : 0x7ce04678f9b2740175fcc16ad74ed84c0187a26c068fb53ed0a47ab443728dd9ccca0136175d5164fbc1c629862c41486c60694be91be5b7dfbf7290dad5505be81883f35843482432d2d9683edda93d335266a6daa5f4fd94a506cc2782f36b4faf3e56524695579c1f45e803bafc698faf80955a70f5049c78e7720ef81adfL : 0xbb445e32662dbdb12aed9662b5d7365a32f50318d31e06cbd442ea9d16a1903bf739fa18682c5aa48dbe0bc8033f6d6b3bbfc54f633e247ecc36f4f5b0b24d8651c68e366dba0c4e6c7a8166946e63697ce9d8ba8e8648551166c8bfa4279961e9a87a4f6246dbf34033255dc3c8e0683709c1fe50623efecda39cb47e730a16L} 6 | {0xa6480686467975bbcb2659e24326cb4f61183591680e596dc00d050f8f8f82f6e3ce19d9453d33da8093799775c74ef709b214f75f5b8db17f6b07f907daf0b2b75c546efa18ecef501b21663501f61779c2f66141e7e35921d17cac78845d68c1706e309907a4147bf7395a13fe373680507f18d406b5a4d4f298d4dbf1901fL : 0x1733e1aa91a3f1b884395b058245aa771ca5a9dafad1cc9cb3eb8581e2ab40853d83c97146bd01073b48469895ce974440a321b5b666db929eb594847e4e31ca39fd01d3d054807d05bf6205079391809992db17287c735ec78316492609aa44879f4e682824087a9b08ddee901d0fd8cec039c27273802c1fa21b51d4678ac5L : 0xa450e83df52eaca3e0a12a288589039e597f1c409046954af0232b8b3a259d639177f1128bbf639ef9f485e8ab98ae0577897203f8258596a5b3cc664dbcfeebee67e893b5949dcbcd42dde9f6e9038aec0c7e3a17eb6918203a1d7804e534c1404ded1d79f44de4a5ef3c7eacb5672b9399d39e330094472e05d3a811f431a4L} 7 | {0xac188f4a5ae7c88b1e03d14444210c6bab1c5497fc14f8e7a180dad8ba2c21875aba3d0797fff88c4b2ae7b3b81bb0f08bf10c352c40360e9e5a758649329a9029849c224f2e81af989d8fb96b356c8fbb8489ccc811d181200600a78921946ad437cfae1d5c6aeac05866f0f9f65c1875263dc539c3210cc4356b89539e5f97L : 0x50a2212c3b15820e231e1368961f4de0bc5f7775e165200ad51f0fe19fb02a28b6c04066e1240be02d6be4030741c58eebabab21660ea9e9660cddefaa132e8b61f4c36a171a1af67965a4748869fd0d5dc8e6e312476f2272728a99b59dba1e31a19c145dfa72266d377a2c96664b82ed35f68a5f65c2a6b3fc10b6ca4978cdL : 0x8d43302abe0ae29ff393e6fbeaaf9c1f2cf3df96815d6885981692b0224505aa4daf88b565e4e30e6e9968b316b31ea4b9e65623db23390e78f8374f7a6bc3dd367af70de29ec6f0efb2ad585f2e5b2bd9c3efe2966f07ebe4d64d443a15c30d7771144602f555ff0370a39f4ae3fe0aece15c7d55013f447f68907e2748c26eL} 8 | {0xddbe649f88e3af455442623957a10e0c35cd6f0d9a89253e0377c57daaac59bb4329ba5ff836e592bb01891ddcdd081b3684d9d9a05fc1c83eabff606e807ff8951092a24c5ee91c853f211f9023137332c37f3c66b0e2c5a6bc081ace13c4fc9ab3c7fa7cc600749e8f462718b31b02412a9f39c36b24313afc387c87967651L : 0x2efa10feca616838cf0e1806bef47e4faefb2afbd871daac969ebc92d0e13aab39b0d1f2cff56c1ec59479fc29d2f8691291d8713bba61cc214fd98bb08335d241605b481b284eba99b8f924d52294757cad374b4f41302d2281e2bc6953d5aaead68f56a7b0209c3a6c04e92dc677bec3f7325f00f442681302b694d412125fL : 0x8e5c3827b1ba864fdf093aefe0bebdb1ddaa3bd93f9703baa55ba73c559345b2fed9373a23eaedce54621c706ff6097260c9713c7ec902caf2a680378dc13dd737e4006640305ad8422711816df1b03343c865871a2aece69084810976f917b9befa88d4a91d9c5932765b36f51e78c27ad84966d19d07c7dbdfe09ad722b3bbL} 9 | {0xae3b0233b559e92f5ffc408a7c0586122d763fb0903d42084e9d6adb1392758762b6ee92b233d4c2700ab43f85cd45d2650474b51f0cda3a5ba7d804fc9a8ab8edd567622e2ab5effcb673f3bb38f0b3010a1255add2af856812c09b24dd2b82ea0442dd5430be775f6af39fe265e659943044130f677738c92ac30a9c94c881L : 0x95724c838e0011fe1a26c397276dacb65600f1e72eaf875abf3a3a10c8f3acbdab82d22f34b9a91f2433f87f3a65c29ee66041c80606f9b840919281549dca061a66a13938dadcba3c02f213563cb19ce79e77ee710ca1c9a29b7a690c4602113bf8368d296f6cce19f4367239fc83e562f8d831776881ee46e7bbf851ad9903L : 0x288c2d786d2d949f04a0da3b0f9c0cf65e21b5e7d3dd0717d18c4f1471da295eedd5695d21d02ae0e951d79d33d72369880c75463ebe15904d7803d35bb22b990690935277d65006bc0de7cd57dbb5387227bb6b00460181a7ec6ddc67f999219c8ab68ce2b8a0b640922597df13faba21282a99dc8a52c47a1ff02c3b813676L} 10 | {0xd02fd6194ffb062fcbceee633f7d3579700903d57b0bd5a08c6147fae5a88d7580f875c419b636ead6a71cdb2d32503f3d9a5eb4a98ccb222f7d220a51e0838af66a8439322dd541d202d8a3049c4a5a8335e12c6d50fac62f3c078e2bf15ac162c6931ed88444d328affe9a8a502cee50a49633d23b8bb7b519946e07c7a7cbL : 0x238d3a5ee0b12212d87463d365a0ab2082d986922694452d7b8139141490cca3c450dfaa8ea90c096d508767089f955b3f501289ae16f01239a43f134865ec2ead8fef1a6e3ec48cd51e046d07ed6265006b4617a31df5ee3524268cd6a51322cd2872cd0ca3e7c981fd19a26dbc14b7590ae9876e651ec7750742d9d8179e93L : 0x30403bb1489a35c09cc30f1d9dedceeb00b4050d8be677030bcaeba778cd9246fb4b156a725fcad6aeda562774138a3c33ac241b42056a23e536dbcd08747b1ffcff29f70207ab6007a3558692d4aa145397a61225aaa03581f3b3fcd87d6d9835f0d6d26c9569841e7f1d45eea3c08c56d5bc67769a517d9cd7f9867691cf29L} 11 | {0xbf07d46d826d3e5d368995bc9a9ab2ebc88ea05d5b0fabe7e72f54798b649fb942eb7f0efdd21d5ba8e7159045171e3b61ddd8cd16473632602e8eba2f7d97ea02f1a4e35c54f803897220a540029761eebf4b9478048d92dbd16d2fbe2fd7c7a573370c36259c751fa2329353288b702428414a7b2e799af99d5c53b7c88e7bL : 0x44bcf55e8ec994b437c631b1bce50dfff0b8bd125d939cec127465759a9cf5af2550102dc6f82e7f1d2a7a7d16f65d895737486ccf6211c341bfa40c32c12c593f315b8b0ddd82440e9d81b6423a7340dd91346cd9aeca9454af1c4efeb88cc9820e02273934df08fec755ec002eaf05bc8d48b1b4783548c7d1604ac504e3cfL : 0x70da8ee0b4c8afc59302724d649635cb254febaf11f2cdfa1058135835c53fb5b95282979cccd0e08797298b59d65dc7440f705d3f01f7877013878451d334248b6ad38550158045f3d5132d0da49531010c5580f75a2e03d3a64a0fae7b1fd9a88a69a7e2ff513360e29c48c740f43cd89c90f7eb67ce71ed35be003a61f8d5L} 12 | {0xbd055d0314bc2b9c15fa53137ddbc8068b3c113f4c76fdddc0a91d38185693df97d733bfc32195e6d3d93097c1c3f3def322c7eba1834f0f1fd461ab0c24b2106f0707b1f8f1563efbe22d90bcbb2bcfefda9a2b082e9e3cdbbc024a1b3f23df602d54135d6c35ac5d1fe8228bdeaf72f8e9bf6e6915da0f057f86804f5b029dL : 0x3499d4e32a457bc26fe293c88ac07d25e668026a6a22d9ec21d5785561c4819aec246d614ac0c89b6f9e20412d074b03306aef91e5c8c1babd30df71dcd717e8f18461556b0eaab7d59c6b4c72fbe3bf030cdb351cee983480753c3c94b35286c8248a4030f5295bedf9e33d6e8ee6410c20166fbf225bf13d58cc88f116edf1L : 0x5d10e502d631a89370d6e0e3d6cd99e86e4749a9a15fa62878f18ad4ce41a3032cb8ff19fa4392b9c67f8128097d22863c400a94853223b9c70abc79502eb4fb1987a242584854645f5fb7e01997eca32752ca002e5ae8f5a4ac8df9b720f21fe88ca84680afcb45ebe3ab5df0a223f75c8021e30c2ee9946736f5a93e0dae9L} 13 | {0xdc94b61cff1202cbc6da57e581d2b80bfb2f0840aa71664b14143966f96c291769e6c9ab54bc14f6aea379bda145cada835b7d873a723a128363cfec10cad3d6855cd22ddc06b1d320e46f3487026feb071f783d8b533dde238aab796610a730d081725a1da688e0a02b52784f49d28bd1cf6a5a4d83118a3a962a6b3e00a305L : 0x9cb302ea6ede664a5eacf3ecae5b6f38763fad2b894170b124b71e3247d024024f262b4b220aac07e754a0d1168d51111ece56a0f40eecf0bf64f63803de8f5ff52c9c96c5fb74b3b2c7e71d030012bff1037968f6c08310b038f4c1ca7508a7ae685f4227a5bb28dc1767ebf88c741ce6c55c2dabcfc0c22bae71aa539b5197L : 0x66d0e55b3d0065c60e9996b231d627a099edcbd0f39f6949753c73cb0ebb0c363d57a002a85cf91cfe50a37e9772a353cefca8cb9f8197eccfd4852fbb601948c39d88e5bb5d05f8fc47e9fee5473dd59c438a9c31556420ecf8417de1adb43a1eee4fbc673b622ea18051ce9e4dc3f02e541c1cd3332e9b56c5ae06c91db715L} 14 | {0xc6bb93d8cf51c2b3ec00913a813b5a5d2d6dd3f629108bbf9a3a4bcbe0d126ce763d98c26bbdafa2e04440f9d1c9f3c1ca805b7868d7a8be3fe79d500846dca501727aac26376d38dcaaa5e7701cccdf78e617f80f960c158dc172859c65537ece31d1cbb853115870191d333055c6a65db14fe303030bf09b27ac44ae028693L : 0x41705173ad519a88d51fe15bf23a293242446afec51de8071d4903cd3698896b3e972a94862dcd4149b5edd2dc9a079622a37db67ea9ae59e728ffefc0cf3441a4dac466ecc1cf358136e898a04e97e7f7b92dacc02ce7dcdae136e75a9671dce9f06e1e9132daac940305f61e0e124645aa75e88098ef030e194f8a0d40f98fL : 0x1f571a4197d0ffc432eb929636631b8bae2f28956ac495b252ecf99dfe2b963391c62cbbca0e65c70127fb6d072560a6deb8d7f9b3d3161f1e06b77dd3fe21b04e6ba97b8a1c26900935fcaa0173a4fc0f8c0adc60286a435d2dc8e98db160c9a0bbba2b5871128584338e0584eba1b0950a58e734a51e3da0c751782c4229a3L} 15 | {0xaa5e53ab14644628a582e93c77566a8cc2c76ea51cc53c6d42cb2967bf08cf838d9f741caf54830bb7a5afefccefdcd70d46f7bac5f3cbe29b8f7e882f0946aaa3a28becc5f36413729c140b1f0e08de2808ede1cad501a6e94f6439075b4447677ae1fa0e358ea4d0328e28134020989393d379a6f8d8b85e72f41e4daae737L : 0xc8cbce32253fece1eb82ae9fd817ada79ec4149956e54deb5b4816fd04245b43cc10db671adbc6bb45ab54647601a3d81eae604af44985798aee45ffb3bc8b9ceec458b21cbd1f6e856cb29851810b97843c2c5781e3be288bdf0ef56991de78d4bad76bc30ce9863ca100485880756baf09f61cc4152180f154b135b7458be9L : 0x999430c3cba17c86f22f3368e2d335839e797a7b8b08523c21326403c5a68c2778c518f7326e70ba0cf29e0d09b16d7d719db1ef3fa1025112021d3fdfeab8051181fdceb7d4556912d8f897d375cdc6aefe28ab0b3a2dae5b92a3415495738f906ea2592a5260d6a48132f0c3d68363fa51c5345834297d7858c69700656b53L} 16 | {0xa18e3997788ebfe91a5520663ba290e1103d03ed5f07b5e06c50e205aebdb0d3cec3a647f97f810798b42bba4dba2d868ff0c9785133d7b28a973e6d953a3d3d4ee330d23aff17be690d8c98883c12993b729073b746470e9d5f0146ead321168ac311ce9442093955190fcb543c3cfceec68f6e0bd079d252fbb1c29f53707dL : 0x91ba701d5e3483fe2a3c95397bcab12453ed99e1b0908c04ff4eef3fcc9ff062525489fe45738980b6a24d199451bfe5458210dd672895d55386adab14c2543a0d3b75bdc1b260334cc4dd4e282680d20924fb2832dab71128f9294ecbaf2fbae143ede6fa2acc53b1ec08a70cf2e70feaff3db51111c7f20b8f871be8fe3941L : 0x6c41fed1fb47debd4c1b77d6bd0b844dd9c4569872e3f2ac4670dfae517eb041ee0e184a2236110601a164a5c6cb4bcec76817fc43291e327e96ac62620b49aa8f174e84ceef49476c86fe86b2832f412a1d15414c68f9e427e170e306ec8a85824563d047f8c184a6ed2997afd8e46e64117d9388eb2eb07d9a3a016eacde80L} 17 | {0xcd046893fb72e398c2dafd3042771a1c77d5531fee70da1a9f433dbf2b053dab854bcc05b6a31d7589c545e5389337aad8103dba1e5134508b5e44e25e20df3c831a4e9a7b37e055b930b9b3ecf8bcaff7672d3cb7eb92ae07da4b4653e7e642df3f107a37cd98ad70729a395d82e0a22028420606feeffe161c3c05b86ba499L : 0xaf1fb2ab55a23ce82d27aae13f05168cd1217f9d0a2eb334b15f8d7a6e87e1dd065fb3ad3f10267ae60f2f3af7d8050841c0eaef86a1d3c4746c09d9b9ec9a89533a531da81eac26759814646189393693fefb6bd4134f3a5d4cbcb2c332f5416f6ae53675782295eacfb2771cd917ff161ca471bedaa9f508ddfdc7cb020971L : 0x631cddbe226cd475a34ad19d78699116fdcd98b704894bf5e05ed68548986aad4b8f3f119a563c22cabb93f5aa25c9e60d7e5e6982ed79d8fcdaed803259797bd7b3e8ca7da604fcbe15d455b0be37e3beb67d757bf6a2b850f98f71818b02def3898f65489de99a3caea588b661571678551803adca87e538eb5b3f51e0d56dL} 18 | {0x86344a3c9e310ce95ff5806369fed0b7d3cb5c27393c932d5d3d5b1afb94cd04a6a88597f9bb0de6bfd66565a4fa0363183752c78823cefdd579929954209b05f6fc91f98686a4a0c8b073166cba6eb87ee07757c8bc71a63a0f35bbefb1f5c20160a4e58f0707193aff03e3e76e2938dca4094389618103ce9b6c957c260f21L : 0x712b3d1cb2001f5f08e09251ea109e90050612d77c5d1db4ac78163d02b458f57589136b57cda1a5d304fe73d1467143d83e768741becbd89ac927350274da5cfa9c1bb77ec4eb735a7d5497cfdbca2973a942ad3e4b658601e8cc42d486364d59152883b9a0a3b45fc396b9f571a18bcad46b39aea1a864f865457558da3fdfL : 0x5649766590717706bdf30c43a694be22de57e6d4cba8d19bd5f7be3e5dd6b6a0409932c819749edcc5e505b36eb0eb10943787bababee70efd954edc4de578c233abf32e496ca3c07864988b9d6f649187453475b842a7131521548690eecfccf031233ad75e4f330656701540ce3c2ef0309b3d5344cdd7a6fa0896fd0475f2L} 19 | {0xa1b0cd88d04896f9a75ab36b91421e6996597a81d926cb13d3c95edac3f634ec5edcd5a3a791773842e353a08e14fe83df4a1b08baac0cd7c706b6a6bef61023ed12bf5bf2f5abf9e246d4551d2d8b2c5f6cabc2cac366328117d7113dbf72ea165d31277d837ade49f4bd1d1f6ed3f2da2765e67b11ddeaf1ec95110bfee40dL : 0xcffa73a1c03500fe9bde05ab4bcb504bd616522bd7d098a0e79c0afb7fa06c1a2bd4cee9703969289e4515349eb8c24135107f34465f65b6ebba6fe101bff123443739128dcbf393649eb8d2667041d870d620691c2ce2adf60337e1fadd0da47cebeeb5ab74f5cd88fc6d30a99a1a7ea3dc67db736ad280005d28af1e600c49L : 0x572ad4213931ea2bf6b523ff136f995a61f6d61780a19371db2d4ff84af8bcb9177f72f476c8822dbbdacd2220a300bc90bba2e02e728e38cf1eb4593381ea8b7be7287f17002bac0a99fbb05be018083669e84ceefa537f5257b897237117236e1212c612321f0284ebe5c7a68d684c3f1c4b0f228da6ab34a4b2098bfd11b3L} 20 | {0x8400fcaeb8b63fb1352e88f89421083efa8bf06f714c21b1e58a50025985c28ced0685292cfdb277111bbefe04de49ec4bdceb1f80bab54a56ab3f437681c03f3c98d7af82d1d3c9004c089c4a3a32164a80bf4fe3bf4830b57e7f4301bd8559e4364da164a43aa3364bf0a2dc8afc2c55086c1408ec8e69b6f76745b371106bL : 0x5c9241cd25d5c7185ef7d45c93194800810e855d5ed0e0fdfc0e11760bb681c3b64b0863554cc3b28f9931a5b21ba7da8c809a7e57e0aae6ea588f6a45d6358da1218080c83da7f6803932b130446b1d6a7437695c9305eb136f952d5b350f486c21ace88621cced7476414485a15f8971f8624067f694397799994dc8c76c39L : 0x679ce6ab83c1add8f09eeff80e0462d09ead2f244c508be986610561313fd85341af83d2ce1fa11aadf62e1bb5c46e9ae301ca2bbf37d8e97c8e88d00230ebec1177d40cf198222d39f9ae2c43c5182c3cb6e8496cdc35609dcfcadf618bef3619ed800b09df86afcc9ade4e5d724b3f56b2f859c0415e8eead901de49d54d68L} 21 | {0xba31000fa39efa168e25841e143b59d4a80168e07fe880a31927efd61103efc7f98f013bd8cee284e98d752302a55ab2cb0bfeca4c086e5bb9e8b9cd22248cb47d1e9622ca6d687900bd4fc69b9b71db89772fe4819127d01b92ebd3a269d0fcb35979074b251c674c8cdd57285f376ad31c44c69e2668f96ee3f5bde318be9bL : 0x80873848e420acc78960f1983a62e271c38a6b3e02d7f0a635c87cca402ef65026a8ea1dda27dfab51ab08622892073f1b24c33c8807a860ffcc24152b16017358728319a2361a30c68c21fdaad4f43e13df6ab823047f8df2f0f74d5ac6e8dea74cda4cc7ffa697905cf96d1929a3f4dbf8b5bd23d803018afdff3c650d3f75L : 0x42f4b283ddd982099f46ee10c2cb1fc68a1bb2adb46a8291aae7d14bb0f30f7807c4c92005bd387c9def9ef8ad271378c55da4919d55ffc368d8c48f59ea139e7a0224b9f7f908cdbec87578ed545dd8dd18cecbdca5005ab3c6dd8bb72425cfd9c360878e058161c274deb424786e82c4b000154baccad27be99372588e1dbbL} 22 | {0xc7829cc05ee115e23b4f7938d882f6d56336190a25fbe619db9115344fe86ed314cf087ee652405bfaa09df3b9c716de655f60866c5fc8a7c5513c9a202d92999e70d22f5bee05f5712a32cd4591e9bc7f34ad71d5345b9e4e2cae0915d9fc88abcae5e70072d06fdc40a79d3c46be8f61eb6d36125c1eebea44268d632acb9dL : 0x76bd3719b39bcc120a0af915d5f592d2ad6e95bbf1a40d863d748a0bd215b0f32071e54ddb01a65d609e280bd3a5916ba45c9597ee2db51ed430b670f5d13578ebe8df5f01b6668d9ad7da9a4f62ebc211fa058c92d644461c36388f7fb431020b9ee2be1926733c9163019430ac4b65d1716ea74479a68c2725bbf90fd202a7L : 0xa8e20aaa0419c7204c270cca486eabad1bb5fbf00a11ba1f473e4c162f6c30211068fe959ea89337c8b6a64ae882ce6e8c789e74d1b256e26a53c4bba59b21e9598b0542af075dd546fc77c45c62ddfb1c196dc174fca9e5961efede5f2571fe797f55edc4848565a6f35cf085610b0c6821b2d30e5e4fe9d78650db1d3d6349L} 23 | {0xaf470c2116b2bc74bbcadd1927a99975e6b2006bb410d62ed59c468726da7ddddfb55cae94e9544b9b59c33e56020b4058bf6af150d5c31882837a8dd098763eaecdc67405478413723100aa8e91c8d4fd35d99d03d656b60f377c0f2fd7701bf3ef943205a5a1e738cc016de9e987df9ebb42c0dac07031d87b313bd8928741L : 0x2557a0575d07ec2796847a6697fd2fe93b52d1724734bf929e1bf2986172fe0404df89a232940fbd0681859270dc081e634f878fe2c2eca1d8928d9aa45bd9a0850fcc573fa548d54f4a0e7471706cba9216bbefbbc9ddd7b072c02d0a94a0b869747d0744db839d30a5e7b4fc4924d59d1e424677992974387a2c98b73fbe61L : 0x12c88427efa7fdbd93722b65f9e392376814d6b50aad03b20b7db18679b7a390fff5bee0f702d5cab98c4dc3694280afa78a95eac10fe6c68e99db0ecfa8cd7864a8e169eb235f53b1b1af2bbe99001299cf3bebf12b4e61c1c485f7388a9f7b5a738ac2f943401aac47006dd16908230adae4d1de381f608f08b85626a392a3L} 24 | {0xac5de80be72594954486de8f7d9313f7455321760439f551ef6dc0c6d5bd7c046ca188e76db8cf8493aadbbf9fe66d2392280c3a3c75b409b540cc6f086d3f4c41da5f5254ef8a45a900c4f3d668736d395d6c6cb73aa97ffaf586b027327f31dfccae81bee4349c4731ffe1bc0b2810e28e8c0b966cce20392a3adaffaa8d59L : 0x57b739f4954889c6830290b53fcd4f0bac1e936f45cd7579bb30f232e079fd9f7295923465fa5cf0e9f0e091149cd41a144e2a105d9cb18a828be6b3575ed75c27fd8a1095e64bcaae7d4d03e60846ab71bb912039b3c8df1c18a19062fa4b75146ef89ef04441cfba74ac9205bc7f2b2e72275c56fd55a0207f496023b4b867L : 0x8794ba21549d2470684767d9e416e917c9f2f374471ab44064cfb312d817747b63409ed611ea8b44d07dfbcd98d20ec209bc08c9bdc9114272a51bab98d0c6d05ad6563b4437b7b6f5a69a024e3b374f19871eeba5b0d266152885b9c7372c025d3109e61b8ebd760fbf50e3b05b30ea3dc6faad42f4d19099fb68b5126a6622L} 25 | {0xc60a8036197dbea33af7b522b5417916de456c17c669552a68d558c4eab003ccfe1abcdc9079028223833c954f9fd214e5e1854fb79aae64f6a34ec3ea22fa199985c2162c3993d5ded28d6887ef31da2518079c1e0335a796cd4e5d5777828b04e7c7be58963d4544e3a17ae231043921dacab1d0d33e37ce5d8f7ea5061047L : 0x465cadb2319ab99e76adcf7400f90aff63b4aa2df8ec836dee22e9398c622d1f4a5b310cd47bc35d3edb3c40edcd09c25b2bb91d4e97981c65c349024e919bb0ca353e3222f8ad693f523b104dcea021dd632f52f85f52c960724cf9ff15a5ca0b6e3b7b2e49a5ab19d1a6760c6ce1031840d2de01b67142109c47b8fcb1c253L : 0x55d6049e552dd829ad6dd36f1dc663bcd1c439257f5b586bc1a88245313f37a8720da55d63e103986df3827d43e726bdd73c9e0c0f0c2ce26455cf471d4d60abf20ea2904476f98763da116a8faa7053971fd795d6876e0cd497da2ce8d619539aa6ba3f555e1eab4f34ae4d0045b849eced6411c3f35f87fb79b2e8dbc280ddL} 26 | {0xb753144817bfa89b215eb52a9887e7fea1b21dc52efdd70e416fcb7c94434532663ac5d0a01e07b30da82be6c9109ddabc53e27708244ad663855e72b4fea815d7d9ce639b4ccacb02daa3e98ff21ad7c65b51670637721413a226b195331423034ae1ede60fae5bdd896d4eceea49ecea15336f3a0123e8065746865a3d749fL : 0x22c5bc5f59d151ef416178eb08f71cb96522bf728b1a92a99c583dfefc18d32c349bbad023c6bf9496e1903cb7fde34983d82440386878eb81e64bdf9ff488eaf69b5ab360457e7d5c7aad4929f45002a4699be0a0a1609376785f203a08ae9cd05eecda05ec8b9e50935f820efc0234cc43de18da7bc06154bfd0729fc7e0b7L : 0x5f1b63b7bd2928182b1b8649c384d9e160253280d2f82d4830a2e899a152e0d307184f05ad1a27b15baf45c24b49aef93d809572c0c84e95ab2a2ede39fcc819f2a572598ac723bbdacc9d4b46eeaddd0731becd932d8bbcb0aad96e3e536ce2e867c585fec6c991135080059be2f2f3643d2ecbfc9e9ce2c77a1bc85d6e7157L} 27 | {0xbd2eceee38009de195db0c6c7661f9360c5e9ae6bc0f49fe046452f633034c1413698b70dbf493594f01bcd2aa7a4708950bb2e7cf1626fa9550e3e79e206439e4f222b8bc7aac0afb8c695c1ab4e367c7c552a5887dce2af0527c939ad977e85393e46000f82f803d63e88708e10614faae69eb298b39ac34df5136418273d9L : 0x133cfce5d72b2c70cbfc783269abb74ba177a3b4840ec414b161092381fa05ead711a4baae3d1c80a882728f2742730d47530d1a5afaaeb4c42e62e12548b5f784f630a5b37a8b35040d5e821196b0a486760b2734cfb83112d59b67ed80ae18e4f5015b9a1c160cbb5e4f145b83c979188dcf626f2eae565fdd4d240f2db19L : 0x69705e1137a356dfc5656ef8f00c07dc1bbf1f613d4237cb30764f2e61e71a13b659d56a4397c83e29e6c32cecdf861411723bcf207332e93b32e2b33c66043f2b6a4325c35aa9edd434ee04be7b9461460c62b74bea961be0e44363c82779c6eeca3019713bc5550ac728eca3047ecc8bd36d6da272e26c30d38ab7dd21db02L} 28 | {0xcb7745ef1e540f141995dfa10d232732af8ae6b002543ed23baab6415f99911a8157febbeb7ad7ecab83440a7d416b692cb69b6a7f90a90d40fb34b7e23e0d09090abf3ae6455c5b933c3f741425bc2265531562aa4a714857125605e420c273f229fcc300201748213deb16d885ff321fa7004152b2c0a5298f99579b5850ebL : 0x352fdad6490e11b28bba57feea1ffbc3879fed62cf21c3de5630dccb83c8dad53d693b90d992dba22fee948c0096f48caa1a6a9123c89f4da3bae1338cb65acb5144484ba87261965794000ef50b5a2e23f3b3191de92edecc8bd1d017e321ebdff9fa16bb3016f48e4991f51c8cfb41f544e69c78b2c7b6d1f7a4a619e04d2dL : 0x1f58accccc840eccaf9dd0ff2c5d89dfb9bb95ee568b0bebc2797cedf7955e9853267f20e04e399a0f15c367cf257bdc830c5666d4bd330093205f37d7f068b154aadc2718a02631fda0bc308c17ee009fcb4fdf6bbe6d7f39ec99a16f31a1a8427c0334447d315c9ed3a5c4af04a90ceaedda8656dc931ec756bc7b1d970ab4L} 29 | {0x9f71390c68ccd6c21639d4a97923927cd23d495b64d2d54feebccb05023b2ace57582f5f3b721e59b3a4d1cd978b7f1a5612f22e9c78ae3aba6b3f38ae43de3432551ae48d6f6dcb4fca5dc88daadcb0aa41121a05a06c06dcd7065e553c767e48378a669f55cf7f4ee6ac2a87590daa8fee72eff35b55ebb1725be5e0cf3569L : 0x6f2e9ae4928d6d34f83d580aa6fb9c55e625d5096bdda6f7a656bd2af93e3dfbd93218173942eca00615cd9eb68fc9d68a574c0cc9c1fa20562e75f720ac16b07ff3d58e385407ba690aacebf8e772361b492174f0efea16d39836e8ab56d30af50239f7aa09183f32b31358842d1d2fc201692be5e912d5c078ec21a3cd6dd5L : 0x42c25fdd122a325fb7f4a827fa03d2d2f009bdbd652c51d59dd3fcfd55f7eeeb6639eefcf97ae38cd9839451ae08a0497e60c070e8b99082e3aca4e4e896592945551b49eb5e6d70d8fcc944be84729f45a073db03e6d37a74860483845d8e11003c2a1619641016ea934b5d469d2d8683f5e52c37b01a03800fb265a1fbfa69L} 30 | {0x88de41abe3198bbe59fdc3d90b4079fcf11f667632b2222ba4ff4125871032b268fcea5e97e34e4590bd4565161ebbc1e8cfdd9cd8d111db37ba3fd26556866c0ba01ee2bbebd8d7c6332eeedaf719a2cb3202cf169ed2a9fb86900f21ad16663ab09f7ee228b17a658b8cf3e6dc0ad513399a81fefbec13cbd7f74a34fbad43L : 0x3b14f9f7e78bf2ae87a899b742530d18e7c7b965147c834cb24e9704b13f30bb352b1a757fe838a7b8e93fe927206e1174c2ca4e121a2a41076a6bf495819a464a642b5a9526f6280ea4b049b06fa777e94bf7b4041cab0dc91446e6011f91b5957c207981ef0cab10163f103c98ea670ec521ff133077dfde6b90786aab1c23L : 0x293f755f594a26a2b10f41af29628745a819e503af44ade4f3e06e04b557e1c18809860f413cd7b2688ff36c6024b02b0b3c6f1bdda221e2357e7c02805d6b28b7c5f2f873744ce6dec08abcd36323836787608ba5cc32644e33dd0d8818fa031879542b3a5fd5b24fe7e07d4558242a520a157f1ef9ef62ec0b5f8f94114da7L} 31 | {0xc0e1a9d4ac410499b8c627e150038838f65210ec3d51ef819c414740161ca3810ed4d70af63f783b5e5a76a8502a1889fecaf395602ff0f6d552c48788e394e00efa4942a19fa85ca4ba7cf442e7b2eee5e8518dcb36aeba75120cfbdc945f8518f8413da58522bcd82c013250e699e254b2486938ae9bae97bc92162388d2bdL : 0x3c8595c3c79d38317201eb32cf56bda278af7cb7e052ce474387d736f8df9501b8650596a33d4f6f5b8c8e01a852e351c38e049dcbd772f8833938b29dffbf5744ed592707145779e238657e844e13d35051d554aef99cb1f7b23e1f651d6fa06c01a9858a2c42f0e84a53085a2a344e2bc82688e7be3a20657383f0a3beb3f1L : 0x7ec65c3a7915a7a4882a75d03aef9fb57aaf88616b0b82230e3ce6698fc582c0a87f616d67f0223ee971d35b9ee8443bfc03c84dcff01f6f56e5324bf12deb760f53820bc7966fc31ade286de51405e33b4db087305ee863ceec4b44bda38beb8be136515fca7266cf089ea36e50425cf99514292c585fd641f3c3603dd4d47aL} 32 | {0xf908615a8a356a72de29960df992cafbc0fb6907ab6664bd98f3a09cf3c8d73a8eef19bb50b5b42267683a8a1ff6e835ea1aa9bab44d7c087b32e5383e1b20bd0c58a95b364c33b60bc208e4e6ddaf577ae4a9139bba464825e079d6e6035f5a7dfad564cdd8575b4ecd858581073bddf96f3085d230fde70b8e5d8eb2f1804dL : 0xae22af5f54704621b787f8386398bfc3dd84eee83cebf6f726ff66c6a795f10e9174c1445b6ef511f70421d7fa38c0887f33334baefcc6e214b090e8814d8d23f7244e850ede4153a17d4e1bbe2b3b1ec27c4689666b13a86ca0d87789a26c69115e760564fac3fa212bfa71bba5f606fab118a7cca3e56e6319c945a53127a5L : 0x8e8192031d6d2d5b484d1de8cfe013f2b9ab9ade48702341d8959ef1bf083cc4fa0e35bd9bbd16a8dc8d40800e58d2e31127a568f4d07d3c752b0adec53b9b80d534cd4f7bffb4d8a9c99f469f6d7cab779323cbb3729104baeea7a8e2a3ed878dd28d954573d8ba26678022222323182bcbaf8ac42aeb0210e2311c3eb113d1L} 33 | {0xf3cf8481f9c653c29ca3b17238deda4edcea6e1615f94f4a2dd625e3df1937cb34566305efda51e76344c351b0e2be8abd77522f629cba015939d6c8959759dff66349d825641e0f263225e53e8c9349ae18ec7323d893cc85d5f24fd1190855616a7d7774a4a64d2e807b09ab279ec50e6e700bb7193219fa12a11b6970bc35L : 0xab4b7ae3c4842e58f71567657d39db4f985704569d48d074ca7b88196c017335bebd2cef7727cf15323221801e6805cc83bee127004ce522218f5e5f5e0a1e5d6f0f024f09c1d6d4ee075d60cf7260bc79ed9978ad2a483280b7b80f1ed74487de0cc898286d684b613a8418cbb2383a46b25b984d519837d6fe9635aa92b503L : 0xd7fead42a4b2900601321c6db7b6a9f3d4bbd39932ef9b1257f723864f38c8433d59f8a58c2951bf9fd72a9927e91c62217b671518676194fe6d35bd0cbd81a58f189f26bfdbd811cf714b7f3d1b614e5baa3051d3f9eac90649928ef5cd9b8e516b26d41cbfa332034e5ccd1b864e99063f8929c8c3f53bb0f61fc92156db14L} 34 | {0x8851ceb4b810f3a8d2621b773d9a0d7550f3642d1de4ebcd4b709115517083ce1161e6f99c00c8089108bacb5d7715d0f7cba179ac82696e6f929ec3447075cabb0c51890289b24763881469f754abacf06d015146dd99f9c283c9e382a80b331ee2062c3db34480d0ff3d3ce1d3c039e91fed86fa73fa83369fe2f97345697bL : 0x34d91b51e0c42ac3b00900027964ef484facee6c64af05c632930a61067a2b12b1b4c0d13511889b5d596f3123621786e43b300c4634329955b8f7a6ecc98fb07f51e7302226e4f046eb3d1a30ea0edadbf7812d9aa62b5f807b322af14e1bf4a8328f35ab9a6ce24d46488e82db05f7b88321c0bdaaf2e38739f798b0460a91L : 0x7a867b68bc31c2f9a780c10648f6ef18d1a073294841860e96993753984572f61f2b44298274a9c95148d86affe03de4f396820f08680ef778f773720335f278f2703958d7a7b73b7cdeff80fb11845da0bbf50b1473e3a77e78afee73c27b826fcb24040b0d23d91e266af2d796c7d5db40ae4b51cd0d5bb69801dbb4a311e9L} 35 | {0xba630f029ebce87282fcf7875df7905efee813843758018ec7d3edfa29468a138f3a7af4bab01026cd5dfeaa8c9af46d9f9293c3f5fc4b471d37756bda936d6dd842ab456ce1dfcfe8f9abcc8dde848b95d3232d591740e0cefcf12c1b6b0cb9f1a1544bc0f66849789cd64823273636f8dbedd68068f04ec27b344c41440c41L : 0x9b912b3a63707c4cc44e5a73b0debaddad4bf471d9bd8dd4a966a5907e8485e7e9ce020f414b0cd3e18d8e3ef3f975c5c27ee268526cef1eac966b30e2982491fe4c016ffb8d92d75cf2aea2dcf9df24f62b0e89e26a0c04246273dcb83dafbe7a81a771fe6a434c5e9571cb5b92c733cbd2895630882a8717639a24d7490983L : 0x3af33011239ae4d10e3c3447ee1e5d2f93fe6d9b5bda04777c95dcc33122ff8738aa997aa016ad48bad444f700f5fcae37292cd3a226c65027ce3f230b567abf37f23b11a4c2ae734fec654549e4fce8427867522a33c1dd4c71096c5eff3954a11bbb402bba5f4e17ef365f75b464c6887fdf8f4dd0d2939eec8c09d96540bbL} 36 | {0xaeb213604bf8c6190cad0b59e09bed52e614ccf0ebb0d563b7e147507e3897114a71a761085130b70af328538020a7e7271421167d4722285589b47fa7f7457e355af569c4885c1aa5199c385dc5f880e533bfa6e81b2a1e57657c2df0e977f3cfc6b880d72cc83ecb0e87397bdf919d693239160b10a378e6d29111e20889d3L : 0x1d3b4b417cac1789b732ddbc481d892e3c08cbebd421ca7e7eefbc98dfc28f3d8bd270e6ba3be4d6f9028769ba1dc513abc4300530fc3b12c9cfa65589260f92b53296c1a864fdaabc1e76d4118fb567328d5b4c2f6bf19108665246f989c2770cbb93083a186333d7543b6db586fe8b3a06a76fd40a4e96baa9588ff70b4d0dL : 0x89ee25a5d30d495fb9b9f8606bab775a4b22b3be3572d6e7dd9a0c300a314c8e4595d39efab22ad0234049a4c889de42db3229d00d4dd38eadcfddd8d56526521bee8e0f8cef981f008dc3dd8820e4771f6f6795fcb1cf11959a6b79436a55e47c691dd2d6961f332cf1c3e794a49f9736657221c06b7fb2189995b9f7f644efL} 37 | {0xca5981132160b48d526ee5a311595a6521e14c5fd0d0b70d837b67a910975906e8cbc171e05c744239822500106a37df59ad4f3693d0537dc5ea27df2e5bf9737ea18c3c6c6ba81185c58f6023359077ffcc9295c5aa307a1dad2438c9301b4421e965029ce18d75cf0b7d3ede8788b59b1056d7d9f05bbcd1656efe616b4ba9L : 0x9f4b1a2151ae956ff844a7519636ecc863e3e94e1897c0bbec8519ca3db204bed4c449eaf8415b9d865cbb167da9463dc95af045aa3ca9b0f8fd1b14629b42d7f5b7b271b1d56df40c0c92502a06d637d5989031ebf22f52df3a758069df00848a150764eab648e2fcf01d2a79b837dd90a7240b75fab61797133f6ace2d81c5L : 0x278f6a014edf00b2004d04db59fa5b4b9b48eb0f8784e0f483b3de26362ada208195be4351c0f4ad803d06c156ce5cc001c30521b4fe50966ac4aaf1a6bc7c7c6b20cd67f9e333631bedbbef0f36eb801f34d6f60588df4a115bc51217e24db1b5cdac8f599e2be6458ac351b59d4cfbd726036e381f3dec90280a7b485a99b9L} 38 | {0xcde15e002f6461047f3c92ec89a168a337ec7b0986c14fa070faf99071e0ca6b4495af55e09edbde136105e079d57ad923090161da17f0c4b0c6ceb9b967a4d9784edc47b877a5a3f2411fa034e878cdec91dcd6fae2336ee6f445928104708010c23153a0ea4faf30ed7d428449a50ee086647f14a8256e55ce9855c55185a9L : 0x681ac0efc9d57357c9983b514910c54f2f73e7df131933136bd2ea98aae3db98836d728e1ee966ff4eabbbf7d76c48e7021c55701d871456bcfd2dee16f3b5618a7f1118f1abc6ab7f1f491190ca972409699cfe9ec2c12d3f0234cc028fc09e71f2977cea1c2fd7b42f64fe4c9cf40ed07e1016f0de65e8c76e39f17c40f3a1L : 0x5d4e5dce5f399513772306e9e2d4dc8a36e8c54e47f2d2e99a9f7fe810fe5e2258ee05a2f83927316dd924a1d343550f8c47bca851acbe1f3866fa0823c5ef6de63ba094057e4182fff5dae7aa3745b9e0e2fda1ebffe7cdf4d11f10f2aa279ef2a477d09ba5a9ceb7bb259ef4e0d91178440599fe520eb4976258b4a1df6321L} 39 | {0xd18a9419ffeb700664380f3244f2d9ba33bc4b9e1426717a303d381bb14d8107c733ffa4a733bc09b5d8e04279d32ac4c7ba8fe128a8a2cd0c3ef7afdfda0be3d222cd44bf4f3c55dae519b5bc98256e10aa2b752363427bdc4c4b4ce7bc27ba7cb92d22ed7df5ed189f3b20a4e441e0cd7cdfa80d0cae88b4a1b963f5c04405L : 0xa507d5726f522bdc313cbf2f53c8e5353a301c7aa466c5b2843e8f257b1493fb096c617aa5e2808161ecd0021285579b3aa18d6563067b123be93baa644e9866b9af92f6886861e095413c96d478c06fa49c2d6a75bb13c946ff685fd045fff9538c7f42d2bcbd9d96f49a5cdfd9eb2d496fc8028671a3cb0d0df33ecd393391L : 0x951fe6130b0509e5fb0b6370485d9abe43d8e97dc4f2de18f139b974486dd116fe99f2ab526b2b28836acb111e11bffdcdee3a8ca8aaedef4eb7288a8f31d5819ac7f4b8d3c9391e16e76c960d700f7a49c2e69c768008bcef3a4ddcf714874872e21918131e2b7abb072f545dbbe5ea618fa4ef7fee4b8a546a654121c63b9aL} 40 | {0xb28d844cae55a22cde23b22c6259d363d40442d7f8f3f77a6214aa3a502d776222c94f6728d85a7ad179e73cdeccebb8c73996ee195d2a2dc6a26722fc22f39ab818d6a59535e34303db264e2d951730fcd6531dc856498ea35ae5b32199a79d9bcdf285dafe0d3106fcb0fe6dc0bec39e816ff9cc36fad4460a32b79321a79dL : 0x300312f74f2fcc17609d83c840e00f4e635172920e8c071976e3e767947fdbd15af1f1c27a08bd4faec0d4504abbe70d386042504e72ea2302ec6fafa0e339838a5834c4863662849373f10de79a880b3f3689deed3bb3c17ea024545c5e853896f24547f156a0dfdcee017417efc9f8a1a8e9fefa3415496f4cad0e7156102fL : 0x4e7f7f19315aee77c19600253779633093c3b500114cc07e039c6d80ff42dc3470d8f8dab43b5b9606f06c997b50eccc0ec6de9e7eb158837fef11d73740384ebdce8f5a239d9c8b6d05d7cb7673cdf6cd9380e5d64f0b01739b88036f1149492990f35f041806c4ac88589cb135b892cc4f7ff26b56740eab528bc2bfa7cd95L} 41 | {0xbaef801861fcc6613cf227043bb64d0858738cce73c47781ceb0c58080a66d8bb900bbfccb0c57918d7c0358d4489992bd92a0ae6b4dfac1ef5cb91af7f0c650bf5395ae0b9e39a227378daf0987ac4bb4d4e519233562349152cf434d032a0c49dcec16fc8ccf2fb1d9e1ca90b7c8ee9af23cbc38673db11e1c7e5a78a0ffc7L : 0x4403a096aa5e2c6e23c5b4f2ad84f13c073eeaa2faba60733c6d412bc6164c0cc32b9472fa41c453e3b5f9f1eaa0b9a0a0070c59add82545368898a121750f14858dc04a0fd9294d24798195755723299dae6d3526cdf27faf32c05995f6d3960ca0837061342c47ca4dc435f36b457ff15ec25af8de1d1bc9cd18e8b9529f0dL : 0x686accaf4594e4ea939f2b7ac7a75b76fff497844734e630fb1de15ec49cfce052361b352794b8dd305c5745704a11ab2b15d1e3146daa87857dc8eb427aefc5b9e7e4cd08ab2dc9b84f390f352aaae0044af2860fb545cfa1b09fe5cdcd086b5bae8111fd680ede16707395a65a5f86a17c0ccd45fcc58ae89123347d943518L} 42 | {0xc3b22b96b2bb74e08937ab02bcccd876530bc87ab27171bb7e15d88966712aa46fa957e3c58c222c5621f2c05acd69b8a969a68c8ea3886988fe562def53102b8ae5a8a69062125c94963b49e29849897925b11bdec2680e759f4c5a19a98ebc581fc1a010027a43e37c6e7d971470f66d2af2dd68318c7c6c876db7914ec885L : 0x63e649fc4a614e5de848389796d3cce3eb34546157f7ac517a0d342a63253195e84a63a68c286036e5fe4a7973ab752dc0a580510702bc48228e1d09e48386a04c41be01f29b0cff087a84e36729d2b6060a00e44cf6bfeb3473cbc9a66addd6da09b33c8a2e0045d33e0bfdd186e17950a40d58d715ef1ee1c2761a6a9a5f35L : 0x3d0dee5248b544858b712f5c57ef38ae51d8d884b02485220351a6e96fd405deb8fd72a7b5e5413f457612f49eaccc5c6708e023d9c93c9ea6952b46178825ba1264a8bba7a80c34132e0482733e585e6c30780cfb67d6380728393875082b2207b8541c23994734ddeeb845c2f88316da9d6b9a7535ca186c1e9865892ee40eL} 43 | {0xb4f36710f4430c45c0dc4aa4be76b4910b0aed75fa549ebf690936ee4f69e4bf919c2d14361e4d8b88c3d864a00bc85cc9f067697e7d5089019b897943e5cccb655ddfd570ed1a9a95fd54bee7b4141190be0a11d4b1e8add40dd18c2b8c7aa101fb10743e98f2bca64ce71caea8e76c69ea5d217696e00fcc4a63946b6d3973L : 0x42c04a72ec8437843f5635440f361a35ce75f688949b9ae2c83a711bf3ecd36de73fcb09a58daad9d201855718879b16d4baa14edd172d1d5d75edd1fcb5010e09619a0519984a4b188ec3f68e07598627e2438ae55c0e4259ec0f2c9312d54e647ef995ee42e3832e4a992ddc785bc7b403ca7f41213719ce78cbfc215b0a49L : 0xaeb92ea9d02d2327216758a5254860bb3681c0ba0dcebb140514f7dab2d85158aec8078e6437da38a8b3c8654af126004948bb5262f0e5bc1b39ec6208dbfd406a2827870bb8fae402265c6ab18791741a927590eafcdec6ccd71b4c80b2684d81239b1ac4fac59c39f22ca205e67ff9e011c5ec104847f73c91a35bf43e28f2L} 44 | {0xae68b61fa387d58d7737d9f6a59405db87c50de720e15ffee87a3cd47ab0af08319c2d77ba36372e966fd9fd4adfaf3eb02191bbb2c4231793dc83873e9a13d88afdfafd756bd4fda888be1bdd8decfdf41b4ac6c53877af4b8b2425e22309d254c3f46cf1e4a40910fdd9489185198afecb7abea3acfa0f36c636a23a1f142bL : 0x34877ec035b08f0c5b0055b8c4d2f68e1e6a6c9d0ca38bad4a72116d5a8b64fc93e02a2fea5394822f61626cb58313638b6eb491f8edb51b6e83cbd1e53d6a406620cd48ad7dba337876419669552ad0c80097f3aa5ba3b7ded875a2025b2b06081c3fa8ce27a79e6e9cd672ab61d4c2abf9785a589acbfc2d8ed1cd2aa064e9L : 0x947ab03f0b6207ca6f8a0c39c104e3608bb511995aa35bcb646cdaaa57b4ffffa29ed21caa87d72cd7628bd091043c48389d124cdcafa794f3adf8401a315427c627d934b061550b5ab316b767e00389990b9c933018fc62948d87a4bf03046e1e462eb88450c8cdc0e206fdb775dc31f15b51e9b0cb89fd4fc7601e04c5aba8L} 45 | {0xa213f741102afc50951d044139fcd472b0b5b05ad42f4839cb49a2df7d840370c662dfac3f5fb21e1871f31b27782ca34e0d838860685fb79b78e4563e32f928a0dafd2aeec2855f05e7dd1cafb20867ae3397f3d9996985bb04ac1c79e10d5d1eef33fae38fb75f72e6e91a5ea6ddb57589d0c08f95e59f887c4b9faffa382bL : 0xb333b3594e5d5b221c656cfcae81d28056c12d3b911ecd14240a9531240c5a29f5d75e40e87fe4ba0a2d902567d730a815a66372fda0070a2ba985fc2a2b81264bd87a52730898fbb160edcc690de32ba6b2c182e5c2cd7990a82810ef8d0f093f3669d7829cf26eb810b63ebc49cecdfe2959bce8e106b3d09d559361b918dbL : 0x55a757b314be2e303ef9438d4a6adabd296d10d9f86b83b787a4310bc21b222252ea22948f07c3f9b7ab13e7302c3cc6745e8e4c3ca84578b44be67b4a47ceb71edb5a860f1c976bf60a7f2fd21107beab40a0acc6b3451f4a8b4042649ecaa6a8f7ff4b4f01b9b42da01a555ef7d96028e4d19822d16a033bf0db92cda47155L} 46 | {0xca5d03985a262bb42711b13aeea83088ccc79ec011c2378eedddad7ae04b49896fac1d02476fdef0d969d05bec3fa892836ecbcb29ee6c83010d3e49a380c64c9acb8c6c3975663d70dcb30e2bf2b0d61b8748013c09947c80de2dd021bc6bf319b0ef9e843912f598dfce09d2b9e224dff7e905f6140e74987da219e5bc43abL : 0x9065059809cc1acd01a21afb07e3687469a2cf658ebde6809387ba346a4ce42a2087e9285f786a08621a0847b5a09d48975b57d65029db3ac20536bd0d02e6ee8f2acf0662dbc558c00042ff47bbac82915cfa16d80a6dcd015cc868bfd5af4a7caa530a5a4453ceba161047bc26368a93f17a694fd33d7b8b0aabe44d1f09c7L : 0x9274c19ee02103584f1735337a2d02eaecee226cf3aa45445538d9b524a020e6c0fd6c99d1b46311503a4d1a124eb6010ff765ef2dbf2b6b5ad2d7116670dda43cb44e02e294b0af641623ac90297854d4f483d3370d579d7c480e324faa80ce5afb35046d78056441db99dd4d9b11d27d7c8bc9435d3dfe561784953d7b0805L} 47 | {0xbbf4bea3d3489a7570925bc6f9e7f54d2ea7cd620614b0e48985f0025d61c6d71b518ae7d28abdd50a2d8ceb23a6a09d07b18f5111b29e5e23339ff0d3631340d6de1ebfb819824c29316a781afd8ae8288e5bd95dc476263a175a0509d3b2c78b46350b07b4c4bd10c68779ff9d8ca3e2862dab256d9429ca03b773b3e78857L : 0x9b4cb0e7785369ad6ea613be1b9f5abb7cda3a3d2858c8993dc2473dbfa6cb58d68f8f1cf5ee9cc286c134512a54e5be151734ca329da88ad0f39831d4ee40553a614177bae1f9854a5582b9df98a6b8a16203033c89da6975008f5ac52d31e0bb0d89e365933c64c9face6bd139301f3cfcaa570b357130506a7d4adad2e871L : 0x1d9b184e48171528c724eee9daef95d50015b37832577bb7be7d35e9f62175d37ecfdb30a2aad87f65aef019703184450db005e1eada1e4dce4af1032a0f503aa115b97bb55d5cd9516c1992532b726a855ab3074f214ec7b1e45d7bffeeaea48213646c1c3df72ac4df5381b0532bfea4e43924fed83e6ea2d4b346d66b8d5L} 48 | {0xc483a1aae507a39c79fde02abb24857e11e03df27557327cf76c33c403ea2d9b8850d233af63127ccf6115e25baa742527a317ae3894249e8ac6c1a537df71e45785463f8f3d5e19017774d5a110fb11d89d9096997e0f2cadbe87c92991e8a194a9c3372a453a850c94fa1016c0b858efde8a6ae9c0c8e327faf2d35569f5f1L : 0x7d791350a97d9d18048e081f2d12a327b40e65be0a0f769c2435a972c8c20bd1690f63ea50a20cb0364ddb1970893ed71fe42eb6265b3937b25ef916ac3052b1b69c3896c321b936ce405b55e28580a8b56a17a2433adb29921737083d265ecdd3573cf52e9cec8a33219f23f48c49c48135841c9f4c0497c7bea7296c2656e3L : 0x529ddbd40b71fb67d5de45f05f0c701cbdfd51173d7c4bfbd0b801220d1f0ec9108780aed084d33f825c99fb59bddc709855a0e8dab8ffe01b66bd310d078099a380b73bb3f06927d578f2d9e2bd8b91af40044643ace8a4750f274f17e4c8038bc5a3b3751aedf95f07ac2eb144f32d6d688a9c422f63a708b7826834c13c4cL} 49 | {0x9741ef83fb19e6cf021ca6676fd2027f8e72c5e055b110d304ed35139d45c81bf3c9252c056fcd2c9a8996f52c9ca581e809d544fd6ebbb3f7ac27ad1ea67697701dbc3413c0c040d9d0265f18826f7c68f60c6f1ec845a0b11b5e6abc3fa3485332690425070a94baa9bf18be990d633eb512063a4bb61ef3a1c06f9b6628cbL : 0xafaffc6c052fb41ef1ee6922d68c7e44ee4ac2d8da4622e4aa96fa894e1520e47c62e57353398beebf356c1f7a046c2012c269a45bdcc7c427d0d97a3964c3f30ed07bdf34460d1fb66d78a48c4b37540cc5907e11498cb9da102ed8379da9e9c4b6939d8be3b8f5ec6310d99a859104b425839800d9c48ae64ac4af46cef039L : 0x8b81773e191097cef3d82d9b3429359bb15ccf6d5d3ed780cfb7db52290a4479d027f3ec8eafcb92df8243afca276a8bdecf317de2f0100c687c0a7d0da7bfc6e353fb051a1cbd72b37f3e00141f89e71c2eb72f232b1008b0952c1711dbb19e231314ff6bb6ac9c43a17d1a13310281bd3a64dbc895b424d6b676b08fd9652fL} 50 | {0xbe20cd6002e265e389868d86268d22613885e49be8d7a862bd5eca0fbebf49695deab8fe8729f0c99bd6371f5eaf92fca54ed9ca4e6364db2b473f1ed0e20a7386f125c5061f2854279b04c1cabfb075bcd168fc00dcc5034bc52c72f17354c3eb87861cd38d97c400c1c7e13e6109fc2d285f03da39f4f7bd2b8e70ee4ddc75L : 0x701f0410fc3a9a7afe1f7c98b649181028107c86aedb6c6a88edf96f3f6d0d9e8979ac47a45d646a88abf7a5281f461ad50671d7780ab00071c9e4dcc4886694687f7b8fd4c29f18795c18c5e4d98d2946b28241a54afb97f9a13d675e3e6832cf003ebde5b6b6bc2692a05dcfd81a0822194840b30101eb2d39e8841213e163L : 0x7292393b9910d6e6902123734b809e0ca736421e8255dc409eca8322d925cf66dfcb4cf0fa22fe37637140e898d99ac81e33b0101614e781de89e9b67d3531cb144a9f7c2c9246e8d9bd4259a86f4a239de1371800c40eff227ceb7420f23cab64c7090b0823d9d5aba2c4be5225ec99c386ca0ae42a068c1e77fd52169705cbL} 51 | {0xd4d44bc95550556077a7ec6dba2cc7aded2ae5951118c4417c3fd72dcd52789b8e2d0868cb388dc145f1cf7924b58945381b5eb5b2779e94f5535e49e3e802302efb1978c6e073c755f6edd67aec3fb431ce919b9ccc73c5acca0d1aa3e0b3b500309bc81406ee658750ce1538fc1328e7fb17a0e436f103faca81bcbabdf133L : 0x66a16d091cfc2cf34e2b164810b987e0764ea3b872c61dc4cde2b819ccfcc39fecd811ce61b81cd486c6bc2a363d81c3562009ab52339fc7b8d61fc757b47f01d2c09ddd7ce5f41af6d7b80cd376810ebe4b43c6cd40a74de182fbcde3e4f76fcdd08b49bbd47caf4e571221ad2ea0d0e4dd86b0ddc96d4283bcaf377b2ba9f1L : 0x11cd6beb29fe81929a088c0959e086854c0ebee08a0c63ffaa6ecdc285dfd18f2bff95daff7ce7f6172fb7cac2c089569b44e0c2fe3746c265a3543f57d8c6d71e4ea50f60eb26bdc499f2bcf0677f00075a3bfcc432183819f319d57d561728660222107f1d8a743085ba9515a660a6d991180bed2dcac35dd7ae1cb9d93bb7L} 52 | {0x81895d901d50df02323fa7051dc1ea171173082bc5e482ec2665a34bbcf2cee283ea8ab69b6eea78433d6ab0c0041886e6532c32b5cb90763c488b3e49cefec2ff0a97d9e6962a673d4aa6cdc927b43c99804606c7b9554235da53fe032813cd636becf62e9b7fa741afb0a65f74a92eca9ae5034edb86ff89421be63ddf0371L : 0x72d95db0f03808220e1926aaa864f3a135fd57accf36349f35ba94dbaf84dc2eeb7a2207d3094271574ea66a9c67c0a95c70de450ca09cdcf28100f97f4686fab7382294223cfe5bba72b4ec01c533c986bcfa7b451e6f540d397336921787f3eeda11b17d57776ab16a512b22730e2219aa925dd09769ab39196e2b0928c8dL : 0x592511bc4b4d7da32dc364357c0007369907166e3fcf366c92b55b99d7b7e76ff0a9e1c738d90c5f4237232f3a16b30646f7f7ba70ca9d6f1febf9bfe22bd92c84392198ccb9c6775120e320c1e9004ca1b4211a6d51a2224bca180382efb0131232fe9c43a344b1da9e1f69ab348ae10cfe234b4b9d32e7f9030b5c4275d184L} 53 | {0xc03bff11f54ef337ce81772326998ec72f578138214a5502637bb5853d9a00d56b373968a3f718e4580dcb374eb4d5624a913578b73e50cd9345840934605bbd69339642d6ea379dca67279e233becaf1a393af8daaf0d33819c0424ecf5669d821a8905828f7cee6a9535aeef879fff3554d9c04902c696a5f32f8b72dd3819L : 0xb0388a92634e3d0bd6e18f0f9ca2be089fb0add72c1c565b4489c8a6950e61c3791911433c34330ba06e9c52556deb97c239f71a074d272cea1348e86a1781b38e2ae9ac47291111d29156874a352e7c01bbfbd1586bf1d247cd8ec1ab0d5c15b6b62ae42beb3f82eed59531d3ce8ca394f260deeeb63d4a3068d17b34b43af5L : 0x6054789a26fc76e7b7f79e330a889c99aee052f56b1279f4b81737f24c07e317958e6a87346d47faf56c55015c1ce4bf9ec5b635a50da7e3d6f225c9eda32d457198f6a54b17f50c4eefe4147d35d45073730b66a0399c9b1fd5d693bf9657851d34cad7cc7ba9cb089f18d1eac08a3472790a85d4fa98c2560936960d826b0L} 54 | {0xe3eab19c24319a2cab391311f7fe3372ea32f0552046862c80d8a710aaa841b016663f355847ad796ce9cfd72283f177f0f17577d636901f3bb5ea498b3dff3df4e60e6ff0dfe8189bdc2ec768784ab3664711ec750274b297a37a9b709805f37e03ec8e80932f9510479155c5e3871f0f5dc6d5c000606cc4a064decb69c96bL : 0xa91037d4f7a4f4f4d48ceae5afb189fe088198a19d95ff27b36a1a720660262c4d22fedde526c3de63e1595592229032c338e24855d1aebfc97e8b4d067bba169d285f130bc8c1b48c9b5cca13454f642c15b70ecdaa7300756ad66f0a81f42739d4593be2c203c5099cb392c82d407a602ec311311b38b0a5585182b2bcbfe9L : 0x7a24fb2aa7076e5f9eeb639316064d73443e73d6d0cb6f6f6a080db514c5081144aec16e5a7cda9004bbf47e44c8bfac5eb831320c13dbc778e3c7f1b28fefb87fe5b4dd33cf7168c095a3b3bffdcd95856cf07b984137c52a745d4e067d3c8981ee867f1b266781fcc37b8ac579ab8ee561ac9f16a3cf94253c6fb53b04b8a0L} 55 | {0xd2068a89f643a44c002a92764e0dededc710d4d6db9ca88b3139d6c31a19d3d75ac8576ebe780dfa78ad370eef1a3bcef7e497dbfed312c85dd29fc770e842ee501b39a523020284e29417808d98793c236ea3bff9f9530ba3fae0a40cba19d92d614d442938d4721ec605cf54b87a9cffa695a0fae54cf404e4312ed5e46903L : 0x5441c81fbf88b79fa462d40d710d552cf42b3d48bca8e1bfe87b589984631df680df5aea0c9e17bd1cf4d4650f79d7b687b057306c7db2f1f1b3ec32f3ccdaa99f2fab691d4fa84dc41233532ecaf298ef6b8b35724a4b98080cc3d29c0cd6b238de1a5e74e5099b4fead437900ef30344337e455577d4c310796564bd17dff1L : 0x9e7fd857692d76240aabb1c44abf5267c8a62cd4a144a33fddb9f5b2c0ab051b4704c3e39f3d2fc6cb916dbc8e451600587f8bf1405709a131553f02007902ed2bf928f6e02204a69ae6e5a9ba69be49072bd41955b410a3c2f481e21d12c7e9534f66060edeb0552af1d7bb4a51cdf8b9f959e1de238fefe017bf8b46517d38L} 56 | {0xe85f9ddd63c59bd0e7b2292e3bd463e351db2181a379f7ccd4da8aa9b2c52284ce8b2339111976eeb5b8e51c878e532e2cc7f1323fe21c4711f8f3cbc48f4187e9f2863d76177cd3a40f7b7005043f5870e57f2b2ab4d529c6b755c4c54477c44d8c5d160c7d9a5450b21e9a721de705728a9e5f7139ca1b2508b1c39ded7dd1L : 0x18e0a686f005c6d30828e2568ed7610f10a43f87e052475b6fc970ac30959d99f5c733d9aec1e5faead5f7a5706e483ea360b4a472f8a30eadbfe1dd16d6f47cebda6ab1e49d3ed517e068e455dae42b84f44dea21e1773893e5066441f46d2b8754fb0c2b8ed5c0f4f20e55e5feefcf98013c285897de500f46be1cf0c18ce5L : 0x6809be050e1ba5d1c97022dea18772da2406c4f5c0ed00343f9179914902b41b0e9ae72f1c337dbfc4766cdb60eb5ef38f3403ae666548b774bc16a4ddad46de522571576ad30368776c535c520a560cbdcce0b02c41b6bd53e0add63db000d7d982151504440f331e4d8e16dbc4c7e6b67fd6cc0b14d20f02e9c9f4046ec192L} 57 | {0x8f9df9c84d3cf248d2de353dca153948110f2c65b6d37b4f30d8399cd4f4415f0f08232f34b37c1138f6224ffe0a31539ddda32012425a5e64be81eb295a1a53cbe00e24e0790bf9d31e6e98ce798e497afcfbad7caaf66cca6992672e3d6781d5d419b6101d72cbcab514ca972a27a80b189abc69058d572ddb87f8921b585bL : 0x81b6ef062fd29e0120a6731b5bef7b738fca3a79602e5c1040d06eff2128630600ef218838746099de0d64fc85441999acb95d10afae864605dfbc4dc5365c767847d22a24b1a0839dea583ebaecf204deb5756bff238aabb2b421b955961b66a9d2ce28c7d05afea74c763a4825789bae7914279dc2ab68f4a57f0f7fc5b9d9L : 0x4892eff70e301a03fbfb192946fff5a03c07a1d766400776b4a1584c363637b71da480300dbc73c70f5b8bc767ae79f8aec743e8dc22b9c987aebbcb1f0780d79008e954b668cd5fb630a7e7cf27326923b54234ee6b214dbe9ee0a3785b52c0548d73fcfd49406bdbc488f401971d3ccef108ed94d41724f25f9354b56e56f4L} 58 | {0x959e848576536f9825134fa5acdfb6f2e3c517220325dd27f9d65ff6f0dc6515cadb1d4fa8378b83b6ef0b90e5d59abb8fea384a0b5c1ff0ad50f8bc5b085babfdfb2d1d29afed80842e38804c1665bbb6ad45eeaaf914b0168bb94f860e2453161398e881caed58509145d782c99429e39ae0b421c5d669fda670b8aa3102adL : 0xf5e23eabaf80e3f940b80b1d6ed56817550799df6d7c47bb1bba089c8f33242be2b67cff8b7de66d499ee42b66257ec108343338b258c7a3d5bab894111b6f1d0efd5ce619bc3906e6fa547091736365219b1bdf68a7f5bd7ebb3f22145b52edddc39f0925a6080d81dcb10f800a0652a716398576b9544137d6d1a0f0a63a3L : 0x6c45b04d81f45d2cc41cfe507a99d0b0fa55c08448cd5150120eaa3be2a409b9d4e1aadd8e87c7caedf3b2dc2b2a9de9ff7a96c8d3e4a2e4f76a5b08fd95fe498d73f83c548bf4ebc735d36dce2551eecae8c68ba76b8c90fd53fc85d904bc93bfb5f591c6498a86d4986aacbb43ee7deb5ddd77c31a03c03479bfa59b5ec8aL} 59 | {0x9150f8d8975eb9c8a2be79522dcc22260a995731e46e10b188779e791e615b6fdaf1cf2b13bfabe2f4e74ca1ba1fe78a658f59284b98507742e8ba5d992e656d7f54a22e5f9412144e4df510ff462115bbc2d4c089d743984dc0e65b5ecc418bd7b4c3607060e2260d9a4114f5d338fb9d79bb653ef91dedfe2120cc95d6ecfdL : 0x8d82589a974eeffca85601182904da5cffebd8824979b451dadc43cc4e599ddf5e2ea3668d77ee460bc745939573b14000e237740bbff12559967b36aad1cbacff200c7b3ce1911d2d9181a789615af777df62de579c6dc25c17eb1cee8dace2ce6cb46d18e7116e26f4794b2c91a4cc8b870030d03440141b7eed5196016eddL : 0x852972c576a0a4184e87e548bf362b64f3c6d73590ee13b0f9cae903f855259c6713981ece6e227af4018efdad5d690aa85f18af89d85c4f3958320812ab46a26b1f0495d62cdfd9795240b94e8bdd9be997328d37bcaa7a335f1da7201e1773536f82224baf7af8ac814de4fcc4b0876d32d0adc1e4d84c59c754f2faee64a0L} 60 | {0xe16b4b98ab14762691c75368a01d8786606c03f5a971ab19ebd252da6f54e9b1d640dcd11698a8b22bd349b0bff5b9cf27367f9ee0edd41cb9f4315ccddeee6ff22b31dff4fce572c59e1542a2a5aa4e8a5aeb82db55f24214672d3dcd69735863ec6977cb408b078e2224b5e0091513cfde7f19ed3ae776ff15ab499d2358dfL : 0x364adfbfdbb52fc348461f6485cb3cb6d7a2e6f23c69038831ec60f1790d4715dcf7e0438b6e75806149e01a720648c4eda34fed42eab22755bc9a8c6d0a7fd208d3d649a083d2c482e8e9a8949f70f7a0069267470ae6de28623eadf85857c4519ca5313b812443c481ea66f8e968bd91ee93ee6453d6c015bb929e0f0ae185L : 0x4d50c1cfb15525b02210832abe2fe0e02446beab0682a610d62645fbf890e68f60e61f9f8699479aafc138729e32b9a8583faf7916aa7f24c85feb12dbae8fd8996e6e510e9833937b9c3ade59c5511b6e70d8b30ccbc694cf5da4861bd891abbecd357078d32a8444ed10acb8e4204306a25688d74fec4eb92d0caa6479ef74L} 61 | {0xa52b6dd76ce85d4cd2a9625bb5d4aa7ef94bd1d49ef19f369035aee7d6f03bf00a4f9e93d6defef84a7de776539cffd8a031cea714391bb36b28030a9bd1931e359ed7ce2bc79af0d607b34f0e201097831fedf9063d565cc7aa7bdb0d1927ac18c49fb6999215abb8d119d841a1b22c69eda2710b8c2ef3f8dfdfee3380f145L : 0x655f6dfb8ecd8e4f0a91d989359179a5026910baf99c73f624002e5386a339253bd5007326fb09a2c705fd3adcc69294adc3fe9475b006b3e52ed525236aa005318a8d64a0694e89b264873425957ab0cdccf73f9d44d74ab6cdec812ded0f1356e688d8982a21fd8002218e32d7c94e256eeda0087632e7fb4c3fd00d0252cdL : 0x884b79a32bb12081839e1cdbb0430b061f4b76891acfb5bfd39dde8b1b2d88c9da35bf3efdff777ee854b11b04ac850b66888022ad988a2ebd0bf307bbe59d168014d9afca055c6fcba586bbce9a16c5d68813c885ef4c529946b7e9f8040ce30e09093efa275e221686e2da3b43ad4d93b7557c6521a9216d24f54bfe3ba470L} 62 | {0x944a4c4bba8e5c3206c5b4d5e75537f237aae800a8dc23631349806f4a8dbca3a777baf6e32360be0266851bca3387680d1a5f66e0e4e56418aa17f74ce823f0d8317727e021d97cf093aa39781df70a59589cb93d56296cc09aabfb0227b9dd77e9614a6363e54e99f8b0c5ee542e8f932fa5b49d7268f13bda93170ea4f25fL : 0xafef5933c1b7468829e2c87991cf0d39ea3651ffb397945e47524b87adb06a0ac006b8725a36d7053e528a0e71d0f35c486afd1641e044a89f558749ca28c92ee62a8d91b6a71faf36f23ed52507eebde8be5dbc57c64a9f65e04a7a36357ab57838a41cef7d0df11a3e88c6be9978d1f823af407e75f9c6f0542ed62b0e10b1L : 0x393cbb4180fb1dc98193e04736a7d90d31153545f3a8718dc09ff218f161b720d3fe4e047614866fc8b3734e29b6cb09db4874497ff0aef900c5e2256fc66c9412b2c9ee64100568a7e212e104a98767e78d771c80872b303ce031c58fa9a839475be7efaeeea503ca65bd12ae58859b9cbd8f60ce20d1b0fd915dbffdcbccccL} 63 | {0xbcddcd884b3b52770cc5eab6a9e899968edead94b551e5695d834674526d603df6cbca1e89f251443f73342aae1d2ea7abe40bfac16d400d3d99cfb7a0ef7f6911fd7b67786b947b29b74027c52e833f97a7196c479d9b3fc8d0f165c247fc01eeae37e390c2dbc125d53a23994d83d04a492cfde6caaf8092699339ba7f8097L : 0xc15fec0962a94d717a60de7df7ca0f4df105f451009b9c593db2c67c46137a71e21ea3c855c67e2a3e08636f33e3e6a2787aa2e7f2490494c6db34b6efabb667df11585696967a57bd745dc00643de61823a5a111e0bb429206da917512cb2b9ba02853bc69bcdd6e4deae7211bb8385b0d173731a585b9dfe9985bef6fa89fbL : 0x84b0243d28b835d1239acfc3619ccdd0de880cc3109875ae5e2c255d9b53b75e4bdaec76ea3bc6a8bf370ee0608c4d468fb9468ee2863473b69b4b7edee6191d04559643e5087737ed1919820dd764a237aac2127386d2ffbc2d65596431d209b98e6806ad297f21a74848854ce57fb699b10a31751430c046eaff008673efc6L} 64 | {0xccbdef98f56d3bef68dec8e45b9f0e44a5db547fa80eecee813de66df75e60bed590c1dea4ad2017ee9b0d587a44d557e852789ae6c601c867c88e76e93f0fd04d8205681891a82141b73c83213fab9bbdf791876e51d6a4a1e4215c229be249f118ef261559c0085edca4d1a75b1e59e8098727fcd7a83d1072b8b00db6f399L : 0xfb8d4daa4cbf61324cd00832e163bccd7fc9da8d08021ffc6c38ae7673f3819bddbedc91dd2cae684abc295b35fa4201983043b53a991d4e707df4c127b750b45b0cb99e9f071140f6fc0648296d38e824a2d6f0221a8be56d85cb1ba642c5aac27d7a852dc096205d5af1b4406952c8675f8a1265bd49af15e039f82989a71L : 0xac84f8a05bf42b0637e87d50dd08a17608724f4ccf14ec2490afa2d4b9b1261fd6c38bec147423b5b631e72a9bb81fcb73319c2d0dd170dd5596134449f65685a156456fb7152b04998f401ef81b9ebeec254a892c68824bd35508963f5f7e671dcd0874ae36ae603e5f02f6fb2039d17e27632be9100f9561731979f3144673L} 65 | {0xd7ad2d48f84c7abf36cc76c19cd69a6b7a3e2a1105908e6883d04e3432f413adb08cdb2ef5465a0770b3690b672acd94d1ee5d8fb7120e552ad6d941c578a1456699bf41f3111c4ec68c1fd1bcc96aae2f14d0a4fcd4e423970068611596fff61c8e314380e51a053ec9fe68bf6fcb26623cfa8cae1904ad63e06665b1bef791L : 0x35fcd41d5dcd7ae7758970dd9947c2fe99e4611303abe829b84fe4d2c9904782ea847fe6856ef0e49510e5c36da921f77110c2f65491aa02021a5c9be98d69b4b0087a4c560e5e42dd7ef404e7be7a9f41392f5de367522c957cf4b911f759e0505295c95c591670da805332571169454d33ea8cd42aaf0e60507af6bae0bb31L : 0xb020bb379f930a95bbf42f7b79f6a0c6ec11390a705fd0d569ea59a90970ccde52e91244c37c6294fd2ba3938b963d90a612b7640de16e1ff8d4ae1675226353a77a079b986566d07a547442c10040ce9ad046063a02bc5df92ab2a96b3337c305323b66e96751aed98810d62aa801586691de98b748acc0b94583fa2edfd23bL} 66 | {0xcec36e3213815b2891ef8d3fd659adf35b8ebbe76e47a4c03c3864fcd74930e43caa567b0ebe36509976537a6721516777dd5be161724a76cb10b8d5ef5dda71ae0388998c217dd6873e5c373d0d68c3e7919ab10aa473864c0b14f7aa3bcc5da2155deec38082387fb5992ce2a016c345ac1a00e951202cd509d2eb5061c0b9L : 0x337cecc197a232c20defe0e907c2da1f05a30eb20de04584c31bdb3f0d67d72f008db5ecffdb2935f3c2bce7dd605cd32ec35488c9f48afd7cfbcbc1ab93babb4ade51defdd689f333a859b8394c8ca8fd6b92443b9f5e7d302ee34e1ebc226b7864f8eb43a3d25d7d57b109452db09901048afcb814cf4e6549d9efc0357209L : 0x94eb7c0ac3143e706989a114fbcdd43aa4251c67aa6bece38ab050b49712676001b621d73ce4a545540f8fb2841c90ba20fa83bf823e7381f6a869ac5997d9d98030f510c2783b1a0114380c42931f171bacb41163c77ab88ac1b617102106b40befd546284a113074afed234329f58913ac857cd192bf8235703b9d3447104cL} 67 | {0xb51df9643667dbfc614ca56b9893125d4d6c611afffdebca57e5be12d0e26c0dc56237945def46519f37438f91a9bfcb0f6535fb0bd4d7abdfbc417d26d92397ed9d4fa0348c482d352987a6e477c674496f6326a164fc27a1e0bc9becfb5e0907694bcc6941f2afe71f613f9d830fd1438682e69d9a9180d99b178570e44051L : 0x89ac53db27f14fd47bcdd5b6dc0d1d70568d77a36bf9a8cc06911eb011f36f0095751d4b515a8f0b8aee5f0e533902279591573031bd3ee68c68e2df0a3e2c67c838ff5236c60d92615eebe4aec86f2d63aa7c8b2b0a9d2dbbb2732ae3eb23102b469a0bbc32a0fa75942c006b065deab7e74c59c4e20ef395d306d97344c7d5L : 0x6a3120dd6e3b4cf20774984911587080edf465e00a08110e082ed0f246ff631fa663ccb40b4caaf4e00317d8894d41c01cabd49f30ecb495a3179faae378c315413844657d7126606c6d1a82d55c9b0cd16094277f8afc9a6d7a04d0a1ed41834d2a262e9376a7e756e9f1a2af71a21fdc0a01d4d188dc75f9f29af479a9e184L} 68 | {0x93b95d0fa4d953896a6b115a15be368ca7e7a2f25609154409b5e4a84cc65ef74a86fc46c0d61d74907a282be0bbe7adc9c4787e4376ba46e3662be9c6a13ecfe2e4b58401884606112e99d1824b1b589c1cd644113625b11555933ee3059f299078aeb11d5715ef746abb961d8fe3ce9b637a1795bbf1e38cc428e7c10ed6bdL : 0xb71929c8f72fec0665d1ca2234139e3076615b5b5588533dedaf1a6d1c79ce4fad126df7438eb2a43a3d2ee92f4ece57abef4eac2f8fa244118b3b9ab37afe14ae2224f877c8561bcf19e72f3b82f6939961179f2b8792e486162c4e9e3ed010674760b9c17f5522ad3cf5d95a8d1f984ea5d5f31e38bcd2a456f8d3423dc2efL : 0x4bae3aae9c54deb490b584d49bc3d6ceebb15211a602f3b8c5335d95d2a93dfc98fa30edeb04b431c9619fe07ce104d043a9b894652863f153baa0ced1302657c5cbdad6c062ea12d5f9e288ea41826229c0669388b6ba843cbc383b6a486d16178285aec8474f9c37599fef3dead285a509430f2066caff27ee48fdc74c5922L} 69 | {0xbc22b2a697ada8f96160efa1e71f2ca3b78dbafa6abe031298a136447a27f02caa6d57ce4d1e65462f40124db3515d86a129a23447d237fc4ee0f6b83cc0dc83c1e1f8bb391931e8e43f501ccac6eab9e01c6ae082d05ab34652cef27a18947e1f27baefaa514a6e2f9253eb0e824ba3760ffe09f1229688dad61c7f32e2420bL : 0x31572cdbf8d5a6131382bc83bc4dc8eab9982743c505a4f9c589caa67c58b942d3d23c91ebada2006dd0e4c1037c268e76fde85c085216e17c0eb5b4fcf171d5009178521713b024a413d289ceb54fe497f41dad5fe7ddbd23f99674d57684287ebb58527924bcb27b817dc9f1e6ce5ef2670a3b51294a8493e70858d03e1e03L : 0x3991b5ad1bf7962c0d8d1bbbb81d1040b3c85510a203bdeed93b39830770b51ddafd7e2b00de148ebaabacd2b61779518e7af3f2bce9649687692a06bc4080ab9f30320d62bd97d9bd72707672f30ed91e47ae023cd457bcfb3def33469f3f2093e456ae7f302fa235f7464755a18aedc9bccc2c2453660cd970340d9ae04d7cL} 70 | {0xb11933d0a8cdd42557c61b7e973d5b5637a9b6b393d22ebd6086272c15b503623c7dd277557a2370b6aab5e18848702f14eea09f07c17b2b264ac863dd8041e4d09839bcfd200fb578e1f9081104f6ef4ef5f937dd48232fa8103d6a6bc1d6d9a2e9d02047f8c0783c9a725991cb66625e72f98552328a7f28602fb1eea84757L : 0xa5ccfd924eee24c4b17342902831b894f73f72658d5884229c2a4189c7b5721db887bdebee0435f282a095ed25cea549a98a84166747d1ffbf1521d214907b2d47bf90023720686a48400a35cd5c6a3f41fe9076f7c9442626f9bc04002d1c65f8146c8fae5534c0e470f0c6f3cf5e62bbd3a802cb64381b99e0c0311922dac5L : 0x64ca4de30c165c4c7b161099a86e234b815a884cfae7716ecdec7d39ab13cb559d451abfb5f53d4208f4c3c2f232da834d535a720283cfa84ff23a690dcd648d2a23f8f84f4aa2ff5b8d94749d09bed1ed67252571dfaa75db143ba7b3f06e7e94d673f3e16f3684fb612f3ef09eb33db6b19fd147263852d26537ee3c1a4de0L} 71 | {0xd1e8b668df20449b4368dd1698f0f91fe53b8c6cb8ead013f6b62a6610f1f355f1acb1af67b462b238b9a40a466a179855f565dcbbedee42e71feb7ab247d04c0e8158e93959c9ece602f16f294131473146f76b5a71993eaa0becfe8c02fc43e0e7d83f2592867969f8e996d717f8474e156fbca78b16104691aaeec6db9ea1L : 0x69d305fc8fd0547feebf131dbb6f6ae436eee8a154ff2f96b0160e9e0c4394a039a28e196a5f14f3dd4d0a6138f5934efb50bbe5a113bb9baac2523a7a88c41fc1f1478855017d112732fe1eaf2f381f66eaee0ec0a5454f4b4b71cb7a66748d1486a8dbeef1464ab0119105831c1cfb454eb2e0e3dcacaa8a21324e69ff89bL : 0x29f38ca7334899428470d5b09f26f1ec4fdc12349c7cfedfc261ed2e2088e0601d66314947c76f30147cdc73b5e92126c5bfc7d62fa71cc2a09e8fb2b0f7ad7f62e3fb2478b56aae8c5609eeda6ca19fd05322c4f4d11782c3b1a85ffb953de2511396c976d8d3f86d5e8e887b58929b8664ae4ec4c3d93986a6355710f7d366L} 72 | {0xce796acb44f0d4bb15e4a758cd568ea83074d1ce39251c9284b538b1d927d4dc2f545ae1ea6a6467a5fd2985fba5e0743b8c50a6ccb7482eb232b734c5a10f9eee3739c76efeb394f24a64577ad1964dc5fe63301cff4d21d35d4de6cdfc43af5b5d3def93d920becd51c5b3eeb03119e1b4f9b1fad93527f8d543c44076acbdL : 0x3da4c833737979119db3d9413150b108e103500a87b4a00e4bb321743f1500df4fbc9d69ae00b89af17d48b5a737a1da6dcf73fffbc91b649390af6f0d1640569eb82d0786e96e33d5e63b077ed263b6f7a53666225f56cbc39ced44e97e49cbfe47347ee983005d2e641f791bb9cafb553c6cf9674f69b1a006a53fa2ce6d3dL : 0x45ac870d22b23dab4ac25c6f7a1e287605c6eb92af385bfaf795cae8e6981a50ac8bb2601df8af70f22f910bcd981daf5f045381762b21e569b5b0b8f9fed7536274913f9fbfc6e1b6b06f37ca8763bb56a2f9841b00981ee4264fc369a338de99a02db49391e4af945e6eafc11d32783cb578c97da6a9e51a0357574899a4c6L} 73 | {0xa5d7ed68fdef824f175be3ff8e0e19a303ab8a194829b915197843b8e759418c38c1b55695c4fec8d995c0dcf68d318a8f1e25f8c544b8a5fb0d9da395c33ea8193933a575290312ceffd6ab17acd1f403feca3298e26fc67efb55c1c8a45c2be50ebb6c5a670709c7c4018dd801fbb091cb8ba3dbb509075c6e105339fdeabbL : 0x17429be01500e2f55426ac4bdf7635e896777249c6c895a7c8b292f773ef93adc24ad690d8ab171c98e185a9e7fe15cdd806aa5e3b7ea5370f5b085e1dcba9126a18c5d0bf3509a0bd4ce8ca62c57dcad2ed63eef3cf4701cbd552705e52c532d7efed6666c4f09576e27dd2b2c18db783d609df50994834154e8a2296898c91L : 0x6b158573a7bdd8ebfba0a4eaacffbbf8db8472a4aa4478c495e8f0c3f2fc46e7b012b009603be359a04e33d449555bea7668f62bb8bd5498d49a15e98390c4393f78291eabb3cdcb64439bfa7f8ad5af5e6abd63f2638b3c918b824ad3232a4bbd40ce146dd8e1250286f3a0e52ff60bed7ac7826bdd0a8330085953d587afabL} 74 | {0xce17280d556ec7094f8b67bef9870a8d28c414abce9753d904b978034bc38031dae97301a43bc9d4c4c4bffd5b720b247308cc3f7a705ca4a67fac347f864f4484fef000007589e46f2e3c009fc3f974ed1fe5d29695dd156f522a08fb8b3fa829ab77c725c44dd9149117dab5a1ad3a60de80d523b1c7b568550089003cdeb5L : 0x46e0c7ab38c92ebed229a649fdb73daf3c4f38910236d61aeeff6fdddeed93fd5ba0ec99024f7a9b70d26c6349eaca5eb2545bf988af2302d564050c03d145f71f6afc74989449ddb9d38b0f55722f2f0b52fbfe5b8785f544d91e8572e40f2a00e43bf3460a75f2ec6af36c3a2c10b1dab8780d2c1a277badd9d7edab019001L : 0x18a8e5eb8ee39722ef6363e8e02ec2e319ccaf08949bd9f0e540f399fc00ee6af52c29dbbc985ae2d0884c5db8c856f7a456510cd12d0b54e7fbd84b98ec946679022ee0bb8ab1c15cd2e16f6789bffe12689d65160626973a434054d12ba8bab44e3660ed0089894f406903ccf4f13aa76555365fa79f35ad91cc0ec5f91197L} 75 | {0xc0a807fcac53ea6f6889e21e5af345badf7bfcf87517f325f606816cab3d315a62200944ccfbeccc15378dc7c83d871cf7c6e832fc85fd2fff869a7c756138b9ffd19f4c2af8d958942205158b7f762fb8d5a3ecfe70dd5d04badc383ed3f6d6165e75dafd0484fd497c2ae9f64cab65f0b97ceca84a267f587ce9c0d2c20b0fL : 0xabf9a00bbcf61c20df8affe4b1d4e8d8c60f8b39c18ab64fe40b526a52c6e1239d3a3dac5b73b61447e91d8d7ac151c7285028f66b8040d68d0aed8917fe7d963c487e3eff7aefa20d7d5eb29fed769ebe960dd94ba23e214ca8239fee1f72cabc0fef845e72cd2c06de7c6949051ffca8ab3d3646abc572c6282fa31a3965dfL : 0xb8f304702aa6e8809a2a324fc1a2fa83969da7d58fd9043fe1f9cd00f6f70b4093510322f715f4a7403bf8f65b221902b1eafce02cca51e482be501981709d61d82519a71822f9b7b519162c2c7675d1c2ab3ad853e314e8e8369a7355d25b982a88d634fa66e33cf4b5730c3a21b1b1dac85c03c81190cc626f29909f82e526L} 76 | {0xd148bd8dfa16cf72d423b8343e7f29b39f499a9ce97a36303d492741d46a4591659f66cfd5ecadefcad54f27f5f9b7c580946d6919ce6e094c5ca07ef8a324d8d6da57ae49a20cd0878b8d4d5fc804990587d6b4729ca48b36ea7ddd054ee85af9337b8ab709b9823e16fe8ef79839402ef86b4875630b9446fcd75b0bb52863L : 0x5ca44d3a079d35daaa69fcd5b4917d987c7ce375dabbe9afc5030ae3a9ef1a2c042cbc075bb57e635b6e8ddfd13c56edf378a0d85695d4742b1c34edcc1526898139f2f1fc16cca6f8ec911a03bf63b0f52a97c18b0397ae31a9d30f384f8ade4dbb388acf7e0c48bdabe25b097bb0163ca161f39937dba57b3cb57445eb5b99L : 0x56dadd9d45bc56091b98de53a4362bb643f4724db43c92b91256a32083d3d248dfb754329d41bb6be48c0ea441f43f1513b7bbc2575e02102300bd3f2beef3354bc0f90e867375aa04f0ca197daae47981835a4c7d00474b1e12681ae6bc42a38bd50f6274d6bd3318e72ce32732ef48399d0644dc020a787de691a0f49c8844L} 77 | {0xf408ef9501b822de315b53a6058cee2a073017c572c0406d003cefa19adbcdfe8aa42f7d54e44ee7267f156b024d7fda7d173981f1c994cef2267be3f1e1d573e70d4267e66c1e294da9cc463aeaaf6e6f02999b0cb806cb7242440f6b0ab8c4dc9d9d7b00728ef236f723220c0c2d0652d87ae3b6445d7c5ff7eac680641633L : 0x15400197a9273e7fcfd2a916516aaeb72844699284e46796e8c5510de5f643402d258069fa0042acd71ddc0bd0c1b0576c539ccfb785ef6b38cbe64bac51c34914a4d6409dc77550fd3e581d0ba0bc2fb5e6905325f4c993cfc740b797891f1256d66dd57342248484b526cafdfc40fa7ede358b42516826b3773c0f1921e6cbL : 0xe6a40c4f8f023ae35694f726d9e80c36a0a7f03ba8ee65799d3d782695e9ef43cf84bacb0a7c7910ab89e2bd02a45964c3e84a87f9a0ac6cb1c9398524b75b2e9215ff44d8758bb4d0b11bc40245474dd7c6db8aa13b5727b877d63537466cfac608ae1826d5b904c478494096b81f02234cdb6d9c7dfc7790e151bf180535fbL} 78 | {0xa63874173042191e01b57df7ab4054906321b059b86bcb771ea6b899e0c48cd9eacd198f992896f49762cd4ea41888118b09ba12cd361ce06c1bab96f4306046d6db5a720e7a0cca61fb57d1e4327463032cb94da4d4e73c58e559c6bf3ecb4268070e444c0cad781bbdbca539b4dfca52c721f2276303dd4441cd4555c391fbL : 0x17c01fbc890777ad150ca0d9e47b18ce87ca7c2fe74543ce326bb83973f37a20ff96503deac49d08d93e5c9113921412735a55783e0d09dca6feb13e828d9218b4f06ab2a18e5ca2c62b84d1d2cb94724f0cf9e7d6dfaae4e7c6c0e024efe2f4b1c03051fcebbdd4c636c843a188f8a2a31171873cfa19c0e2770423b91f307fL : 0x76ea330795b58736e3f1d7660d81950a0e80c2def8572a808c09028179ef2011bfebb592abaa71cbb947fb85f7d41378474d73e10e184e020493cfce0f01a63b42df7400897db3ed7896995a9c9bbe4db68bfe2e4b1bb297767dccb13036a792a273c30feca7f3a227025196b2fbcb39cab8e05c9c583407309a995447841b87L} 79 | {0xaaeae1ffc5544f8460522ae93b05ec5490897477d28aefe3eb35d3177701842966c3a80d57512ee6735db27eb7653465e20d5601210d9d08e100a710a408c5e9ce6bf9e581a8ecbca1fdd8253a4d3a1803406b6c81975f1e1b871a2862807fc2a2ac34cebd03be0d20935c9b7a3b90ded7f029bf4829c50ed081766f7e64fe65L : 0xab2437148d8037e49aaba2286bae22a2ae90807a58e889bb5e8464a199857b6bb1d8f256dc1f21d06d4986a347dc8f51fb0231b7f0418b1491596987f765685e9d028527be471e5035b2b8865be6f1f4804cc36ab7951cfc78951d30aa57d6d6eebb3f1bdc8dc32e7e3c76e32f07a7077e5b0efc6200d37f7564597366673f35L : 0x9fbd00b48f1326c6ce24ac82e96780da4e9ebf1acb79a33306876236547e52818ecac49f7315214b3be8c921e37c5c87ea69e354ff483ded14dc555f77cfeb811c4def8d64eea3671c8b99c3b88e3a5229575e8c8b267297a0331497cf1ce6cefb1967d61f44a08fc1dd97cde09efa432222561d477f1d18fd8a3e26eab7f7daL} 80 | {0xa3c5fa0f2031b369e6dac6918d84f492699f5f4ae5674bd7a1dcedd822a251cc97946d46cf87156bbcc6e7ebcacc77147ecdc6dc6ecf885e6d4884693d91e0d470ba1fd3ae748c0a45d38491b2b4acfe6a05fb86232eb2ef1934eeca60c43f6fff4b1cfbcf37370a3457b78032644792c05274c176913806f342c3c79eae32adL : 0xc820bcd98381fdeb45f59c056f2123f7ddc51d11947d92987355ab87cdc1aae70c940270d34a7d28affb99265f05f5857c480b4f5a1f80810db0c156daba8c1c5bcad532e31359749a07959ee0c03197d4bde33fa5a5480c57d9cbeedab106ce7f12acc397bd1052fa2f98b4b376cb8e9767da8988395843ac0e1b2ca1d01d7fL : 0x4423bf1c019b68d87914a5352fb1f65e1c492281b722774934d5434a97f7a6a8a2083312f12d02b9e7aef6a00b6484ecf981715f3cfba60338bcc0b3c0587b66eb8586da88e1ff6ae9f0dc3174ac934a4a6bb9fb6317b271bff194e96740ddc8e2de423f276730e1cb20feab528c8072b44593f3716bb2ad710d90e6d385549aL} 81 | {0xd38277472ccec2a4772a2f97419dfe399c4b97cea098f7d09981dcbe38e2dfd002443155d2891b32c6f11e217f250dc5d9dccc1a988238af94ccc2047828296f2e3887caf6fef39af36bf65fe058a655c6a0db1b309f584ef28755cb030862b6b1d5403207ca716b8739bf1dd91500d9daa9a6dd10e3f79b6c95645db7099939L : 0x3d0c936a7f2ad58c9137ea1a866ea9da490e4558b48b00453f6ff914a7f1a4af8b6fc4e84da92553c249f867b92f95b7216f0ecf2370c0d676d2ef8dfa1aa597e38171519b5cbc2bae3c1edee96f5a9003969849564e24cf670f34e53e61187dc4686ba559301eb6f9b5a1fb207b47bf161a509622368f7b8f595b5aec3f763bL : 0x627179dc881e358eed9378137ca49b9cf86055089279ad1848b5b8888fc48a4c294ad0a241a20bad6692627f8a3bb6a53af716f96dc7eb2a91bfb94a0744c639ead04e796e2a7b9f80b34cbf96ab78fa0e9cd1e6a9d1f8c8091345c42e0a9c95d33ab6d6ff413dd1065d9814510e04d72e97e3c4f67e64afa1086f9de114fe2aL} 82 | {0xc0f02fe81e0794a8d66d141d715e413ba994f58acd74d61f89162c7643745d125f92204f6eab00fc607bb8da03bc856dcddbdbb3e1d25a89a307bff9abbc96d70a92aaed38801b8d5c833c0085bd49f48085cda2f0e1a7bbf0692e8f2140f35836924983d9dae2adbd8730af51e213041c776594d6fce99adbffd0b002fd8cafL : 0x4b292eae3e80936b3a342c5f2c9a030551890fb2710fabd3b7d40b4e0a8ade2aea868adbaa191ebd90b926ff955561dc78da05a9b21b01bef39fee8be27f47750698b3336fae67b98ace4e64f009a6169b0bc3ec8f01f2bffc352a56752bb8cfc8d3bd2bcb75c325549b7cc55f74ac1008cf05e1c4ca151faf2124cc2aeba0bfL : 0x7ec2a05c558dd55aa07a235492f63ffca719a45df223d19dde0bb8f93a7382d1449012011fefdd10d7de03c3a115f7b7e0e4c1e569d57666ca9ac74d6174fe9da316319c288c05ede68559f380e1637572db9f2411027858dbaa1524d5b2f2f8fbace464b964a43b1ec689c8ec7f0889a590ce0f541369695fcf5d228bdca099L} 83 | {0x9c5e071ca065b98c2cf514db2396ad662cc6317c18747a8a517f557e8ae2798771f3c973f100060334a830be52bdad1104b5bd3d5de85af1cc22551c6661c15a572751517e5565f9bf166f27519abc30555d51e0faca9a5c861e74a44e6fa7540b8346068d34ce40f74b40863ab807fa38c63d7a1454d3543d24ba4e915941c7L : 0xb97ebe342d935f67c75e27da2a02a3fc64d8123fc8ac95306e20ceee17a658f870269d5ffb427c3591a71bb992ebeecdb771055c95e35373faf2f5efa218923698f1a13b452240dcdf55a5a622c30065c1383d632f86bc6d4b66d098208b676668928f7a8765e387050c9e43660dccd6ea1ab2f0d8bc75a3fea465c12b81b5f1L : 0x6740c34d60ba205215b7151d6863d09d4b470ef30e917686ff34943156b0b6615ed26754f38f1ab815626fbc11486f92fc86965ddd44957d855ffb15c84e939cd39acf295e0018b18c2ecda7086e9b5ee4548c3bff8ded4a6a3f8c1b6cee9ce6894e400d37b9873eb41b33c54fd7c71fa3374bbfccef30ada3c8bcf5d47c863eL} 84 | {0xba166a08520aa9a5e2edc3f134960f6205e934a48081e4693a13252ea7234ff82d360c5acebb6cfa70fecf74da5152edcb2ab296d94cc3bf4f5559233c85467439750e848e72b17e029a64268537df2d7e3720627e64ee3cafbc2c9a12c4656f7f69b86b75388c67c50070383fb6267f131b488dcc8baf01b8e7169a14b0410dL : 0x3bf1c14b2d651aa9a2379a8601291c2705eee924f47c94456e771dd15d2abe5256f37d73052c85326c1de7f193bc778638c792107cd5b1afe282bc9cdd669c00cf971ca69609f91d213344df7dd75716e61078ed0d8a9cbe4b17cf02259d24f901795e199f54ad8df20244d3a7aac45f9a0022ec9153c8b66984c059e3d9339bL : 0xa974d5cf57105aaa214df6cf6908272c73fe4f67e4589b21047fd3a2473ab0869a58a3e392e9c824f9b7318ff0659eff33f38343090f89a27479495d5f08699ec61af4f6687d89ff6d37b9567473dc78258e30fe5f4b1ee81e668f3509e08c4262f6b30c48e9ce85abcba7a83c644c49bbefbef75f20084c91c1a52636ac14edL} 85 | {0xabd2c7860813fa0faa1d999bfc0985e63c287f91ede2152a495fc933164404ec92651617d465d6fd92b94383434cbfdafa150f7b47057422ed0dea9f221f8dde81681cf40bb14484d2b942ff34ee2523446d75066d4a813f43801a90d1458691c7ef6d1151c4af26a93ad4602066df2cde6548b0c18353281f177a5e95a9fdc1L : 0xb9b720a868147ee3f978e68a5130837ae1e1ce676ae996771330becde7bb9d01d355751d24763a5684316069057b20b7c1a81ca0bd682ca6c17bd2889cc6f778190865a58ad5982b8c986d1d64996be0cec51a2410d513a14aa45243ae73779507dd5b1c0be69ba6abae5b51c9d7e4494c050bd147db79b148db19cb9a2fd105L : 0x523cc3200224ebb8433056fa7a2c160b59fcd84c477a497de10e91104c525d3abb483247c81d7efede6a9ec48e8f4c90e6b41be65911f8662946af9b94c7086bd4e4f0255fb69250f341a06d722c29a0f337a3e3180330b722d08963b6db077e39996dc7a231af8521dda944295f7c690e135085f12ced7b8f363bf433eba346L} 86 | {0xdf32759fcfbeb9fa21054b5d37164853645834a082733aa00b5e9117c1c25ab61e51821977597155e2d184f5002427c39b0de35bd55d3b51e9935cc8e6d96f3b7dcf9351a0b6b54cf068bc179be6a962cec1d16027e4133e2a6cc9e612390f17e58b0a3473739a3ce97154fed1466b45eb2a889f55bca780a4349c0603edf117L : 0xaa3d45f00297eb647d6166146cc9b0c17d967e71dbd9b21a9e21fbd2bdaea6a6f921ffcb18494dea76f61864f9f356309b9e910bd4eb62f6f7fbf0b2269fbb43c9d85c80c80913ccc1d5da1bb1eecd054d58a52138dae5b063797106f3e35ce25110a3f6da0f512683d83aa91d6a84053a67bd8fe612e8e4e7422b8cb7451b43L : 0x1accb5ae8828177c30eb39d258df20cb2377f8d7edd40a72394c013aa1f64704e92ff8a3dd88fc635d9acd78783aa920c7ba142ba0d19949bcf1db748dd77784045ec4a2ed4740c58a2307b426c723e6da84a7f37310a15ef59f26b6dd9f1b800dbe01f5d3e568a2fea4e53f02c061fe36aaebb54417d33fe112742714487aabL} 87 | {0xb9003ce44b76fe538223bac6119908b6ec14537a5f8b2d867ac2e95ab29487cf61608405e45fe7e9234b603c119172a331d42a8cb6b95da501f7b72a02c41a660d3b4c5ee0adfde00c8b89f9bab5951b4fa3ce9e057bccf45af2da6c651355842267fba0601407785672e09209838787e773db0270cd0dbd2d68f2d63f61293bL : 0x65985d32b46a50b4ae82d6719ec1ffb21e23a550c8564694daaa4377f3effde8f45b6c8db94a3d2318255b3cfbe075c0c0ca61889a97ad67595807d90405caf543e5fb299067258d5b514580ffeb858d72cf821c97490fda350a549c403231317c1446087aba73e08f02a608851b46cd0af748773c5e67b722b0f836afd64b33L : 0xa4c4008ce01bc54bb810e59926dc40525c4d549e889411a70a04a758fd214bf589a8e3641cb00406000e729a0ca53bb6f0bc2f3c7d4cf8dc0e31107e7b68de78df472c447bcf1cdb7515a29b9a92b13c7d75c0687065ad395bf3ff3392745dbb15846979988ad6511d437ee37b59a82c5190eeda7485e4436823d97d3ebcb71fL} 88 | {0xc773c196eb6e91b451acaa868d0e00a4b29aa294973f05c65a88b35f12db50777e65a26a0e7d37778db0db17e7de3a9edf277dcb179dfb8dfd12632e569038832eb5cf33716c40d1fe3fd9df8fb6307aca7ab201b2e5ca26e4652e6485b4e650b2f7e2f23c3025655f52119049198ad7aed0f2fc3fc20a743092e9acc36f5887L : 0x4deb62ac3f79a3438a0a13670f0ff0dc43894d1c8a23b2baac478b848402edf4113ce1d74b14e052a03665a93abf08b5e789c428d2b10f057d0781fbb99e403f7e5ba6a2a0880ce57f9c79fd8d31aca4b7f14b46cd1f4a9d382c298472af167107c9d8398cfb96f43d3f8ce92398f6a1dad7874f79f46d44656dd42abae85abbL : 0x197f492c673ab4458a810e363ed210c8f1927daf403c72dde63bc872c238b2c035a6a42ec792b074d88455fd9b5731250c515163a658cd83f3ebbae8b3e41fbde00fd321f9584c43ae5385562393dfe44a75ab8f4a9ffec9d39734e1fc0813200f49cb72c84e00fa14dc9df2baa186e40ae51e1c9f5f11b555912a92aab05afaL} 89 | {0xbc053b70de46f73a777a0e5c77fbb65b50f2732ad7736cea67c93edc29f569fb278b32800445aaedaa5c4f2547c65402d21af203e55f414e4582ddaebac87d8905473dbeca02a8f07302b00fc8de4416187333c82cdc5734c982305d2fb8973ab137bcf68959d45a646280f2596f6676768d846492a0a1cb3d3dce54d316dd3bL : 0x5ad99e3b979de72ca2e3ad950fc9159c2d6770d6ce7dbd81e0853eb13f001e718bd2566f84109778e2b631a96a266ca70118aef5933b525c7fd29903357f96e0ce1bf7c29452deadce887e4adf1f651744bf847a61cfa7ecda969d856689ff2266bf894ebed6bb1bf093885f276257a361d517c475a5646445b4b1b8e46d5867L : 0x4bde5ceeba9003543c9c44604171cf817d412bdf5e19acff36bb70e64a0305f9864dd224f5cfd29eee864cbd742db8286f75532ce06ce4cdaf47d5cbbf955db389decba877e506e505e49df972e440a7941df5129931d089ee83dba7a9d19a190586bb70d0e8a47f2c6ab759084f9a6e55b8ac8d23ed14465d9e9339ce218f0fL} 90 | {0xb25d0fde889e999b6ee13e5db72dda567515e477cd1048ced02395d9c90cec3f438bae6c03c0b108567584de55358a80c3794aaacd72f8ff7755ec82a2676076e3f16db380a61b86543adc97b95850ea39de75e0428d5ff06a528f469ab0941e7f3947871023f93bf920365f2495b8b972a5833076bd842094bf811b669edae9L : 0x9a00181962c5d35009bb22b688cb7fdf1891b808edfdba22375e73d80a1f647f9d01b06c8259b12b21e7c306b3c17cd5e06b8e76240634b126252c39bf4c046198b5662b67600844c76b68c6c379fbf70ac7d4ef2fee0432561fa088694791db3e0eabfe37df3b12e81fb046a3884121ff419cabb5b4b0d81008b02b5c267e07L : 0x8e12930c5c3aaeab5ff98c5e438e1bf5afda198a32811007d00f9b55bae3030293dc220156088eae16b4c39dc062ae8cc3cfd5dc07d88b1acd4da7d79a308a3eaae665977a71a2227acf510e715a46039eda59684550d628c27420f43d6a41ae998f5d64824fcfdcfc5ec3596168cef2052adf1beac724c00c65d015fd0ef162L} 91 | {0xbd4c31a020e3abfc3963a454514531455e70420f5891806972dad983fe47419365611402e29ff50b386a6f18df08a092d672fb7211672bb130d9484c54f184528a18694bfa0a0413b1fff9d0d8277514cb99b616154d3e518bb942c06f5554537f68e5bd9dc08e244d91f9c67991f542c2fcb0aeb92418de6f919a0fe951bdfbL : 0x980c42819735d5174f4ac3f5041618a75a71c45e11e9b8c1a9143c63137f95fd7d3dd5afbf159ad935d9decf35db7547b629f3afcda8809bd87d8ccd8fb902fe9802d2c50450df1ece35c13950588e72161bc7ddcdfaeddd6fb41b06a50478d80ac59af9cab443db5a363c7b5b385b36c578ad218ff01fa2c05ba4d28e78d299L : 0x20a04a33e6b77a691623c36441f412e756bc167430b18f086fa3ab8d065b5eb7290a5f121f3d251f24d4157d8c04db59918c9fc9321eebd2dc0c85c07b0502684aec34f2fd5c319191e7e53bd65c0b61ad6022e153e54416d400a6f2021917f6ab056b946ad0207268ba4dbb4e17ea910539cda072481b213097cf27913a645eL} 92 | {0xaa25d3768fa725386c3d39010c5d47ceaead6f8fa294c106d2560016a5c2d07840540b8a31e292b9fff8319a23ae64b9fb6cb02c5a7d46a69ef9444423d111248a5fe37b46d605eb8036480f48829b24430fbfe78674d968c3c5f596aef8b9c932102af80e781c3ffde4d305399cef630ac2d269cf72876a1e631614eccf185dL : 0x81ef1117caf6646d111d9dce56e1db87a64f509b069b3418c924b046fb9640f2d9eeefd327ef75f946a914350d7f6174e1ac4d98fdb5e6e64634495fd71f5d241689f2d0b5755980e537dec602ef334b0fde7729499ac0ab7d07eeb5b0417eac24eb8bf84a4be29e7d45791095f84cd2732367fca0b0d10a5d5f58f3a0272e73L : 0x2794cee846a27c31f8ffbb8db2f4b14d0ef6927df3e82c5c21ffb2bce44e86fb4b602ee842d41ab70be666e763162046a98b485d8c65cfb8bd67523fdbc0c9d3a0b3068536777f2d3df2706758df129a72c133f4e5728514a87d0a14575ea8056dab095357cd1343fbf74d50d48e58e4017d548d50614a8dca926739e9c51a97L} 93 | {0xb6fff7bd00537428364a42c98cc0e1db7b6009e696c09e911db1aacb92492f646c8957a66849e31434324f6e40554b12ebffb380308156c423c8461ebcdb74c96bbe185066c5918625b55ea52541a092d3844cfd2c669d1c876eaf9d412b1021df0ebcfec2449e8d031b9430b975dd7ce1fb4d11c49eb2e585e08183276fdab5L : 0xa789fb50ba74e4c8971ae2a83b1d3d6b045650c73d3f30723db519ffc5d4251d0e082d95810b4f80901c5c097e703fe48c3907980eeb0258ccc83580be5998b2ad779e7c839636b0d23cfff087b0351040b75a9858d56a9035a4e0666e196e1747b1f6d967f18e1a3de44803e5f598dad8563f62d62e6739b44af841c39f8f6fL : 0x27f3db0fba7449922553d3a22f6a4b342e540da0a4c4b505eece8d56bad048973f0e28e36161fecdecd4ca9b471ebaebe0622bc705178ae69541d1b25858ec465e617810c5cd2248aaa3aa662efab139f6767ca29fd1eff2167f390b697ab5e4529b192a2ec3e420282f171aa94e71693dc554471236269a34c3182ceb3008e3L} 94 | {0xe982c01e923a748618da772ff95fa881d1140e9cbb0627a6e96ef0b54dc24e32df1b66887e771618473a54f53d8473fa8947a3459e63055e89fc56ed0ef320a7be5f113cc8281c74804f9180b566c5d97eab98e2359ff95217d470eabfc8e7f214ac73100662eb17ccab53bfb979eec03ae3b93e6caccf66055f6e264373cf7dL : 0xaa2bfa0772d64274a4527de2bc4512ab396dd0c6e1aec5e3216999e0ae568d6e580a3a9c6c58e6c9797ddd64cf8e75fe66607ddab4c6160bbb96c1919ef5e620d803a85fe39b946ad1f0d497ff63aaf3475f7e1e85eb825a849e5ac1a67e2519ab5dbe46f82edf0891d26d01beda42e9e89d52d5c58d4231351060d1cbde2937L : 0x9dcf0d45ea6897abb12c03532b54e34f91eebe3be66b1ec316961d04b599fc9fc572228c0dfc399db83b645e452114e559ddbeb56be92baff21295982895ead5f8cf311345a77aa1c4323db7cc59fb60135edcf5950233e4e463b5ec0e14186b9dbfc9534ae30312ef1df1a0587d875c4b6f6fc04a6601d16e920705fee43399L} 95 | {0xb8caeb151f6fd2afce07b3aa1c2f9da140062c3524f83f5587e98fbc055d25993bf39e021cc421f189b31827baf300063d1fbf5e434eeec552e95df6b3602b04a69c7f81ac4dd216d2da547684057e4560141881c7e10722f665a48dbbb40ef3ffc0b4f3ca9256c6a0466f80ecf1e70989efb3e131d300249ededc3b7eac8c09L : 0x56f211b0eee7e1998f6c12bfb1b66c868e045c351ffa356b32217257385c9a0af2d535a9487f6888554ef68e79db8d7dca6a9c76d280a96a673da86fe02a9e07c1f94767f2943b2d0533b3cbb66d21d403516657265ab4393c93968c64884d6adde996f9496c053b9916893da997b686820e95fe5dea770e2211d7d5c18e34b7L : 0x8c00fe8339095f8a87f6e4fcb4561c183ab8af9c9bc038a6219879c096e10f165f4dcda985f31566d236004be172faea0efec4aba2b26592903777961cd2195e310a914b91d3e10cce866f7022a83f9d8747f591f1d7266fa38b5f34e6d436c9b1872e07e71fadd8cd5830d13789d5d504c915fe67dc86d76573276af6d49adbL} 96 | {0x99a6e3b025f3e1814717d5aff4a1ae3fecb845d914f1bf7ff022475e69e63dc7ea290bed6c8be2a9a401199f750187ca5cd9e5b6abf31f781bdf6396e3f95ae4580464f55beff4e45baeaa168c075921535b0bbcc9df1d2b39705d4c331a6afe96f666cb000a1122ff2bbee1058bacb01d16546b78bc6e8222950252f966703bL : 0x973bd007d535a6590e21a168d7b8624f2d628a17590c0cd142ba8d33e340a30065fbe77a0a054c8a37568df1d6aecb04ccea40e1a6bd11759bdfd061b7550bde25e8b4dcbe52122e6eb8e792b9f370d1dcac875b9f822936867e6d3e10f6dd23759df17939ca249f3cfd464e5800c96fa3aab0395759a0df3b356b56d7e38191L : 0x63576e1aa0bb1c35c37ec92af3d9497124cf618c1bcf86e34fc176f7aa3fd1af89537b946047648f7fda49d9474f8687e8a217b3757f6feeff1b3cf2a620e967ac19c341d5d0486f18f366ac30ba9717f77b3e46747302fb186e32016dde8ade7b32df407c2117af1370ef6013f1a9688b8c63a8bf0b3fe6b41d4df1fe930426L} 97 | {0x97b3b01e91868f1200f5db65fc371f18abc7c5c6ecf44f76ca9e67e5633fdcf52be3bd467129c72217da4a71b73e2fea5a239b3101b80d4f86b3b37ce5e22c07e6717af39063edb18bc41a48fd186ce50ffce003f688f39a643a76e4285e526aa6582c9ace0c93103c67c767b46c04e083aad610f29711e2c815ac06ea04bb0dL : 0x68f49b9ddb6d2e3a45e70a22b86a44958d74e15e52cfc82bef833beb4ad697ee7b6ca9eb67c12a9cc9ce9789a473be9972f1d683ab18f04c12bd854b5b16a7d8618efb0eeb0ca45d7b7ffe46eda52427712886f69d51a30f977acbcc35d576ea3abd0c9edbc0fe6d91db46043c8efe41161449502dd3a7e5d55809c9f345720dL : 0x6fd6f0d4f515541c328ae958a0190366bb263d417c3300458ed4b19a31efafe9008c2375722f0b69be63d3abf81e3d7966543cd19852ff5b05df3e94389a27b9066879e2ca59c5f5e0915cc651ef29ec61b495dca99b6613715d0a4898deaf936b7bed9532fb05fc4e81753e3f6b939e2f981df95799c9ce2e74acd7df470514L} 98 | {0xb28165bfe4514befb9294e7a7ed82719d258355d2302f47ff3a846faf39b2b6299d76e0e24007e75a09414e7d6edeebefe1d504a6258a86aa1b6838d71a34bc3ad88b74f0adfe9f10e89ffb398059c9742d7ca0c1049982dd201b12e95027d7a7de48477137de6982a819b71f36dc83a258397a68e9d12ce461150206ff6abcdL : 0xbd3fd6f5b7b511f5a9bfbba59b8e97aaa7429c033117289ff7fe59f558ba97ad33c4f46976fd39510de0e8ad5895579f190ff82b1b25a509610bc37f737d2d98e28069028083cd59b19bbc80d4871cc18526ed4ea74a5158e0283683ad32cd127c7737282121a099680dcfdc4c9b4cb133d36c6a7c11ed1c3e118d873c245659L : 0x16bcd1ebe675f20873997b87afbc8656ce399314a0dd23fa43095f75e0a7ae5d0c56c6804cb7c104529657dd0c6ef8e8a6bccb9f87d967637c86660234e517089b0bc52fcc03a88dcc549551ffb8a8872804fa2a3c3d39ee6439d94284e557332e7f1ad5c4704a024ec809884ff4ff6397fc34d90626ed769de368bd2513a5fbL} 99 | {0xd38acee9d4f77108e226509bc160ff3b1248d0cfacd261088997735e039fe9978438d9e896b86ebcc8f90aa2ba6d96ab3cbbfe59006e306b14fbe08efde73cc62d5c78e1ebd882efc5c9324ea12b7ed5839191c45a8c5e100f0519fcbf26d4e19aceeeca322c4af63c32a19708e054e02d80ac8c368a6c7e813a6034cc96c563L : 0x86aad73e43932ef4da0dc1e1d205555e25d7861cf019eda18d35636aa2fe4be56fa7b8847a197a8e47d1945618906981b3485ad7c93e84153d710c61b7bf2eee8dd3068bc7cb054bfa884d63b5199afdbdd4c8d674b583b233aa89394200dea67ca66c62dab1607934c580f689d1d7c4062025d922e6357de646dc0087e8c9e9L : 0x611aec19698270c8e8e25b6b8dd1fc7ca859ff66e336e75609680f7e6957b2f16177756ac38ef65efe0ca434c2533e61775983e9895d54bf885b47aa44b731fa9b6e364c97c735047b2698ef81f9223b6e7c2754cecf5708abad7dc618f44954765856b218773fb9bdf3d157d7f2dc1b49a95e6393381b288a1402cbead1ced1L} 100 | {0xa9c69c41e9203ebfeddb28643fa9ed902f1a8285c326ea9e3606e14c1c0532165e20978cf01b96b8dab395487b83b216ce13e9e48e459c9f6218f415584bc43fc516ac13d4d4c5dd393a0c4f5537a738c8c46a5489c1c067058ee2369ebda780be7dcad016811783412aabb5e5a20938852c4aed039ce41c6c0b97899319e1a7L : 0x79f484c809d5a46baf9757557b8b368c37bdadbec9e27c84857d05f5597a8dcca78a1afcc76d4d36109cb65052e2adfecccd832f4175215b0b7588f584b2a18a225b19190a24db4f0d35673bece842a844b1f5e918c58f3cf6ba9a049a7cb103fcd7e2dc6342df8ce96c1509d9e32e373a224310f95e1423f13215c2e3d41fd9L : 0x142d4adc8f7cf1d23d66d36d513de5ec77bee1155eb7924dcf748770b98e6329b25eb6f3c36556906432fe00ca11185f23301fffa0bdf9a3a9f7eef418d1cab1cb64b4d7013436b96eae3f58f27a8aa0beda24a5cb4ea9dddc28e2a986af3c2819cdcb2731e3520db99584effbc5be10d1ea85e761d362fc66738949c3f2922fL} 101 | {0xcdff7100dc330bd45f280ca958baddbcd8852cb98e0101d74dd67e0f21a06dc748bd1262c74a4bc0d6ab147cef8eefe08307cb328d7ff66b8b5c31593f6749252800318626d953d6c923a792aa69ec2fe0f0a877f8b7b78016140969c9b69845b687efcf93f5468711e610d27cd3baf9ecaea190beb1b33cc0dabae895ef0de3L : 0x733aed2079dd10ea932287aa956e65847b1d49faf700f37988bec10bb7023fe2f3e87211a4148039ac81647edb4d98366e2cf44cc55a2fcc661d52f4f640ba1459129e9af70bfece8e559b2bed7f096fee42a7bfcc456e876b72a396fc279a18e2d96067f1ce71fc47aa30bb8d333dd97ed697c795506a109ca93876e1854469L : 0x97be1465d9242c4c50cb53dc036d9f8f0eb1cb4977ea06cedba24d59e60237c4e75d1010d2b45b9a4bd43b9fad1e9fe74b7fdc2eecb122ddbb105067cd35b95b777255b9cd818775d170a6aeeb68f35d81c7084c633d6c217a6e12c183bb1d5bc1340b347de049eb6da8777d9a35f3394739b7b8c4bc35595222284da5f42444L} 102 | -------------------------------------------------------------------------------- /test_files/wiener_test.py: -------------------------------------------------------------------------------- 1 | from RSAExploits import rsa_cracker 2 | from RSAExploits import RSAData 3 | from RSAExploits import rsa_obj 4 | from RSAExploits import TextData 5 | from RSAExploits import num2string 6 | from RSAExploits import Wiener 7 | import sys 8 | 9 | sys.setrecursionlimit(10000) 10 | 11 | # Parse and store all of the ciphertexts provided by the file 12 | rsadata_list = [] 13 | c = None 14 | e = None 15 | N = None 16 | f = open("wiener_list.txt", 'r') 17 | for line in f: 18 | line = line.strip("{}").split(":") 19 | N = long(line[0], 0) 20 | e = long(line[1], 0) 21 | c = long(line[2].split("}")[0], 0) 22 | rsadata_list.append(RSAData(rsa_obj(N, e), TextData(c))) 23 | f.close() 24 | 25 | # Run the exploit by specifying it 26 | if Wiener().run(rsadata_list): 27 | for rsadata in rsadata_list: 28 | if rsadata.get_d() != None and rsadata.get_c() != 0: 29 | rsadata.decrypt() 30 | print num2string(rsadata.get_m()) 31 | 32 | print "----------------------------------------------------" 33 | 34 | # Run list of exploits 35 | rsa_cracker.init() 36 | if rsa_cracker.attack(rsadata_list): 37 | for rsadata in rsadata_list: 38 | if rsadata.get_d() != None and rsadata.get_c() != 0: 39 | rsadata.decrypt() 40 | print num2string(rsadata.get_m()) 41 | --------------------------------------------------------------------------------