├── README.md
├── requirements.txt
├── LICENSE
├── app.py
└── .gitignore
/README.md:
--------------------------------------------------------------------------------
1 | # encryptx
2 | encryptx
3 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | streamlit
2 | cryptography
3 | pillow
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 AI Anytime
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/app.py:
--------------------------------------------------------------------------------
1 | import streamlit as st
2 | from cryptography.fernet import Fernet
3 | from PIL import Image
4 | import io
5 |
6 | # Set page configuration
7 | st.set_page_config(
8 | page_title="Image Encryption App",
9 | page_icon="🔒",
10 | layout="wide"
11 | )
12 |
13 | # Function to generate a key
14 | def generate_key():
15 | return Fernet.generate_key()
16 |
17 | # Function to encrypt the image
18 | def encrypt_image(image_bytes, key):
19 | f = Fernet(key)
20 | encrypted_data = f.encrypt(image_bytes)
21 | return encrypted_data
22 |
23 | # Function to decrypt the image
24 | def decrypt_image(encrypted_data, key):
25 | f = Fernet(key)
26 | decrypted_data = f.decrypt(encrypted_data)
27 | return decrypted_data
28 |
29 | # Streamlit app
30 | st.markdown("
Image Encryption for Secure Internet Transfer
", unsafe_allow_html=True)
31 |
32 | st.write("This app allows you to upload an image, encrypt it for secure transfer, and then download the encrypted image.")
33 |
34 | # Initialize session state for the key and encrypted image
35 | if 'key' not in st.session_state:
36 | st.session_state.key = None
37 | if 'encrypted_image' not in st.session_state:
38 | st.session_state.encrypted_image = None
39 |
40 | uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "png"])
41 |
42 | if uploaded_file is not None:
43 | col1, col2 = st.columns(2)
44 |
45 | with col1:
46 | image = Image.open(uploaded_file)
47 | st.image(image, caption='Uploaded Image.', use_column_width=True)
48 | uploaded_file.seek(0) # Reset the file pointer to the start
49 | image_bytes = uploaded_file.read()
50 |
51 | with col2:
52 | if st.session_state.key is None:
53 | st.session_state.key = generate_key()
54 | if st.session_state.encrypted_image is None:
55 | st.session_state.encrypted_image = encrypt_image(image_bytes, st.session_state.key)
56 |
57 | st.write("Image encrypted successfully!")
58 |
59 | st.download_button(label="Download Encrypted Image", data=st.session_state.encrypted_image, file_name="encrypted_image.bin", mime="application/octet-stream")
60 |
61 | st.write("Save this key securely to decrypt the image later:")
62 | st.code(st.session_state.key.decode())
63 |
64 | decrypt = st.checkbox("Decrypt image (For demonstration purposes)")
65 |
66 | if decrypt:
67 | try:
68 | decrypted_image_bytes = decrypt_image(st.session_state.encrypted_image, st.session_state.key)
69 | decrypted_image = Image.open(io.BytesIO(decrypted_image_bytes))
70 | st.image(decrypted_image, caption='Decrypted Image.', use_column_width=True)
71 | except Exception as e:
72 | st.error(f"Error decrypting image: {e}")
73 |
74 | # Run the app with: streamlit run image_encryption_app.py
75 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | share/python-wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 | MANIFEST
28 |
29 | # PyInstaller
30 | # Usually these files are written by a python script from a template
31 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
32 | *.manifest
33 | *.spec
34 |
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 |
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .nox/
43 | .coverage
44 | .coverage.*
45 | .cache
46 | nosetests.xml
47 | coverage.xml
48 | *.cover
49 | *.py,cover
50 | .hypothesis/
51 | .pytest_cache/
52 | cover/
53 |
54 | # Translations
55 | *.mo
56 | *.pot
57 |
58 | # Django stuff:
59 | *.log
60 | local_settings.py
61 | db.sqlite3
62 | db.sqlite3-journal
63 |
64 | # Flask stuff:
65 | instance/
66 | .webassets-cache
67 |
68 | # Scrapy stuff:
69 | .scrapy
70 |
71 | # Sphinx documentation
72 | docs/_build/
73 |
74 | # PyBuilder
75 | .pybuilder/
76 | target/
77 |
78 | # Jupyter Notebook
79 | .ipynb_checkpoints
80 |
81 | # IPython
82 | profile_default/
83 | ipython_config.py
84 |
85 | # pyenv
86 | # For a library or package, you might want to ignore these files since the code is
87 | # intended to run in multiple environments; otherwise, check them in:
88 | # .python-version
89 |
90 | # pipenv
91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
94 | # install all needed dependencies.
95 | #Pipfile.lock
96 |
97 | # poetry
98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
99 | # This is especially recommended for binary packages to ensure reproducibility, and is more
100 | # commonly ignored for libraries.
101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
102 | #poetry.lock
103 |
104 | # pdm
105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
106 | #pdm.lock
107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
108 | # in version control.
109 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control
110 | .pdm.toml
111 | .pdm-python
112 | .pdm-build/
113 |
114 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
115 | __pypackages__/
116 |
117 | # Celery stuff
118 | celerybeat-schedule
119 | celerybeat.pid
120 |
121 | # SageMath parsed files
122 | *.sage.py
123 |
124 | # Environments
125 | .env
126 | .venv
127 | env/
128 | venv/
129 | ENV/
130 | env.bak/
131 | venv.bak/
132 |
133 | # Spyder project settings
134 | .spyderproject
135 | .spyproject
136 |
137 | # Rope project settings
138 | .ropeproject
139 |
140 | # mkdocs documentation
141 | /site
142 |
143 | # mypy
144 | .mypy_cache/
145 | .dmypy.json
146 | dmypy.json
147 |
148 | # Pyre type checker
149 | .pyre/
150 |
151 | # pytype static type analyzer
152 | .pytype/
153 |
154 | # Cython debug symbols
155 | cython_debug/
156 |
157 | # PyCharm
158 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can
159 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
160 | # and can be added to the global gitignore or merged into this file. For a more nuclear
161 | # option (not recommended) you can uncomment the following to ignore the entire idea folder.
162 | #.idea/
163 |
--------------------------------------------------------------------------------