DEV Community

Cover image for Kapak - A simple-to-use file encryption script
Amis
Amis

Posted on • Edited on

Kapak - A simple-to-use file encryption script

Hey Dev,
I've recently published a Python package. It's called Kapak (means mold). You can check it out here.

Kapak is a file encryption script/library and it takes advantage of AES_256_CBC cipher.

Installation

Installing with pip:

pip install kapak
Enter fullscreen mode Exit fullscreen mode

CLI Usage

kapak [global options] [command] [command options] [input]
kapak [encrypt | e] [options] [input]
kapak [decrypt | d] [options] [input]
Enter fullscreen mode Exit fullscreen mode

For more help run:

kapak --help
Enter fullscreen mode Exit fullscreen mode

Encrypt file

$ kapak encrypt -o ./image.jpg.kpk ./image.jpg
Enter password:
Confirm password:
■■■■■■■■■■ 100%
Enter fullscreen mode Exit fullscreen mode
$ kapak decrypt -o ./image.jpg ./image.jpg.kpk
Enter password:
■■■■■■■■■■ 100%
Enter fullscreen mode Exit fullscreen mode

Encrypt stdin

$ echo 'secret stuff' | kapak encrypt | base64
Enter password:
Confirm password:
AAAAbWth...t/ILJW/v
Enter fullscreen mode Exit fullscreen mode
$ echo 'AAAAbWth...t/ILJW/v' | base64 --decode | kapak decrypt
Enter password:
secret stuff
Enter fullscreen mode Exit fullscreen mode

You can change the buffer size by passing -b or --buffer-size option followed by a number.

$ cat ./text.txt | kapak encrypt -b 1024 > ./text.txt.kpk
Enter password:
Confirm password:
Enter fullscreen mode Exit fullscreen mode
$ kapak decrypt -b 1024 ./text.txt.kpk > ./text.txt
Enter password:
Enter fullscreen mode Exit fullscreen mode

Password file

You can put the password in a file and then pass it with -p or --password-file option if you want to use Kapak non-interactively.

$ echo 'P@ssw0rd' > ./password.txt
$ kapak encrypt -p ./password.txt -o ./image.jpg.kpk ./image.jpg
■■■■■■■■■■ 100%
Enter fullscreen mode Exit fullscreen mode
$ kapak decrypt -p ./password.txt -o ./image.jpg ./image.jpg.kpk
■■■■■■■■■■ 100%
Enter fullscreen mode Exit fullscreen mode

Make sure to shred the password file afterwards. (If it's on an SSD then good luck shreding it)

Integration

You can also integrate Kapak into your Python projects.

Encrypt file

from pathlib import Path
from kapak.aes import encrypt

input_file = Path("image.jpg")
output_file = Path("image.jpg.kpk")

with input_file.open("rb") as src, output_file.open("wb") as dst:
    total_len = input_file.stat().st_size
    progress = 0
    for chunk_len in encrypt(src, dst, "P@ssw0rd"):
        progress += chunk_len
        print(f"{progress}/{total_len}")
Enter fullscreen mode Exit fullscreen mode

kapak.aes.encrypt is a generator. It yields the length of encrypted data on every iteration.

from pathlib import Path
from itertools import accumulate
from kapak.aes import decrypt

input_file = Path("image.jpg.kpk")
output_file = Path("image.jpg")

with input_file.open("rb") as src, output_file.open("wb") as dst:
    total_len = input_file.stat().st_size
    for progress in accumulate(decrypt(src, dst, "P@ssw0rd")):
        print(f"{progress}/{total_len}")
Enter fullscreen mode Exit fullscreen mode

kapak.aes.decrypt is a generator. It yields the length of decrypted data on every iteration.

Encrypt stdin

import sys
from io import BytesIO
from kapak.aes import encrypt

with BytesIO() as dst:
    for _ in encrypt(
        src=sys.stdin.buffer,
        dst=dst,
        password="P@ssw0rd",
        buffer_size=1024
    ):
        pass
    encrypted_data = dst.getvalue()
    print(encrypted_data.hex())
Enter fullscreen mode Exit fullscreen mode

Encrypt anything

from io import BytesIO
from kapak.aes import encrypt

anything = b"anything"

with BytesIO(anything) as src, BytesIO() as dst:
    for _ in encrypt(
        src=src,
        dst=dst,
        password="P@ssw0rd",
        buffer_size=1024
    ):
        pass
    encrypted_data = dst.getvalue()
    print(encrypted_data.hex())
Enter fullscreen mode Exit fullscreen mode

Feedback 🤩

I'd be happy checking your feedbacks.

Top comments (0)