Skip to content

Commit bf85f61

Browse files
Initial commit
0 parents  commit bf85f61

9 files changed

+147
-0
lines changed

.gitattributes

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Auto detect text files and perform LF normalization
2+
* text=auto

Cryptography/RC4Encrypter.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import io
2+
import random
3+
4+
class RC4Encrypter:
5+
def __init__(self, key):
6+
if not isinstance(key, bytes):
7+
key = key.encode()
8+
self._box = list(range(256))
9+
j = 0
10+
for i in range(256):
11+
j = (j + self._box[i] + key[i % len(key)]) % 256
12+
self._box[i], self._box[j] = self._box[j], self._box[i]
13+
self._i = 0
14+
self._j = 0
15+
16+
def update(self, msg):
17+
if not isinstance(msg, bytes):
18+
msg = msg.encode()
19+
box = self._box
20+
i = self._i
21+
j = self._j
22+
out = bytearray(len(msg))
23+
for k in range(len(msg)):
24+
i = (i + 1) % 256
25+
j = (j + box[i]) % 256
26+
box[i], box[j] = box[j], box[i]
27+
out[k] = msg[k] ^ box[(box[i] + box[j]) % 256]
28+
self._i = i
29+
self._j = j
30+
return out
31+
32+
def skip(self, n):
33+
box = self._box
34+
i = self._i
35+
j = self._j
36+
for _ in range(n):
37+
i = (i + 1) % 256
38+
j = (j + box[i]) % 256
39+
box[i], box[j] = box[j], box[i]
40+
self._i = i
41+
self._j = j
42+
43+
class RC4Transform(io.BufferedIOBase):
44+
def __init__(self, key):
45+
self._rc4 = RC4Encrypter(key)
46+
47+
def _transform(self, data):
48+
if data:
49+
return self._rc4.update(data)
50+
return b''
51+
52+
def read(self, size=-1):
53+
return self._transform(super().read(size))
54+
55+
def write(self, b):
56+
return len(self._transform(b))
57+
58+
def skip(self, n):
59+
self._rc4.skip(n)
60+
61+
RC4Encrypter.Transform = RC4Transform
Binary file not shown.
1.72 KB
Binary file not shown.

Cryptography/rc4.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import json
2+
from Cryptography.RC4Encrypter import RC4Encrypter as RC4
3+
4+
class CryptoRc4:
5+
def __init__(self, key):
6+
print(key)
7+
self.key = key.encode('utf-8')
8+
self.nonce = b'nonce'
9+
self.RC4_Stream = RC4(self.key + self.nonce)
10+
self.RC4_Stream.update(self.key + self.nonce)
11+
self.RC4_Stream2 = RC4(self.key + self.nonce)
12+
self.RC4_Stream2.update(self.key + self.nonce)
13+
14+
def decrypt(self, data):
15+
return self.RC4_Stream.update(data)
16+
17+
def encrypt(self, data):
18+
return self.RC4_Stream2.update(data)
21.5 KB
Loading

main.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import random
2+
import string
3+
import struct
4+
from Cryptography.rc4 import CryptoRc4
5+
6+
key = input("Set the key string here (press return to generate a random one) >> ").strip()
7+
if not key:
8+
key = ''.join(random.choices(string.ascii_letters + string.digits, k=40))
9+
print("The randomly generated key is :" + key + " , make sure to keep it")
10+
11+
request = input("Encrypt or decrypt (e/d) >> ").strip().lower()
12+
file = input("File name >> ").strip()
13+
14+
crypto = CryptoRc4(key)
15+
16+
def encrypt():
17+
with open(file, "rb") as original:
18+
file_data = original.read()
19+
20+
file_ext = file.split('.')[-1]
21+
file_ext_bytes = file_ext.encode('utf-8')
22+
ext_length = len(file_ext_bytes) # avoiding using bs bytestream :skull:
23+
24+
header = b"SUCCESS" + struct.pack("I", ext_length) + file_ext_bytes
25+
26+
encrypted_data = crypto.encrypt(header + file_data)
27+
28+
output_file = file.replace("." + file_ext, "") + ".cws"
29+
30+
with open(output_file, "wb") as encrypted_file:
31+
32+
encrypted_file.write(encrypted_data)
33+
34+
print(f"Encrypted file saved as: {output_file}")
35+
36+
def decrypt():
37+
with open(file, "rb") as encrypted_file:
38+
file_data = encrypted_file.read()
39+
decrypted_data = crypto.decrypt(file_data)
40+
if not decrypted_data.startswith(b"SUCCESS"):
41+
print("[ERROR] Incorrect decryption password!")
42+
return
43+
44+
decrypted_data = decrypted_data[7:]
45+
ext_length = struct.unpack("I", decrypted_data[:4])[0]
46+
decrypted_data = decrypted_data[4:]
47+
48+
file_ext = decrypted_data[:ext_length].decode('utf-8')
49+
decrypted_data = decrypted_data[ext_length:] # Do NOT critizise i broke my head to make that :sob:
50+
51+
52+
53+
output_file = file.replace(".cws", f".{file_ext}")
54+
with open(output_file, "wb") as decrypted_file:
55+
decrypted_file.write(decrypted_data)
56+
57+
print(f"Decrypted file saved as: {output_file}")
58+
59+
if request == "e":
60+
encrypt()
61+
elif request == "d":
62+
decrypt()
63+
else:
64+
print("Invalid choice! Please enter 'e' to encrypt or 'd' to decrypt.")

texte.cws

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
��G���`�3���O

texte.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
salut

0 commit comments

Comments
 (0)