Output to a folder that is automatically sync'd by a cloud storage provider & use MultCloud to mirror the data between several cloud providers.
Companies are required to hold your data for months even after you delete or overwrite it. Deleted & overwritten files don't count towards your limit.
Randomized/encrypted files cant be de-duplicated.
Making it appear like valuable data will make them burn CPU cycles trying to decrypt it.
The Utah Datacenter will probably take a copy as well. If the NSA has decryption tricks, they'll decrypt this and wonder why their decryption didn't work, and try more methods.
This will consume tons of storage and burn tons of processing power.
#!/usr/bin/env python3
import argparseimport osimport sysimport randomimport secretsimport subprocessimport timefrom pathlib import Pathdef generate_random_bytes(size: int) -> bytes:"""Generate random bytes of specified size."""return secrets.token_bytes(size)def apply_padding(data: bytes, padding_type: str) -> bytes:"""Apply padding to ensure 16-byte alignment."""remainder = len(data) % 16if remainder == 0:return data
padding_len = 16 - remainder
if padding_type == 'pkcs':# PKCS#7: all padding bytes have value equal to padding lengthpadding = bytes([padding_len] * padding_len)elif padding_type == 'ansi':# ANSI: only last byte indicates padding, rest are randompadding = generate_random_bytes(padding_len - 1) + bytes([padding_len])else: # none# All padding bytes randompadding = generate_random_bytes(padding_len)
return data + paddingdef encrypt_data(data: bytes, encryption: str, tempdir: str) -> tuple:"""Encrypt data using OpenSSL with specified algorithm."""if encryption == 'none':return data, None, None
# Generate random key and IV/saltif encryption == 'aes256':key = secrets.token_bytes(32) # 256-bit keyiv = secrets.token_bytes(16) # 128-bit IVcipher = 'aes-256-cbc'elif encryption == 'blowfish':key = secrets.token_bytes(16) # 128-bit keyiv = secrets.token_bytes(8) # 64-bit IV for Blowfishcipher = 'bf-cbc'else: # chachakey = secrets.token_bytes(32) # 256-bit keyiv = secrets.token_bytes(12) # 96-bit nonce for ChaCha20cipher = 'chacha20'
# Create temp file for encryptiontemp_input = os.path.join(tempdir, f'stormcloud_input_{os.getpid()}.tmp')temp_output = os.path.join(tempdir, f'stormcloud_output_{os.getpid()}.tmp')
try:# Write data to temp filewith open(temp_input, 'wb') as f:f.write(data)
# Run OpenSSL encryptioncmd = ['openssl', 'enc','-in', temp_input,'-out', temp_output,'-pbkdf2','-iter', '10000','-S', iv.hex(),'-K', key.hex(),'-' + cipher]
result = subprocess.run(cmd, capture_output=True)if result.returncode != 0:raise RuntimeError(f"OpenSSL encryption failed: {result.stderr.decode()}")
# Read encrypted datawith open(temp_output, 'rb') as f:encrypted_data = f.read()
# Cleanup temp filesos.remove(temp_input)os.remove(temp_output)
return encrypted_data, key, ivexcept FileNotFoundError:raise RuntimeError("OpenSSL is not installed or not in PATH")def write_file_with_progress(filepath: str, data: bytes, silent: bool = False):"""Write data to file with progress indicator."""chunk_size = 1024 * 1024 # 1MB chunkstotal_size = len(data)written = 0
with open(filepath, 'wb') as f:for i in range(0, total_size, chunk_size):chunk = data[i:i + chunk_size]f.write(chunk)written += len(chunk)
if not silent:progress = (written / total_size) * 100print(f"\rWriting: {progress:.1f}%", end='', flush=True)
if not silent:print() # New line after progressdef main():parser = argparse.ArgumentParser(description='StormCloud - Generate fake encrypted files',formatter_class=argparse.RawDescriptionHelpFormatter,epilog='''Examples:
%(prog)s --size 100M --encryption aes256 --output secure.dat
%(prog)s --padding pkcs --encryption blowfish --silent''')
parser.add_argument('--output', '-o', default='data.dat',help='Output file path (default: data.dat)')parser.add_argument('--size', '-s', default='500M',help='Base file size (e.g., 500M, 1G, 100K) (default: 500M)')parser.add_argument('--padding', '-p', default='ansi',choices=['pkcs', 'ansi', 'none'],help='Padding type (default: ansi)')parser.add_argument('--encryption', '-e', default='none',choices=['aes256', 'blowfish', 'chacha', 'none'],help='Encryption algorithm (default: none)')parser.add_argument('--tempdir', '-t', default='/tmp',help='Temporary directory for encryption (default: /tmp)')parser.add_argument('--silent', '-q', action='store_true',help='Suppress all output except completion message')
args = parser.parse_args()
try:# Parse size with unitsize_str = args.size.upper()if size_str.endswith('G'):base_size = int(size_str[:-1]) * 1024 * 1024 * 1024elif size_str.endswith('K'):base_size = int(size_str[:-1]) * 1024elif size_str.endswith('M'):base_size = int(size_str[:-1]) * 1024 * 1024else:base_size = int(size_str)
# Add random extra data (0-1MB)extra_data = random.randint(0, 1024 * 1024)total_size = base_size + extra_data
if not args.silent:print(f"StormCloud Initializing...")print(f" Target size: {base_size / (1024*1024):.0f}MB + {extra_data / 1024:.1f}KB random")print(f" Padding: {args.padding}")print(f" Encryption: {args.encryption}")
# Generate random dataif not args.silent:print(f"Generating {total_size / (1024*1024):.1f}MB of random data...")
start_time = time.time()data = generate_random_bytes(total_size)gen_time = time.time() - start_time
if not args.silent:print(f" Generated in {gen_time:.2f}s")
# Apply paddingif not args.silent:print(f"Applying {args.padding} padding...")
padded_data = apply_padding(data, args.padding)
# Encrypt if neededkey = Noneiv = Noneif args.encryption != 'none':if not args.silent:print(f"Encrypting with {args.encryption}...")
start_time = time.time()encrypted_data, key, iv = encrypt_data(padded_data, args.encryption, args.tempdir)enc_time = time.time() - start_time
if not args.silent:print(f" Encryption completed in {enc_time:.2f}s")print(f" Key: {key.hex()}")print(f" IV/Salt: {iv.hex()}")
final_data = encrypted_dataelse:final_data = padded_data
# Write to output fileif not args.silent:print(f"Writing to {args.output}...")
write_file_with_progress(args.output, final_data, args.silent)
if not args.silent:print(f" File size: {len(final_data) / (1024*1024):.2f}MB")
print("StormCloud Completed")sys.exit(0)
except KeyboardInterrupt:print("\nStormCloud Interrupted")sys.exit(130)except PermissionError:print("Error: Permission denied")sys.exit(1)except FileNotFoundError:print("Error: File or directory not found")sys.exit(2)except subprocess.CalledProcessError:print("Error: Encryption process failed")sys.exit(3)except RuntimeError as e:print(f"Error: {e}")sys.exit(4)except Exception as e:print(f"Error: Unexpected error - {e}")sys.exit(5)if __name__ == '__main__':main()