tahatehrani commited on
Commit
af3a42e
·
verified ·
1 Parent(s): 4e663af

Upload app.py

Browse files
Files changed (1) hide show
  1. app.py +601 -0
app.py ADDED
@@ -0,0 +1,601 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import qrcode
3
+ from io import BytesIO
4
+ from PIL import Image, ImageDraw, ImageFont
5
+ from Crypto.Cipher import AES, DES, Blowfish
6
+ from Crypto.Util.Padding import pad, unpad
7
+ from Crypto.Random import get_random_bytes
8
+ from Crypto.PublicKey import DSA, RSA
9
+ from Crypto.Signature import DSS, pkcs1_15
10
+ from Crypto.Hash import SHA256, SHA512, MD5
11
+ import base64
12
+ import hashlib
13
+ from ecdsa import SigningKey, VerifyingKey, SECP256k1, BadSignatureError
14
+ from sympy import Matrix
15
+ import numpy as np
16
+ import string
17
+
18
+ def generate_key(algo, length):
19
+ if algo == "AES":
20
+ return get_random_bytes(length)
21
+ elif algo == "DES":
22
+ return get_random_bytes(8)
23
+ elif algo == "Blowfish":
24
+ return get_random_bytes(length)
25
+ elif algo == "ویژینر" or algo == "پلایفیر":
26
+ return ''.join(np.random.choice(list(string.ascii_uppercase), length))
27
+ elif algo == "اسکیتال":
28
+ return np.random.randint(1, 100)
29
+ elif algo == "رمزنگاری هیل":
30
+ return np.random.randint(1, 25, (length, length))
31
+ return None
32
+ def generate_qr_code_with_copyright(data, copyright_text):
33
+ qr = qrcode.QRCode(
34
+ version=1,
35
+ error_correction=qrcode.constants.ERROR_CORRECT_H,
36
+ box_size=10,
37
+ border=4,
38
+ )
39
+ qr.add_data(data)
40
+ qr.make(fit=True)
41
+
42
+ img = qr.make_image(fill='black', back_color='white').convert('RGB')
43
+ draw = ImageDraw.Draw(img)
44
+ font_size = 20
45
+ try:
46
+ font = ImageFont.truetype("arial.ttf", font_size)
47
+ except IOError:
48
+ font = ImageFont.load_default()
49
+
50
+ textbbox = draw.textbbox((0, 0), copyright_text, font=font)
51
+ textwidth, textheight = textbbox[2] - textbbox[0], textbbox[3] - textbbox[1]
52
+ width, height = img.size
53
+ x = (width - textwidth) / 2
54
+ y = height - textheight - 10
55
+ draw.text((x, y), copyright_text, font=font, fill="black")
56
+
57
+ return img
58
+
59
+ def encrypt_aes(data, key):
60
+ cipher = AES.new(key, AES.MODE_CBC)
61
+ ct_bytes = cipher.encrypt(pad(data.encode(), AES.block_size))
62
+ return base64.b64encode(cipher.iv + ct_bytes).decode('utf-8')
63
+
64
+ def encrypt_des(data, key):
65
+ cipher = DES.new(key, DES.MODE_CBC)
66
+ ct_bytes = cipher.encrypt(pad(data.encode(), DES.block_size))
67
+ return base64.b64encode(cipher.iv + ct_bytes).decode('utf-8')
68
+
69
+ def encrypt_blowfish(data, key):
70
+ cipher = Blowfish.new(key, Blowfish.MODE_CBC)
71
+ ct_bytes = cipher.encrypt(pad(data.encode(), Blowfish.block_size))
72
+ return base64.b64encode(cipher.iv + ct_bytes).decode('utf-8')
73
+
74
+ def decrypt_aes(enc_data, key):
75
+ enc_data = base64.b64decode(enc_data)
76
+ iv = enc_data[:AES.block_size]
77
+ ct = enc_data[AES.block_size:]
78
+ cipher = AES.new(key, AES.MODE_CBC, iv)
79
+ pt = unpad(cipher.decrypt(ct), AES.block_size)
80
+ return pt.decode('utf-8')
81
+
82
+ def decrypt_des(enc_data, key):
83
+ enc_data = base64.b64decode(enc_data)
84
+ iv = enc_data[:DES.block_size]
85
+ ct = enc_data[DES.block_size:]
86
+ cipher = DES.new(key, DES.MODE_CBC, iv)
87
+ pt = unpad(cipher.decrypt(ct), DES.block_size)
88
+ return pt.decode('utf-8')
89
+
90
+ def decrypt_blowfish(enc_data, key):
91
+ enc_data = base64.b64decode(enc_data)
92
+ iv = enc_data[:Blowfish.block_size]
93
+ ct = enc_data[Blowfish.block_size:]
94
+ cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv)
95
+ pt = unpad(cipher.decrypt(ct), Blowfish.block_size)
96
+ return pt.decode('utf-8')
97
+
98
+ def hash_md5(data):
99
+ return hashlib.md5(data.encode()).hexdigest()
100
+
101
+ def hash_sha256(data):
102
+ return hashlib.sha256(data.encode()).hexdigest()
103
+
104
+ def hash_sha512(data):
105
+ return hashlib.sha512(data.encode()).hexdigest()
106
+
107
+ def generate_ecc_keys():
108
+ private_key = SigningKey.generate(curve=SECP256k1)
109
+ public_key = private_key.get_verifying_key()
110
+ return private_key, public_key
111
+
112
+ def sign_ecc(private_key, data):
113
+ return private_key.sign(data.encode()).hex()
114
+
115
+ def verify_ecc(public_key, signature, data):
116
+ try:
117
+ public_key.verify(bytes.fromhex(signature), data.encode())
118
+ return True
119
+ except BadSignatureError:
120
+ return False
121
+
122
+ def generate_dsa_keys():
123
+ key = DSA.generate(1024)
124
+ return key, key.publickey()
125
+
126
+ def sign_dsa(private_key, data):
127
+ hash_obj = SHA256.new(data.encode())
128
+ signer = DSS.new(private_key, 'fips-186-3')
129
+ return signer.sign(hash_obj).hex()
130
+
131
+ def verify_dsa(public_key, signature, data):
132
+ hash_obj = SHA256.new(data.encode())
133
+ verifier = DSS.new(public_key, 'fips-186-3')
134
+ try:
135
+ verifier.verify(hash_obj, bytes.fromhex(signature))
136
+ return True
137
+ except ValueError:
138
+ return False
139
+
140
+ def generate_rsa_keys():
141
+ key = RSA.generate(2048)
142
+ return key, key.publickey()
143
+
144
+ def sign_rsa(private_key, data):
145
+ hash_obj = SHA256.new(data.encode())
146
+ signer = pkcs1_15.new(private_key)
147
+ return signer.sign(hash_obj).hex()
148
+
149
+ def verify_rsa(public_key, signature, data):
150
+ hash_obj = SHA256.new(data.encode())
151
+ verifier = pkcs1_15.new(public_key)
152
+ try:
153
+ verifier.verify(hash_obj, bytes.fromhex(signature))
154
+ return True
155
+ except (ValueError, TypeError):
156
+ return False
157
+
158
+ st.title("رمزگذاری و رمزگشایی متن")
159
+ menu = ["رمزگذاری", "رمزگشایی", "هش کردن", "امضای دیجیتال", "تولید کد QR", "تولید کلید"]
160
+ choice = st.sidebar.selectbox("انتخاب عملیات", menu)
161
+
162
+ if choice == "تولید کلید":
163
+ st.subheader("تولید کلید")
164
+ algo = st.selectbox("انتخاب الگوریتم", ["AES", "DES", "Blowfish", "رمزنگاری هیل", "ویژینر", "اسکیتال", "پلایفیر"])
165
+
166
+ if algo in ["AES", "Blowfish"]:
167
+ key_length = st.number_input("طول کلید (AES: 16، 24، یا 32 بایت | Blowfish: بین 4 تا 56 بایت)", min_value=4, max_value=56, step=1, value=16)
168
+ elif algo == "رمزنگاری هیل":
169
+ key_length = st.number_input("اندازه ماتریس کلید (به عنوان مثال: 3 برای ماتریس 3x3)", min_value=2, max_value=10, step=1)
170
+ elif algo in ["ویژینر", "پلایفیر"]:
171
+ key_length = st.number_input("طول کلید", min_value=1, max_value=32, step=1)
172
+ elif algo == "اسکیتال":
173
+ key_length = st.number_input("کلید رمزگذاری (تعداد ردیف‌ها)", min_value=1, max_value=100, step=1)
174
+ else:
175
+ key_length = None
176
+
177
+ if key_length is not None and st.button("تولید کلید"):
178
+ key = generate_key(algo, key_length)
179
+ st.text("کلید تولید شده:")
180
+ st.text(key if isinstance(key, str) else key.hex() if isinstance(key, bytes) else key)
181
+
182
+ elif choice == "رمزگذاری":
183
+ st.subheader("رمزگذاری")
184
+ algo = st.selectbox("انتخاب الگوریتم", ["AES", "DES", "Blowfish", "رمزنگاری هیل", "ویژینر", "اسکیتال", "پلایفیر"])
185
+ text_to_encrypt = st.text_area("متن مورد نظر برای رمزگذاری", "")
186
+ if algo == "AES":
187
+ key = st.text_input("کلید رمزگذاری (باید 16، 24، یا 32 بایت باشد)", max_chars=32).encode()
188
+ if st.button("رمزگذاری"):
189
+ if len(key) in [16, 24, 32]:
190
+ encrypted_text = encrypt_aes(text_to_encrypt, key)
191
+ st.text_area("متن رمزگذاری شده:", encrypted_text)
192
+ else:
193
+ st.error("طول کلید باید 16، 24 یا 32 بایت باشد.")
194
+
195
+ elif algo == "DES":
196
+ key = st.text_input("کلید رمزگذاری (باید 8 بایت باشد)", max_chars=8).encode()
197
+ if st.button("رمزگذاری"):
198
+ if len(key) == 8:
199
+ encrypted_text = encrypt_des(text_to_encrypt, key)
200
+ st.text_area("متن رمزگذاری شده:", encrypted_text)
201
+ else:
202
+ st.error("طول کلید باید 8 بایت باشد.")
203
+ elif algo == "Blowfish":
204
+ key = st.text_input("کلید رمزگذاری (بین 4 تا 56 بایت باشد)", max_chars=56).encode()
205
+ if st.button("رمزگذاری"):
206
+ if 4 <= len(key) <= 56:
207
+ encrypted_text = encrypt_blowfish(text_to_encrypt, key)
208
+ st.text_area("متن رمزگذاری شده:", encrypted_text)
209
+ else:
210
+ st.error("طول کلید باید بین 4 تا 56 بایت باشد.")
211
+ elif algo == "رمزنگاری هیل":
212
+ key_matrix_str = st.text_area("ماتریس کلید (به عنوان مثال: 3x3)", "6 24 1\n13 16 10\n20 17 15")
213
+ key_matrix = np.array([list(map(int, row.split())) for row in key_matrix_str.split('\n')])
214
+ if st.button("رمزگذاری"):
215
+ encrypted_text = encrypt_hill(text_to_encrypt.upper().replace(" ", ""), key_matrix)
216
+ st.text_area("متن رمزگذاری شده:", encrypted_text)
217
+ elif algo == "ویژینر":
218
+ key = st.text_input("کلید رمزگذاری", max_chars=32)
219
+ if st.button("رمزگذاری"):
220
+ encrypted_text = encrypt_vigenere(text_to_encrypt, key)
221
+ st.text_area("متن رمزگذاری شده:", encrypted_text)
222
+ elif algo == "اسکیتال":
223
+ key = st.number_input("کلید رمزگذاری (تعداد ردیف‌ها)", min_value=1, max_value=100, step=1)
224
+ if st.button("رمزگذاری"):
225
+ encrypted_text = encrypt_scytale(text_to_encrypt.replace(" ", ""), key)
226
+ st.text_area("متن رمزگذاری شده:", encrypted_text)
227
+ elif algo == "پلایفیر":
228
+ key = st.text_input("کلید رمزگذاری", max_chars=32)
229
+ if st.button("رمزگذاری"):
230
+ encrypted_text = encrypt_playfair(text_to_encrypt.replace(" ", ""), key)
231
+ st.text_area("متن رمزگذاری شده:", encrypted_text)
232
+
233
+ elif choice == "رمزگشایی":
234
+ st.subheader("رمزگشایی")
235
+ algo = st.selectbox("انتخاب الگوریتم", ["AES", "DES", "Blowfish", "رمزنگاری هیل", "ویژینر", "اسکیتال", "پلایفیر"])
236
+ text_to_decrypt = st.text_area("متن مورد نظر برای رمزگشایی", "")
237
+ if algo == "AES":
238
+ key = st.text_input("کلید رمزگشایی (باید 16، 24، یا 32 بایت باشد)", max_chars=32).encode()
239
+ if st.button("رمزگشایی"):
240
+ if len(key) in [16, 24, 32]:
241
+ try:
242
+ decrypted_text = decrypt_aes(text_to_decrypt, key)
243
+ st.text_area("متن رمزگشایی شده:", decrypted_text)
244
+ except Exception as e:
245
+ st.error(f"خطا در رمزگشایی: {e}")
246
+ else:
247
+ st.error("طول کلید باید 16، 24 یا 32 بایت باشد.")
248
+ elif algo == "DES":
249
+ key = st.text_input("کلید رمزگشایی (باید 8 بایت باشد)", max_chars=8).encode()
250
+ if st.button("رمزگشایی"):
251
+ if len(key) == 8:
252
+ try:
253
+ decrypted_text = decrypt_des(text_to_decrypt, key)
254
+ st.text_area("متن رمزگشایی شده:", decrypted_text)
255
+ except Exception as e:
256
+ st.error(f"خطا در رمزگشایی: {e}")
257
+ else:
258
+ st.error("طول کلید باید 8 بایت باشد.")
259
+ elif algo == "Blowfish":
260
+ key = st.text_input("کلید رمزگشایی (بین 4 تا 56 بایت باشد)", max_chars=56).encode()
261
+ if st.button("رمزگشایی"):
262
+ if 4 <= len(key) <= 56:
263
+ try:
264
+ decrypted_text = decrypt_blowfish(text_to_decrypt, key)
265
+ st.text_area("متن رمزگشایی شده:", decrypted_text)
266
+ except Exception as e:
267
+ st.error(f"خطا در رمزگشایی: {e}")
268
+ else:
269
+ st.error("طول کلید باید بین 4 تا 56 بایت باشد.")
270
+ elif algo == "رمزنگاری هیل":
271
+ key_matrix_str = st.text_area("ماتریس کلید (به عنوان مثال: 3x3)", "6 24 1\n13 16 10\n20 17 15")
272
+ key_matrix = np.array([list(map(int, row.split())) for row in key_matrix_str.split('\n')])
273
+ if st.button("رمزگشایی"):
274
+ try:
275
+ decrypted_text = decrypt_hill(text_to_decrypt.upper().replace(" ", ""), key_matrix)
276
+ st.text_area("متن رمزگشایی شده:", decrypted_text)
277
+ except Exception as e:
278
+ st.error(f"خطا در رمزگشایی: {e}")
279
+ elif algo == "ویژینر":
280
+ key = st.text_input("کلید رمزگشایی", max_chars=32)
281
+ if st.button("رمزگشایی"):
282
+ try:
283
+ decrypted_text = decrypt_vigenere(text_to_decrypt, key)
284
+ st.text_area("متن رمزگشایی شده:", decrypted_text)
285
+ except Exception as e:
286
+ st.error(f"خطا در رمزگشایی: {e}")
287
+ elif algo == "اسکیتال":
288
+ key = st.number_input("کلید رمزگشایی (تعداد ردیف‌ها)", min_value=1, max_value=100, step=1)
289
+ if st.button("رمزگشایی"):
290
+ try:
291
+ decrypted_text = decrypt_scytale(text_to_decrypt.replace(" ", ""), key)
292
+ st.text_area("متن رمزگشایی شده:", decrypted_text)
293
+ except Exception as e:
294
+ st.error(f"خطا در رمزگشایی: {e}")
295
+ elif algo == "پلایفیر":
296
+ key = st.text_input("کلید رمزگشایی", max_chars=32)
297
+ if st.button("رمزگشایی"):
298
+ try:
299
+ decrypted_text = decrypt_playfair(text_to_decrypt.replace(" ", ""), key)
300
+ st.text_area("متن رمزگشایی شده:", decrypted_text)
301
+ except Exception as e:
302
+ st.error(f"خطا در رمزگشایی: {e}")
303
+
304
+ elif choice == "هش کردن":
305
+ st.subheader("هش کردن")
306
+ algo = st.selectbox("انتخاب الگوریتم", ["MD5", "SHA-256", "SHA-512"])
307
+ text_to_hash = st.text_area("متن مورد نظر برای هش کردن", "")
308
+ if st.button("هش کردن"):
309
+ if algo == "MD5":
310
+ hashed_text = hash_md5(text_to_hash)
311
+ elif algo == "SHA-256":
312
+ hashed_text = hash_sha256(text_to_hash)
313
+ elif algo == "SHA-512":
314
+ hashed_text = hash_sha512(text_to_hash)
315
+ st.text_area("متن هش شده:", hashed_text)
316
+
317
+ elif choice == "امضای دیجیتال":
318
+ st.subheader("امضای دیجیتال")
319
+ algo = st.selectbox("انتخاب الگوریتم", ["ECC", "DSA", "RSA"])
320
+ text_to_sign = st.text_area("متن مورد نظر برای امضا", "")
321
+ if algo == "ECC":
322
+ private_key, public_key = generate_ecc_keys()
323
+ if st.button("امضا کردن"):
324
+ signature = sign_ecc(private_key, text_to_sign)
325
+ st.text_area("امضای دیجیتال:", signature)
326
+ if st.button("تأیید امضا"):
327
+ signature_to_verify = st.text_input("امضای دیجیتال برای تأیید", "")
328
+ is_verified = verify_ecc(public_key, signature_to_verify, text_to_sign)
329
+ st.text(f"نتیجه تأیید: {'موفقیت آمیز' if is_verified else 'ناموفق'}")
330
+ elif algo == "DSA":
331
+ private_key, public_key = generate_dsa_keys()
332
+ if st.button("امضا کردن"):
333
+ signature = sign_dsa(private_key, text_to_sign)
334
+ st.text_area("امضای دیجیتال:", signature)
335
+ if st.button("تأیید امضا"):
336
+ signature_to_verify = st.text_input("امضای دیجیتال برای تأیید", "")
337
+ is_verified = verify_dsa(public_key, signature_to_verify, text_to_sign)
338
+ st.text(f"نتیجه تأیید: {'موفقیت آمیز' if is_verified else 'ناموفق'}")
339
+ elif algo == "RSA":
340
+ private_key, public_key = generate_rsa_keys()
341
+ if st.button("امضا کردن"):
342
+ signature = sign_rsa(private_key, text_to_sign)
343
+ st.text_area("امضای دیجیتال:", signature)
344
+ if st.button("تأیید"):
345
+ signature_to_verify = st.text_input("امضای دیجیتال برای تأیید", "")
346
+ is_verified = verify_rsa(public_key, signature_to_verify, text_to_sign)
347
+ st.text(f"نتیجه تأیید: {'موفقیت آمیز' if is_verified else 'ناموفق'}")
348
+
349
+ elif choice == "تولید کد QR":
350
+ st.subheader("تولید کد QR با حق کپی‌رایت")
351
+ data_to_encode = st.text_area("متن مورد نظر برای تبدیل به کد QR", "")
352
+ copyright_text = st.text_input("متن حق کپی‌رایت (مثال: © 2023 طاها تهرانی نسب)", "© 2023 طاها تهرانی نسب")
353
+ if st.button("تولید کد QR"):
354
+ img = generate_qr_code_with_copyright(data_to_encode, copyright_text)
355
+ buffered = BytesIO()
356
+ img.save(buffered, format="PNG")
357
+ img_str = base64.b64encode(buffered.getvalue()).decode()
358
+ st.image(img, caption='QR Code', use_column_width=True)
359
+ st.markdown(f"![QR Code](data:image/png;base64,{img_str})")
360
+
361
+ def hash_md5(data):
362
+ return hashlib.md5(data.encode()).hexdigest()
363
+
364
+ def hash_sha256(data):
365
+ return hashlib.sha256(data.encode()).hexdigest()
366
+
367
+ def hash_sha512(data):
368
+ return hashlib.sha512(data.encode()).hexdigest()
369
+
370
+ def encrypt_aes(data, key):
371
+ cipher = AES.new(key, AES.MODE_CBC)
372
+ ct_bytes = cipher.encrypt(pad(data.encode(), AES.block_size))
373
+ iv = base64.b64encode(cipher.iv).decode('utf-8')
374
+ ct = base64.b64encode(ct_bytes).decode('utf-8')
375
+ return iv + ct
376
+
377
+ def decrypt_aes(data, key):
378
+ iv = base64.b64decode(data[:24])
379
+ ct = base64.b64decode(data[24:])
380
+ cipher = AES.new(key, AES.MODE_CBC, iv=iv)
381
+ pt = unpad(cipher.decrypt(ct), AES.block_size)
382
+ return pt.decode('utf-8')
383
+
384
+ def encrypt_des(data, key):
385
+ cipher = DES.new(key, DES.MODE_CBC)
386
+ ct_bytes = cipher.encrypt(pad(data.encode(), DES.block_size))
387
+ iv = base64.b64encode(cipher.iv).decode('utf-8')
388
+ ct = base64.b64encode(ct_bytes).decode('utf-8')
389
+ return iv + ct
390
+
391
+ def decrypt_des(data, key):
392
+ iv = base64.b64decode(data[:12])
393
+ ct = base64.b64decode(data[12:])
394
+ cipher = DES.new(key, DES.MODE_CBC, iv=iv)
395
+ pt = unpad(cipher.decrypt(ct), DES.block_size)
396
+ return pt.decode('utf-8')
397
+
398
+ def encrypt_blowfish(data, key):
399
+ cipher = Blowfish.new(key, Blowfish.MODE_CBC)
400
+ ct_bytes = cipher.encrypt(pad(data.encode(), Blowfish.block_size))
401
+ iv = base64.b64encode(cipher.iv).decode('utf-8')
402
+ ct = base64.b64encode(ct_bytes).decode('utf-8')
403
+ return iv + ct
404
+
405
+ def decrypt_blowfish(data, key):
406
+ iv = base64.b64decode(data[:12])
407
+ ct = base64.b64decode(data[12:])
408
+ cipher = Blowfish.new(key, Blowfish.MODE_CBC, iv=iv)
409
+ pt = unpad(cipher.decrypt(ct), Blowfish.block_size)
410
+ return pt.decode('utf-8')
411
+
412
+ def encrypt_hill(data, key_matrix):
413
+ data_vector = np.array([ord(char) - 65 for char in data])
414
+ data_vector = data_vector.reshape(-1, key_matrix.shape[0])
415
+ encrypted_vector = np.dot(data_vector, key_matrix) % 26
416
+ encrypted_text = ''.join(chr(int(num) + 65) for num in encrypted_vector.flatten())
417
+ return encrypted_text
418
+
419
+ def decrypt_hill(data, key_matrix):
420
+ encrypted_vector = np.array([ord(char) - 65 for char in data])
421
+ encrypted_vector = encrypted_vector.reshape(-1, key_matrix.shape[0])
422
+ key_matrix_inv = Matrix(key_matrix).inv_mod(26)
423
+ decrypted_vector = np.dot(encrypted_vector, np.array(key_matrix_inv).astype(float)) % 26
424
+ decrypted_text = ''.join(chr(int(round(num)) + 65) for num in decrypted_vector.flatten())
425
+ return decrypted_text
426
+
427
+ def encrypt_vigenere(data, key):
428
+ key = (key * (len(data) // len(key)) + key[:len(data) % len(key)]).upper()
429
+ encrypted_text = ''.join(chr(((ord(a) + ord(b)) % 26) + 65) for a, b in zip(data.upper(), key))
430
+ return encrypted_text
431
+
432
+ def decrypt_vigenere(data, key):
433
+ key = (key * (len(data) // len(key)) + key[:len(data) % len(key)]).upper()
434
+ decrypted_text = ''.join(chr(((ord(a) - ord(b) + 26) % 26) + 65) for a, b in zip(data.upper(), key))
435
+ return decrypted_text
436
+
437
+ def encrypt_scytale(data, key):
438
+ columns = [''] * key
439
+ for i, char in enumerate(data):
440
+ columns[i % key] += char
441
+ encrypted_text = ''.join(columns)
442
+ return encrypted_text
443
+
444
+ def decrypt_scytale(data, key):
445
+ rows, remainder = divmod(len(data), key)
446
+ columns = [''] * key
447
+ start = 0
448
+ for i in range(key):
449
+ end = start + rows + (1 if i < remainder else 0)
450
+ columns[i] = data[start:end]
451
+ start = end
452
+ decrypted_text = ''.join(''.join(pair) for pair in zip(*columns))
453
+ return decrypted_text
454
+
455
+ def encrypt_playfair(data, key):
456
+ def generate_key_square(key):
457
+ alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"
458
+ key_square = ""
459
+ for char in key.upper():
460
+ if char not in key_square and char in alphabet:
461
+ key_square += char
462
+ for char in alphabet:
463
+ if char not in key_square:
464
+ key_square += char
465
+ return key_square
466
+
467
+ def chunk_text(data):
468
+ data = data.upper().replace('J', 'I')
469
+ chunks = []
470
+ i = 0
471
+ while i < len(data):
472
+ a = data[i]
473
+ b = data[i + 1] if i + 1 < len(data) else 'X'
474
+ if a == b:
475
+ chunks.append(a + 'X')
476
+ i += 1
477
+ else:
478
+ chunks.append(a + b)
479
+ i += 2
480
+ return chunks
481
+
482
+ def find_position(key_square, char):
483
+ index = key_square.index(char)
484
+ return divmod(index, 5)
485
+
486
+ key_square = generate_key_square(key)
487
+ chunks = chunk_text(data)
488
+ encrypted_text = ""
489
+ for a, b in chunks:
490
+ row1, col1 = find_position(key_square, a)
491
+ row2, col2 = find_position(key_square, b)
492
+ if row1 == row2:
493
+ encrypted_text += key_square[row1 * 5 + (col1 + 1) % 5]
494
+ encrypted_text += key_square[row2 * 5 + (col2 + 1) % 5]
495
+ elif col1 == col2:
496
+ encrypted_text += key_square[((row1 + 1) % 5) * 5 + col1]
497
+ encrypted_text += key_square[((row2 + 1) % 5) * 5 + col2]
498
+ else:
499
+ encrypted_text += key_square[row1 * 5 + col2]
500
+ encrypted_text += key_square[row2 * 5 + col1]
501
+ return encrypted_text
502
+
503
+ def decrypt_playfair(data, key):
504
+ def generate_key_square(key):
505
+ alphabet = "ABCDEFGHIKLMNOPQRSTUVWXYZ"
506
+ key_square = ""
507
+ for char in key.upper():
508
+ if char not in key_square and char in alphabet:
509
+ key_square += char
510
+ for char in alphabet:
511
+ if char not in key_square:
512
+ key_square += char
513
+ return key_square
514
+
515
+ def chunk_text(data):
516
+ return [data[i:i + 2] for i in range(0, len(data), 2)]
517
+
518
+ def find_position(key_square, char):
519
+ index = key_square.index(char)
520
+ return divmod(index, 5)
521
+
522
+ key_square = generate_key_square(key)
523
+ chunks = chunk_text(data)
524
+ decrypted_text = ""
525
+ for a, b in chunks:
526
+ row1, col1 = find_position(key_square, a)
527
+ row2, col2 = find_position(key_square, b)
528
+ if row1 == row2:
529
+ decrypted_text += key_square[row1 * 5 + (col1 - 1) % 5]
530
+ decrypted_text += key_square[row2 * 5 + (col2 - 1) % 5]
531
+ elif col1 == col2:
532
+ decrypted_text += key_square[((row1 - 1) % 5) * 5 + col1]
533
+ decrypted_text += key_square[((row2 - 1) % 5) * 5 + col2]
534
+ else:
535
+ decrypted_text += key_square[row1 * 5 + col2]
536
+ decrypted_text += key_square[row2 * 5 + col1]
537
+ return decrypted_text
538
+
539
+ def generate_ecc_keys():
540
+ private_key = SigningKey.generate(curve=SECP256k1)
541
+ public_key = private_key.verifying_key
542
+ return private_key, public_key
543
+
544
+ def sign_ecc(private_key, data):
545
+ signature = private_key.sign(data.encode())
546
+ return base64.b64encode(signature).decode()
547
+
548
+ def verify_ecc(public_key, signature, data):
549
+ try:
550
+ signature = base64.b64decode(signature)
551
+ return public_key.verify(signature, data.encode())
552
+ except BadSignatureError:
553
+ return False
554
+
555
+ def generate_dsa_keys():
556
+ key = DSA.generate(1024)
557
+ private_key = key
558
+ public_key = key.publickey()
559
+ return private_key, public_key
560
+
561
+ def sign_dsa(private_key, data):
562
+ hasher = SHA256.new(data.encode())
563
+ signer = DSS.new(private_key, 'fips-186-3')
564
+ signature = signer.sign(hasher)
565
+ return base64.b64encode(signature).decode()
566
+
567
+ def verify_dsa(public_key, signature, data):
568
+ try:
569
+ hasher = SHA256.new(data.encode())
570
+ verifier = DSS.new(public_key, 'fips-186-3')
571
+ signature = base64.b64decode(signature)
572
+ verifier.verify(hasher, signature)
573
+ return True
574
+ except (ValueError, TypeError):
575
+ return False
576
+
577
+ def generate_rsa_keys():
578
+ key = RSA.generate(2048)
579
+ private_key = key
580
+ public_key = key.publickey()
581
+ return private_key, public_key
582
+
583
+ def sign_rsa(private_key, data):
584
+ hasher = SHA256.new(data.encode())
585
+ signer = pkcs1_15.new(private_key)
586
+ signature = signer.sign(hasher)
587
+ return base64.b64encode(signature).decode()
588
+
589
+ def verify_rsa(public_key, signature, data):
590
+ try:
591
+ hasher = SHA256.new(data.encode())
592
+ verifier = pkcs1_15.new(public_key)
593
+ signature = base64.b64decode(signature)
594
+ verifier.verify(hasher, signature)
595
+ return True
596
+ except (ValueError, TypeError):
597
+ return False
598
+
599
+ if __name__ == '__main__':
600
+ st.write("© 2023 طاها تهرانی نسب")
601
+ #main()