CryptoVault / app.py
Jazz1508's picture
Create app.py
c839edd verified
import gradio as gr
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64
import io
def pad(data):
pad_len = AES.block_size - len(data) % AES.block_size
return data + bytes([pad_len] * pad_len)
def unpad(data):
return data[:-data[-1]]
def encrypt_image(image, password):
key = password.encode('utf-8').ljust(32, b'\0')[:32]
img_bytes = image.read()
img_padded = pad(img_bytes)
cipher = AES.new(key, AES.MODE_CBC)
ciphertext = cipher.encrypt(img_padded)
encrypted_data = base64.b64encode(cipher.iv + ciphertext).decode('utf-8')
return encrypted_data
def decrypt_image(encrypted_text, password):
try:
key = password.encode('utf-8').ljust(32, b'\0')[:32]
encrypted_data = base64.b64decode(encrypted_text)
iv = encrypted_data[:16]
ciphertext = encrypted_data[16:]
cipher = AES.new(key, AES.MODE_CBC, iv=iv)
decrypted = unpad(cipher.decrypt(ciphertext))
return decrypted
except Exception as e:
return f"Decryption failed: {str(e)}"
def encrypt_ui(image, password):
if image is None or password.strip() == "":
return "Please upload image and enter a password."
return encrypt_image(image, password)
def decrypt_ui(encrypted_text, password):
result = decrypt_image(encrypted_text, password)
if isinstance(result, bytes):
return gr.Image.update(value=io.BytesIO(result))
return result
footer_note = "πŸ”’ Made by Kratu Pandey, B.Tech CSE"
encrypt_tab = gr.Interface(
fn=encrypt_ui,
inputs=[
gr.File(label="Upload Image"),
gr.Text(label="Password", type="password")
],
outputs="text",
title="πŸ” Encrypt Image",
description=footer_note
)
decrypt_tab = gr.Interface(
fn=decrypt_ui,
inputs=[
gr.Text(label="Encrypted Text"),
gr.Text(label="Password", type="password")
],
outputs="image",
title="πŸ”“ Decrypt Image",
description=footer_note
)
gr.TabbedInterface(
[encrypt_tab, decrypt_tab],
tab_names=["Encrypt Image", "Decrypt Image"]
).launch()