{"id":24838293,"url":"https://github.com/duckymomo20012/image-n-crypt","last_synced_at":"2026-04-09T02:31:44.299Z","repository":{"id":38191416,"uuid":"445224611","full_name":"DuckyMomo20012/image-n-crypt","owner":"DuckyMomo20012","description":"A flask server for encrypting images","archived":false,"fork":false,"pushed_at":"2023-02-13T15:59:42.000Z","size":1192,"stargazers_count":2,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-21T12:00:30.732Z","etag":null,"topics":["docker","docker-compose","flask","flask-jwt-extended","flask-mongoengine","flask-restx","flask-wtforms","jenkins","jwt","python"],"latest_commit_sha":null,"homepage":"https://image-n-crypt.onrender.com/api/v1/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DuckyMomo20012.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-01-06T15:49:45.000Z","updated_at":"2023-02-14T11:00:48.000Z","dependencies_parsed_at":"2023-02-09T14:32:48.189Z","dependency_job_id":null,"html_url":"https://github.com/DuckyMomo20012/image-n-crypt","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/DuckyMomo20012/image-n-crypt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckyMomo20012%2Fimage-n-crypt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckyMomo20012%2Fimage-n-crypt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckyMomo20012%2Fimage-n-crypt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckyMomo20012%2Fimage-n-crypt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DuckyMomo20012","download_url":"https://codeload.github.com/DuckyMomo20012/image-n-crypt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DuckyMomo20012%2Fimage-n-crypt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31582613,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"online","status_checked_at":"2026-04-09T02:00:06.848Z","response_time":112,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","flask","flask-jwt-extended","flask-mongoengine","flask-restx","flask-wtforms","jenkins","jwt","python"],"created_at":"2025-01-31T06:10:17.769Z","updated_at":"2026-04-09T02:31:44.280Z","avatar_url":"https://github.com/DuckyMomo20012.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n  \u003ch1\u003eImage-N-crypt\u003c/h1\u003e\n\n  \u003cp\u003e\n    Flask server for storing encrypted images\n  \u003c/p\u003e\n\n\u003c!-- Badges --\u003e\n\u003cp\u003e\n  \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/graphs/contributors\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/contributors/DuckyMomo20012/image-n-crypt\" alt=\"contributors\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/last-commit/DuckyMomo20012/image-n-crypt\" alt=\"last update\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/network/members\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/forks/DuckyMomo20012/image-n-crypt\" alt=\"forks\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/stargazers\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/stars/DuckyMomo20012/image-n-crypt\" alt=\"stars\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/issues/\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/issues/DuckyMomo20012/image-n-crypt\" alt=\"open issues\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/blob/main/LICENSE\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/license/DuckyMomo20012/image-n-crypt.svg\" alt=\"license\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch4\u003e\n    \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/\"\u003eView Demo\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n    \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt\"\u003eDocumentation\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n    \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/issues/\"\u003eReport Bug\u003c/a\u003e\n  \u003cspan\u003e · \u003c/span\u003e\n    \u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/issues/\"\u003eRequest Feature\u003c/a\u003e\n  \u003c/h4\u003e\n\u003c/div\u003e\n\n\u003cbr /\u003e\n\n\u003c!-- Table of Contents --\u003e\n\n# :notebook_with_decorative_cover: Table of Contents\n\n- [About the Project](#star2-about-the-project)\n  - [Screenshots](#camera-screenshots)\n  - [Tech Stack](#space_invader-tech-stack)\n  - [Features](#dart-features)\n  - [Environment Variables](#key-environment-variables)\n- [Getting Started](#toolbox-getting-started)\n  - [Prerequisites](#bangbang-prerequisites)\n  - [Run Locally](#running-run-locally)\n  - [Running Tests](#test_tube-running-tests)\n  - [Deployment](#triangular_flag_on_post-deployment)\n- [Usage](#eyes-usage)\n  - [Register an account](#raising_hand-register-an-account)\n  - [Access protected endpoints](#no_pedestrians-access-protected-endpoints)\n  - [About file client/api.py](#information_source-about-file-clientapipy)\n  - [Encrypt and decrypt files manually](#asterisk-encrypt-and-decrypt-files-manually)\n  - [Upload image notes](#outbox_tray-upload-image-notes)\n- [REST API Documentation](#book-rest-api-documentation)\n- [RSA Encryption Algorithm](#crystal_ball-rsa-encryption-algorithm)\n- [Roadmap](#compass-roadmap)\n- [Contributing](#wave-contributing)\n  - [Code of Conduct](#scroll-code-of-conduct)\n- [FAQ](#grey_question-faq)\n- [License](#warning-license)\n- [Contact](#handshake-contact)\n- [Acknowledgements](#gem-acknowledgements)\n\n\u003c!-- About the Project --\u003e\n\n## :star2: About the Project\n\n\u003c!-- Screenshots --\u003e\n\n### :camera: Screenshots\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/64480713/177001704-d6ca292f-02e3-41f5-97e4-8ff6064e0fa1.png\" alt=\"screenshot\" /\u003e\n\u003c/div\u003e\n\n\u003c!-- TechStack --\u003e\n\n### :space_invader: Tech Stack\n\n\u003cdetails\u003e\n  \u003csummary\u003eClient\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://www.python.org/\"\u003ePython\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eServer\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://flask.palletsprojects.com/en/latest/\"\u003eFlask\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eDatabase\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://www.mongodb.com/\"\u003eMongoDB\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eDevOps\u003c/summary\u003e\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"https://www.docker.com/\"\u003eDocker\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"https://www.jenkins.io/\"\u003eJenkins\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\n\u003c!-- Features --\u003e\n\n### :dart: Features\n\n- Register and login user.\n- Storing image: app client encrypts the image with the RSA algorithm and sends\n  the request to the server to store the image.\n  - Image encrypted is required to be **openable**, but the opener may or may\n    not understand the image.\n- View the image list.\n- Download image: client download encrypted images and decrypts it using the\n  user's RSA private key.\n  - Download one image.\n  - Download all images.\n- Share the image with others: other users can download the image.\n- After registration, an account is created with this information:\n  - username.\n  - ID.\n  - RSA public key (provided by the user before registration).\n- Server connects with the client by using REST API.\n\n\u003c!-- Env Variables --\u003e\n\n### :key: Environment Variables\n\nTo run this project, you will need to add the following environment variables to\nyour `.env` file:\n\n- **App configs:**\n\n  `SECRET_KEY`: Secret key for Flask application.\n\n  `UPLOADED_IMAGES_DEST`: Destination folder for server downloading uploaded\n  images. Default: `src/assets`.\n\n  \u003e **Note**: The application will automatically create a new `UPLOADED_IMAGE_DEST`\n  \u003e directory if it does not exist and `DOWNLOAD_UPLOADED_IMAGES` is `True`.\n\n  `FLASK_ENV`: Enable hot reloading in `development` mode. Default: `production`.\n\n  \u003e **Note**: Change to \"development\" mode to enable hot reloading.\n\n  `DOWNLOAD_UPLOADED_IMAGES`: Enable server downloading uploaded images. Default:\n  `False`.\n\n- **JWT configs:**\n\n  `JWT_ACCESS_TOKEN_EXPIRES`: Time in seconds for access token expiration.\n  Default: `3600` (1 hour).\n\n  `JWT_SECRET_KEY`: Secret key for JWT.\n\n- **MongoDB configs:**\n\n  `MONGODB_HOST`: An URI to connect to your database\n\nE.g:\n\n```\n# .env\n# App configs\nSECRET_KEY=\"my secret key\"\nUPLOADED_IMAGES_DEST=\"src/assets\"\n# Change to \"development\" to enable hot reloading\nFLASK_ENV=\"production\"\nDOWNLOAD_UPLOADED_IMAGES=False\n\n# JWT configs\nJWT_ACCESS_TOKEN_EXPIRES=3600 # 1 hour\nJWT_SECRET_KEY=\"my super secret key\"\n\n# MongoDB configs\n# HOST not URI\nMONGODB_HOST=\"mongodb+srv://{username}:{password}@crypto-image.u1r0p.mongodb.net/test\"\n```\n\nYou can also check out the file `.env.example` to see all required environment\nvariables.\n\n\u003c!-- Getting Started --\u003e\n\n## :toolbox: Getting Started\n\n\u003c!-- Prerequisites --\u003e\n\n### :bangbang: Prerequisites\n\n- Python: `\u003e= 3.9`.\n\n- This project uses [Poetry](https://python-poetry.org/) as package manager:\n\n  Linux, macOS, Windows (WSL)\n\n  ```bash\n  curl -sSL https://install.python-poetry.org | python3 -\n  ```\n\n  Read more about installation on\n  [Poetry documentation](https://python-poetry.org/docs/master/#installation).\n\n\u003c!-- Run Locally --\u003e\n\n### :running: Run Locally\n\nClone the project:\n\n```bash\ngit clone https://github.com/DuckyMomo20012/image-n-crypt.git\n```\n\nGo to the project directory:\n\n```bash\ncd image-n-crypt\n```\n\nInstall dependencies:\n\n```bash\npoetry install\n```\n\nOR:\n\nExport Poetry dependencies to file `requirements.txt`:\n\n```bash\npoetry export -f requirements.txt --output requirements.txt\n```\n\n\u003e **Note**: You can add option: `--dev` to include development dependencies.\n\nThen install dependencies with `pip`:\n\n```bash\npip install -r requirements.txt\n```\n\n---\n\nActivate the virtual environment:\n\n```bash\npoetry shell\n```\n\nStart the program:\n\n```bash\npoe dev\n```\n\nOR\n\n```bash\nflask run\n```\n\nAccess local Swagger documentation:\n\nhttp://127.0.0.1:5000/api/v1/\n\n\u003c!-- Running Tests --\u003e\n\n### :test_tube: Running Tests\n\n- **Test REST API endpoints**: You can test endpoints using these ways:\n\n  - [Hoppscoth](https://hoppscotch.io/): an open-source API development\n    ecosystem\n\n    ![hoppscotch.io](https://user-images.githubusercontent.com/64480713/177003377-aa1b901e-fa47-474d-bbdf-3d287192f915.png)\n\n    - You can import pre-defined REST API endpoints from the file\n      `data/hoppscoth.json` to Hoppscotch.\n\n  - **Local Swagger documentation**: a Swagger UI is generated from REST API\n    endpoints using Flask-RESTX.\n\n    ![swagger](https://user-images.githubusercontent.com/64480713/177001704-d6ca292f-02e3-41f5-97e4-8ff6064e0fa1.png)\n\n    - You can access this documentation: **http://127.0.0.1:5000/api/v1/**\n\n  - **File `client/api.py`**: pre-defined functions to send requests to the\n    server.\n\n  - **Client console**: poorly crafted client.\n\n    - You can run this client using the file `client/main.py`.\n\n    \u003e **Note**: But you can use this client to **decrypt** downloaded images!\n\n- **Sample data**:\n\n  - You can import sample data from folder `data` to your database.\n\n  - Test data will have these sample users:\n\n    \u003cdetails\u003e\n    \u003csummary\u003eSample users\u003c/summary\u003e\n\n    ```\n    admin:\n        password: admin\n        private key: rsa_admin.txt\n    admin2:\n        password: admin\n        private key: rsa_admin2.txt\n    admin2:\n        password: admin\n        private key: rsa_admin3.txt\n    ```\n\n    \u003c/details\u003e\n\n\u003c!-- Deployment --\u003e\n\n### :triangular_flag_on_post: Deployment\n\nTo deploy this project on Heroku\n\n[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy)\n\n\u003cdetails\u003e\n\u003csummary\u003eConfig deployment from scratch\u003c/summary\u003e\n\nRequirement files:\n\n- **Procfile**: Procfile specifies the commands that are executed by the app\n  on startup:\n\n  E.g:\n\n  ```\n  web: gunicorn app:app\n  ```\n\n  \u003e **Note**: \"web\" for a web process type.\n\n  \u003e **Note**: first \"app\" refers to file `app.py` and second \"app\" refers to\n  \u003e `app = Flask(__name__)` in file `app.py`.\n  \u003e [Ref](https://stackoverflow.com/a/52005826/12512981).\n\n- **requirements.txt**:\n  You can use Poetry to generate this file:\n\n  ```bash\n  poetry export -f requirements.txt --output requirements.txt\n  ```\n\n  \u003e **Note**: You have to install `gunicorn` dependency in your\n  \u003e `requirements.txt`.\n\n- **app.json**: This file is required for deploying on Heroku using deploy\n  button.\n\nRead more in this tutorial: [Deploying a Flask Application to Heroku](https://stackabuse.com/deploying-a-flask-application-to-heroku/)\n\n\u003c/details\u003e\n\n\u003c!-- Usage --\u003e\n\n## :eyes: Usage\n\n### :raising_hand: Register an account\n\nTo register an account, you need to generate RSA key pair. You have to use the\nfunction `generateAndWriteKeyToFile` in `src.helpers.crypto.crypto.py` to\ngenerate key pair. This function will create two files:\n\n- `rsa.txt`: RSA private key (This file must be kept secretly).\n- `rsa_pub.txt`: RSA public key.\n\nOR:\n\n- Using `register` from `client/api.py`.\n- Using client console.\n\nThen you can log in using your newly created account.\n\nAfter login, you will receive an `access_token`.\n\n\u003cdetails\u003e\n\u003csummary\u003eScreenshot\u003c/summary\u003e\n\n![login response](https://user-images.githubusercontent.com/64480713/177004501-ea468252-6b12-47fa-9df7-c45824055cc9.png)\n\n\u003c/details\u003e\n\n\u003e **Note**: Access token will be expired after **1 hour**.\n\n### :no_pedestrians: Access protected endpoints\n\nYou have to use your `access_token` to access protected endpoints.\n\n- **Hoppscotch**:\n\n  You have to paste your access token in the `Authorization` tab for each\n  request. E.g:\n\n  \u003cdetails\u003e\n  \u003csummary\u003eScreenshot\u003c/summary\u003e\n\n  ![hoppscotch token example](https://user-images.githubusercontent.com/64480713/177004894-18f9093d-5748-4b1c-a7cc-3508e0a7cf19.png)\n\n  \u003c/details\u003e\n\n  \u003e **Note**: You have to choose **Authorization Type**: `Bearer`\n\n- **Swagger doc**: you MUST add your access token to access protected\n  endpoints. By clicking the `Authorize` button:\n\n  \u003cdetails\u003e\n  \u003csummary\u003eScreenshot\u003c/summary\u003e\n\n  ![authorize button](https://user-images.githubusercontent.com/64480713/177004457-8a6768f8-9119-40d5-a82e-6e58d5a78d99.png)\n\n  \u003c/details\u003e\n\n  OR:\n\n  Clicking the **lock icon (:lock:)** on protected endpoints.\n\n  Then type your access token in the input field. E.g:\n\n  ```\n  Bearer eyJ0eXAiO...\n  ```\n\n  \u003e **Note**: Must be in the format `Bearer {access_token}`.\n\n- **File `client/api.py`**:\n\n  You have to call both functions `login` and `getUserInformation`:\n\n  \u003cdetails\u003e\n  \u003csummary\u003eExample code\u003c/summary\u003e\n\n  ```python\n  login(username=\"admin\", password=\"admin\")\n  getUserInformation() # This will set global access_token and others global\n  variables\n  ```\n\n  \u003c/details\u003e\n\n### :information_source: About file `client/api.py`:\n\n- All functions ALWAYS return a tuple[message, status code] `(tuple[str, int])`.\n\n- This file contains some global variables, so you have to call both functions\n  `login` and `getUserInformation` to set these global variables before calling\n  other functions.\n\n- To handle this response, you can use the function `handleRes` in\n  `client/helpers.py` (This function is used by the client console too).\n\n### :asterisk: Encrypt and decrypt files manually:\n\nYou can use functions from the file `src/helpers/crypto/crypto.py`.\n\nExamples below are extracted from file `client/api.py`:\n\n  \u003cdetails\u003e\n  \u003csummary\u003eGenerate RSA key pair\u003c/summary\u003e\n\n```python\ndef register(username, password)\n    # ...\n    e, d, n = generateAndWriteKeyToFile(\"\", writeFile=True)\n```\n\n  \u003c/details\u003e\n\n  \u003cdetails\u003e\n  \u003csummary\u003eEncrypt file\u003c/summary\u003e\n\n```python\ndef uploadImage(fileName)\n    # ...\n    encrypt(\n        fileName,\n        n=n,\n        e=e,\n        imgEncryptedSaveDst=fileName_encrypt,\n        quotientSaveDst=\"quotient.txt\",\n    )\n```\n\n  \u003c/details\u003e\n\n  \u003cdetails\u003e\n  \u003csummary\u003eDecrypt file\u003c/summary\u003e\n\n```python\ndef downloadImage(downloadFile, privateKeyPath)\n    # ...\n    decrypt(\n        imgEncryptedPath=downloadFile,\n        privateKeyPath=privateKeyPath,\n        imgDecryptedSaveDst=downloadFile_d,\n    )\n```\n\n  \u003c/details\u003e\n\n### :outbox_tray: Upload image notes\n\n- Currently, you can only upload images in PNG format.\n\n- Image should have a small size.\n\n\u003c!-- REST API Documentation --\u003e\n\n## :book: REST API Documentation\n\nYou can use local Swagger documentation to see details about endpoints.\n\nOR:\n\nSee it on [Wiki](https://github.com/DuckyMomo20012/image-n-crypt/wiki), [REST API\nendpoints](https://github.com/DuckyMomo20012/image-n-crypt/wiki/REST-API-endpoints)\npage, with details about implementation and explanation.\n\n\u003c!-- RSA Encryption Algorithm --\u003e\n\n## :crystal_ball: RSA Encryption Algorithm:\n\nThis section has moved to\n[Wiki](https://github.com/DuckyMomo20012/image-n-crypt/wiki), [RSA encryption algorithm](https://github.com/DuckyMomo20012/image-n-crypt/wiki/RSA-encryption-algorithm) page.\n\n\u003c!-- Roadmap --\u003e\n\n## :compass: Roadmap\n\n- [x] Important: Remove entirely CSRF protection. ~~Keeps CSRF for\n      Authentication~~.\n- [x] Set the expiration time for the token.\n- [x] Add validator for only .PNG image file.\n- [x] Handle expired token error.\n- [ ] Support more image extensions, and more file types.\n- [ ] Client support decrypt image service.\n- [ ] Handle file permissions (read/write).\n\n\u003c!-- Contributing --\u003e\n\n## :wave: Contributing\n\n\u003ca href=\"https://github.com/DuckyMomo20012/image-n-crypt/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=DuckyMomo20012/image-n-crypt\" /\u003e\n\u003c/a\u003e\n\nContributions are always welcome!\n\n\u003c!-- Code of Conduct --\u003e\n\n### :scroll: Code of Conduct\n\nPlease read the [Code of Conduct](https://github.com/DuckyMomo20012/image-n-crypt/blob/main/CODE_OF_CONDUCT.md).\n\n\u003c!-- FAQ --\u003e\n\n## :grey_question: FAQ\n\n- Is this project still maintained?\n\n  - Yes, but we will only update UI, docs, or dependencies. New features won't\n    be added frequently.\n\n- Is this project ready for production?\n\n  - No, this is a small project for practicing cryptographic systems or schemes.\n    This wasn't meant for production.\n  - RSA algorithm is **implemented from scratch**, which is **unsafe** for\n    production.\n\n- Client console error: `ModuleNotFoundError: No module named 'src'`:\n\n  - You are not exporting the `PYTHONPATH` environment variable to the project\n    directory.\n\n  - Run this command:\n\n    - **Windows:**\n\n      ```console\n      set PYTHONPATH=%cd%\n      ```\n\n    - **Linux:**\n\n      ```bash\n      export PYTHONPATH=$(pwd)\n      ```\n\n- Decrypt image took too long:\n\n  - Because we implement the RSA algorithm from scratch, so it is unsafe and has\n    slow performance. You should upload an image with a smaller size.\n\n- Deploy on Heroku error: `No web processes running`:\n\n  - You are missing file `Procfile` or `gunicorn` dependency.\n\n\u003c!-- License --\u003e\n\n## :warning: License\n\nDistributed under MIT license. See\n[LICENSE](https://github.com/DuckyMomo20012/image-n-crypt/blob/main/LICENSE) for\nmore information.\n\n\u003c!-- Contact --\u003e\n\n## :handshake: Contact\n\nDuong Vinh - [@duckymomo20012](https://twitter.com/duckymomo20012) -\ntienvinh.duong4@gmail.com\n\nProject Link: [https://github.com/DuckyMomo20012/image-n-crypt](https://github.com/DuckyMomo20012/image-n-crypt).\n\n\u003c!-- Acknowledgments --\u003e\n\n## :gem: Acknowledgements\n\nHere are useful resources and libraries that we have used in our projects:\n\n- [Flask](https://flask.palletsprojects.com/): A lightweight WSGI web\n  application framework.\n- [Flask-RESTX](https://flask-restx.readthedocs.io/en/latest/): A Flask\n  extension that provides a consistent, simple, and powerful API framework.\n- [Flask-JWT-Extended](https://flask-jwt-extended.readthedocs.io/en/latest/):\n  Adds support for using JSON Web Tokens (JWT) to Flask for protecting routes.\n- [Awesome Readme Template](https://github.com/Louis3797/awesome-readme-template):\n  A detailed template to bootstrap your README file quickly.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduckymomo20012%2Fimage-n-crypt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fduckymomo20012%2Fimage-n-crypt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fduckymomo20012%2Fimage-n-crypt/lists"}