Kekik 1.5.0__py3-none-any.whl → 1.5.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of Kekik might be problematic. Click here for more details.

@@ -0,0 +1,66 @@
1
+ # ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ from json import loads, dumps
4
+ from Crypto.Hash import MD5
5
+ from Crypto.Cipher import AES
6
+ from Crypto.Random import get_random_bytes
7
+ from Crypto.Util.Padding import pad, unpad
8
+ from base64 import b64encode, b64decode
9
+
10
+ class AESManager:
11
+ """
12
+ AES/CBC/PKCS5Padding şifreleme ve çözme işlemleri için bir sınıf.
13
+ """
14
+ @staticmethod
15
+ def generate_key_and_iv(password, salt, key_length=32, iv_length=16, iterations=1):
16
+ """Anahtar ve IV oluşturmak için bir KDF fonksiyonu."""
17
+ derived_key_iv = b""
18
+ previous_block = b""
19
+
20
+ while len(derived_key_iv) < key_length + iv_length:
21
+ current_block = MD5.new(previous_block + password.encode() + salt).digest()
22
+
23
+ for _ in range(1, iterations):
24
+ current_block = MD5.new(current_block).digest()
25
+
26
+ derived_key_iv += current_block
27
+ previous_block = current_block
28
+
29
+ key = derived_key_iv[:key_length]
30
+ iv = derived_key_iv[key_length:key_length + iv_length]
31
+
32
+ return key, iv
33
+
34
+ @staticmethod
35
+ def hex_to_bytes(hex_str):
36
+ """Hex string'i byte array'e çevirir."""
37
+ return bytes.fromhex(hex_str)
38
+
39
+ @staticmethod
40
+ def encrypt(plain_text, password):
41
+ """Verilen metni AES/CBC/PKCS5Padding şifreleme yöntemi ile şifreler."""
42
+ salt = get_random_bytes(8)
43
+ key, iv = AESManager.generate_key_and_iv(password, salt)
44
+
45
+ cipher = AES.new(key, AES.MODE_CBC, iv)
46
+ ct_bytes = cipher.encrypt(pad(plain_text.encode("utf-8"), AES.block_size))
47
+
48
+ return dumps({
49
+ "ct" : b64encode(ct_bytes).decode("utf-8"),
50
+ "iv" : iv.hex(),
51
+ "s" : salt.hex()
52
+ })
53
+
54
+ @staticmethod
55
+ def decrypt(crypted_data, password):
56
+ """Verilen şifreli metni AES/CBC/PKCS5Padding şifreleme yöntemi ile çözer."""
57
+ data = loads(crypted_data)
58
+ salt = AESManager.hex_to_bytes(data["s"])
59
+ iv = AESManager.hex_to_bytes(data["iv"])
60
+
61
+ key, iv = AESManager.generate_key_and_iv(password, salt, iv_length=len(iv))
62
+
63
+ cipher = AES.new(key, AES.MODE_CBC, iv)
64
+ decrypted = unpad(cipher.decrypt(b64decode(data["ct"])), AES.block_size)
65
+
66
+ return decrypted.decode("utf-8")
@@ -1,12 +1,14 @@
1
1
  # ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
3
  from Crypto.Cipher import AES
4
+ from Crypto.Random import get_random_bytes
4
5
  import hashlib, base64
5
6
 
6
7
  class CryptoJS:
7
8
  """
8
9
  AES-256 encryption and decryption with key derivation from a password using a KDF (Key Derivation Function).
9
- Source: https://gist.github.com/thackerronak/554c985c3001b16810af5fc0eb5c358f
10
+ Conforms to CryptoJS AES method.
11
+ ! » https://gist.github.com/thackerronak/554c985c3001b16810af5fc0eb5c358f
10
12
  """
11
13
  KEY_SIZE = 32
12
14
  IV_SIZE = 16
@@ -37,6 +39,19 @@ class CryptoJS:
37
39
 
38
40
  return derived_bytes[:key_size], derived_bytes[key_size:key_size + iv_size]
39
41
 
42
+ @staticmethod
43
+ def encrypt(password, plain_text):
44
+ salt = CryptoJS.generate_salt(8)
45
+ key, iv = CryptoJS.evp_kdf(password.encode("utf-8"), salt, key_size=CryptoJS.KEY_SIZE, iv_size=CryptoJS.IV_SIZE)
46
+
47
+ cipher = AES.new(key, CryptoJS.AES_MODE, iv)
48
+ cipher_text = cipher.encrypt(CryptoJS._pad(plain_text.encode("utf-8")))
49
+
50
+ # Create CryptoJS-like encrypted output
51
+ encrypted_data = CryptoJS.APPEND + salt + cipher_text
52
+
53
+ return base64.b64encode(encrypted_data).decode("utf-8")
54
+
40
55
  @staticmethod
41
56
  def decrypt(password, cipher_text):
42
57
  ct_bytes = base64.b64decode(cipher_text)
@@ -50,6 +65,17 @@ class CryptoJS:
50
65
 
51
66
  return CryptoJS._unpad(plain_text).decode("utf-8")
52
67
 
68
+ @staticmethod
69
+ def _pad(s):
70
+ block_size = AES.block_size
71
+ padding = block_size - len(s) % block_size
72
+
73
+ return s + bytes([padding] * padding)
74
+
53
75
  @staticmethod
54
76
  def _unpad(s):
55
- return s[:-ord(s[-1:])]
77
+ return s[:-ord(s[-1:])]
78
+
79
+ @staticmethod
80
+ def generate_salt(length):
81
+ return get_random_bytes(length)
@@ -0,0 +1,23 @@
1
+ # ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
+
3
+ class HexCodec:
4
+ @staticmethod
5
+ def encode(utf8_string: str) -> str:
6
+ """
7
+ UTF-8 stringini kaçış dizileriyle birlikte hex stringine dönüştürür.
8
+ """
9
+ byte_data = utf8_string.encode("utf-8")
10
+ hex_string = byte_data.hex()
11
+ escaped_hex = "\\x".join(hex_string[i:i+2] for i in range(0, len(hex_string), 2))
12
+
13
+ return f"\\x{escaped_hex}"
14
+
15
+ @staticmethod
16
+ def decode(escaped_hex: str) -> str:
17
+ """
18
+ Kaçış dizileri içeren bir hex stringini UTF-8 formatındaki stringe dönüştürür.
19
+ """
20
+ hex_string = escaped_hex.replace("\\x", "")
21
+ byte_data = bytes.fromhex(hex_string)
22
+
23
+ return byte_data.decode("utf-8")
Kekik/Sifreleme/Packer.py CHANGED
@@ -2,18 +2,22 @@
2
2
 
3
3
  import re
4
4
 
5
- def unpack_packer(source: str) -> str:
6
- """https://github.com/beautifier/js-beautify/blob/main/python/jsbeautifier/unpackers/packer.py"""
7
-
5
+ class Packer:
6
+ """
7
+ P.A.C.K.E.R. sıkıştırma ve çözme işlemleri için bir sınıf.
8
+ ! » https://github.com/beautifier/js-beautify/blob/main/python/jsbeautifier/unpackers/packer.py
9
+ """
10
+ @staticmethod
8
11
  def clean_escape_sequences(source: str) -> str:
12
+ """Kaçış dizilerini temizler."""
9
13
  source = re.sub(r'\\\\', r'\\', source)
10
14
  source = source.replace("\\'", "'")
11
15
  source = source.replace('\\"', '"')
12
16
  return source
13
17
 
14
- source = clean_escape_sequences(source)
15
-
18
+ @staticmethod
16
19
  def extract_arguments(source: str) -> tuple[str, list[str], int, int]:
20
+ """P.A.C.K.E.R. formatındaki kaynak koddan argümanları çıkarır."""
17
21
  match = re.search(r"}\('(.*)',(\d+),(\d+),'(.*)'\.split\('\|'\)", source, re.DOTALL)
18
22
 
19
23
  if not match:
@@ -23,21 +27,36 @@ def unpack_packer(source: str) -> str:
23
27
 
24
28
  return payload, symtab.split("|"), int(radix), int(count)
25
29
 
30
+ @staticmethod
26
31
  def convert_base(s: str, base: int) -> int:
32
+ """Bir sayıyı belirli bir tabandan ondalık tabana çevirir."""
27
33
  alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
28
34
 
29
35
  return sum(alphabet.index(char) * (base**idx) for idx, char in enumerate(reversed(s)))
30
36
 
31
- payload, symtab, radix, count = extract_arguments(source)
37
+ @staticmethod
38
+ def lookup_symbol(match: re.Match, symtab: list[str], radix: int) -> str:
39
+ """Sembolleri arar ve yerine koyar."""
40
+ word = match[0]
41
+
42
+ return symtab[Packer.convert_base(word, radix)] or word
32
43
 
33
- if count != len(symtab):
34
- raise ValueError("Malformed P.A.C.K.E.R. symtab.")
44
+ @staticmethod
45
+ def unpack(source: str) -> str:
46
+ """P.A.C.K.E.R. formatındaki sıkıştırılmış bir kaynağı çözer."""
47
+ source = Packer.clean_escape_sequences(source)
35
48
 
36
- def lookup_symbol(match: re.Match) -> str:
37
- word = match[0]
49
+ payload, symtab, radix, count = Packer.extract_arguments(source)
38
50
 
39
- return symtab[convert_base(word, radix)] or word
51
+ if count != len(symtab):
52
+ raise ValueError("Malformed P.A.C.K.E.R. symtab.")
40
53
 
41
- unpacked_source = re.sub(r"\b\w+\b", lookup_symbol, payload)
54
+ return re.sub(r"\b\w+\b", lambda match: Packer.lookup_symbol(match, symtab, radix), payload)
42
55
 
43
- return unpacked_source
56
+ @staticmethod
57
+ def pack(source: str, radix: int = 62) -> str:
58
+ """Bir metni P.A.C.K.E.R. formatında sıkıştırır."""
59
+ # Bu işlev, simgeleri ve sıkıştırılmış metni yeniden oluşturmak için bir yol sağlar.
60
+ # Ancak bu, belirli bir algoritma veya sıkıştırma tekniğine bağlıdır.
61
+ # Gerçekleştirilmesi zor olabilir çünkü P.A.C.K.E.R.'ın spesifik sıkıştırma mantığını takip etmek gerekir.
62
+ raise NotImplementedError("Packing function is not implemented.")
@@ -1,6 +1,7 @@
1
1
  # Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
2
 
3
- from .AtobRtt import atob, rtt
4
- from .Aes import decrypt_aes_with_custom_kdf
5
- from .Packer import unpack_packer
6
- from .CryptoJS import CryptoJS
3
+ from .AtobRtt import atob, rtt
4
+ from .AESManager import AESManager
5
+ from .Packer import Packer
6
+ from .CryptoJS import CryptoJS
7
+ from .HexCodec import HexCodec
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: Kekik
3
- Version: 1.5.0
3
+ Version: 1.5.1
4
4
  Summary: İşlerimizi kolaylaştıracak fonksiyonların el altında durduğu kütüphane..
5
5
  Home-page: https://github.com/keyiflerolsun/Kekik
6
6
  Author: keyiflerolsun
@@ -22,18 +22,19 @@ Kekik/terminal_baslik.py,sha256=sE8jmQprBcz8KaYTwxGOSJCDNjMNwl-ZzHi1s2_M-zA,733
22
22
  Kekik/txt_fetis.py,sha256=MC-L1g3TnqCeDTXoleKSHiLbU-_zievF-qmWXqHQC2g,2611
23
23
  Kekik/unicode_tr.py,sha256=OUHfbVyKrt0IckyVy-d92gY3JZVkqgBpMZJLon2rCi0,1092
24
24
  Kekik/zaman_donustur.py,sha256=x-h85vS9D_xJ0jJO9svjIX8gCKYyGb_03AIzUjMk7tI,595
25
- Kekik/Sifreleme/Aes.py,sha256=V2sdoEkVlcC2Oquz6FXUQrwZFigm8gOWBLDdBWdWrhM,1517
25
+ Kekik/Sifreleme/AESManager.py,sha256=eYgbHANtYrWFJgLeUuj63tlL0Yn8gyPCJYbXfWlpNbo,2389
26
26
  Kekik/Sifreleme/AtobRtt.py,sha256=6xsSmZVsTT3tJ0oivm9leZFuKlnsaDenuIvoVNJHoV4,463
27
- Kekik/Sifreleme/CryptoJS.py,sha256=4EqCh4HlI_xnYVoiG6Y-2AaU_BqvqOpHFYDFrBLzJ70,1821
28
- Kekik/Sifreleme/Packer.py,sha256=cCQZMliq1xuggKkKEs244T5SclU4Q-V4XXVFY_5zHHU,1475
29
- Kekik/Sifreleme/__init__.py,sha256=t0VhObE9cebxYCg6TcTb0EhjsNQv83rChNG3OblL_Dg,226
27
+ Kekik/Sifreleme/CryptoJS.py,sha256=ZOcm7HYM5kA0HIwWv9kwBbe12105x1XDbTqmjlATJN8,2699
28
+ Kekik/Sifreleme/HexCodec.py,sha256=1vQowAuC9zyqLPu7AFBMkz1CjeWxGJJohSXFTz-sy5Y,799
29
+ Kekik/Sifreleme/Packer.py,sha256=4DWFMyhqsZvVKIUjZNruR8RwHSjuPKJi8WDCUTBGWCQ,2600
30
+ Kekik/Sifreleme/__init__.py,sha256=Mxx9uYTYbApjWEXRwlTHdwhNvEDBsrRpe36uiXyvuEU,243
30
31
  Kekik/kisi_ver/__init__.py,sha256=gH613YZC3ziE7f67dViefRSuwDwsHyVvXHpM5CzZ2q4,1386
31
32
  Kekik/kisi_ver/biyografiler.py,sha256=5Xv1ixaDGHGtl5Nf92jo9dPgF3jDXOGEPmWgoEsn9j8,189486
32
33
  Kekik/kisi_ver/isimler.py,sha256=zHVimWL_4TvoLE3qzWQslDBc8-IJZSB02s0vRwsVM1g,88066
33
34
  Kekik/kisi_ver/soyisimler.py,sha256=YQJYp2SjENgwOaCa9mmShxPYeeUll2cq8Vox-d8_kB8,78485
34
- Kekik-1.5.0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
35
- Kekik-1.5.0.dist-info/METADATA,sha256=wL3E_tmOOqWBwyCHRvp7sonWhyRlleE9i47vY_QiHI4,11793
36
- Kekik-1.5.0.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
37
- Kekik-1.5.0.dist-info/entry_points.txt,sha256=yjBifxtRlqfg8lPkH4Bu-urSa5ecptCHsuth-DcyWcg,59
38
- Kekik-1.5.0.dist-info/top_level.txt,sha256=NotddscfgxawvuRyAa7xkgnMhyteFDcBxb5aU5GY3BM,6
39
- Kekik-1.5.0.dist-info/RECORD,,
35
+ Kekik-1.5.1.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
36
+ Kekik-1.5.1.dist-info/METADATA,sha256=Guk6X4sEWceUlnRa1t9rFGkdi1G9BbBj3SD6Z5VlSgE,11793
37
+ Kekik-1.5.1.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
38
+ Kekik-1.5.1.dist-info/entry_points.txt,sha256=yjBifxtRlqfg8lPkH4Bu-urSa5ecptCHsuth-DcyWcg,59
39
+ Kekik-1.5.1.dist-info/top_level.txt,sha256=NotddscfgxawvuRyAa7xkgnMhyteFDcBxb5aU5GY3BM,6
40
+ Kekik-1.5.1.dist-info/RECORD,,
Kekik/Sifreleme/Aes.py DELETED
@@ -1,39 +0,0 @@
1
- # ! Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
2
-
3
- from json import loads
4
- from Crypto.Hash import MD5
5
- from Crypto.Cipher import AES
6
- from Crypto.Util.Padding import unpad
7
- from base64 import b64decode
8
-
9
- def decrypt_aes_with_custom_kdf(crypted_data, password) -> str:
10
- """
11
- AES/CBC/PKCS5Padding şifreleme şemasını kullanarak şifre çözme işlemi yapar.
12
-
13
- :param crypted_data: JSON formatında şifrelenmiş veri (ct, iv, s içerir).
14
- :param password: Anahtar türetmede kullanılacak şifre.
15
- :return: Çözülmüş veri (string olarak).
16
- """
17
-
18
- def generate_key_and_iv(password, salt, key_length=32, iv_length=16, iterations=1):
19
- """Anahtar ve IV oluşturmak için bir KDF fonksiyonu."""
20
- d = d_i = b""
21
- while len(d) < key_length + iv_length:
22
- d_i = MD5.new(d_i + password + salt).digest()
23
- for _ in range(1, iterations):
24
- d_i = MD5.new(d_i).digest()
25
- d += d_i
26
- return d[:key_length], d[key_length : key_length + iv_length]
27
-
28
- def hex_to_bytes(hex_str):
29
- """Hex string'i byte array'e çevirir."""
30
- return bytes.fromhex(hex_str)
31
-
32
- data = loads(crypted_data)
33
-
34
- key, iv = generate_key_and_iv(password, hex_to_bytes(data["s"]), iv_length=len(data["iv"]) // 2)
35
-
36
- cipher = AES.new(key, AES.MODE_CBC, iv)
37
- decrypted = unpad(cipher.decrypt(b64decode(data["ct"])), AES.block_size)
38
-
39
- return decrypted.decode("utf-8")
File without changes
File without changes