Commit 6333e5ad by Owo Sugiana

Kali pertama

0 parents
0.1 11-3-2021
-------------
- Kali pertama
LinkAja Encryption
==================
Ini berisi class yang digunakan untuk melakukan encrypt dan decrypt data
LinkAja, produk PT Telkom.
Contoh penggunaannya ada di direktori ``test``. Untuk mengujinya pasang dulu
paket yang dibutuhkan::
$ ~/env/bin/pip install pytest
Lalu jalankan::
$ ~/env/bin/pytest test/payment.py
Selamat mencoba.
File mode changed
import base64
import hashlib
from Crypto.Cipher import AES
BLOCK_SIZE = 16
def pad(s):
p = len(s)
sisa = p % BLOCK_SIZE
sisa = BLOCK_SIZE - sisa
tambahan = sisa * chr(sisa)
return s + tambahan
def unpad(s):
p = len(s)
i = p - 1
raw = s[i:]
i = ord(raw)
return s[:-i]
class Crypt:
def __init__(self, key):
key = key.encode('utf-8')
key = hashlib.sha256(key)
self.key = key.digest()
def encrypt(self, raw, iv):
iv = iv.encode('utf-8')
raw = pad(raw)
raw = raw.encode('utf-8')
cipher = AES.new(self.key, AES.MODE_CBC, iv)
raw_crypted = cipher.encrypt(raw)
raw_salted = iv + raw_crypted
return base64.b64encode(raw_salted)
def decrypt(self, raw_b64):
raw_salted = base64.b64decode(raw_b64)
iv = raw_salted[:16]
raw_crypted = raw_salted[16:]
cipher = AES.new(self.key, AES.MODE_CBC, iv)
raw = cipher.decrypt(raw_crypted)
raw = unpad(raw)
return bytes.decode(raw)
from datetime import datetime
from . import Crypt as BaseCrypt
begin_unix_time = datetime(1970, 1, 1)
def create_iv():
durasi = datetime.utcnow() - begin_unix_time
detik = durasi.total_seconds()
detik = int(detik)
return str(detik) + '000000'
class Crypt(BaseCrypt):
def encrypt(self, raw):
iv = create_iv()
return super().encrypt(raw, iv)
import os
from setuptools import (
setup,
find_packages,
)
here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.rst')) as f:
README = f.read()
with open(os.path.join(here, 'CHANGES.txt')) as f:
CHANGES = f.read()
line = CHANGES.splitlines()[0]
version = line.split()[0]
requires = [
'PyCryptodome',
]
tests_require = [
'pytest',
]
setup(
name='linkaja-crypt',
version=version,
description='Enkripsi LinkAja',
long_description=README + '\n\n' + CHANGES,
author='Owo Sugiana',
author_email='sugiana@gmail.com',
license='PostgreSQL License',
extras_require={
'testing': tests_require,
},
packages=find_packages(),
install_requires=requires,
zip_safe=False,
)
import unittest
import json
from linkaja.crypt.payment import Crypt
class Coba(unittest.TestCase):
def test_encrypt(self):
d = dict(invoice_id='1234')
raw1 = json.dumps(d)
key = '1234'
c = Crypt(key)
crypted = c.encrypt(raw1)
raw2 = c.decrypt(crypted)
self.assertEqual(raw1, raw2)
if __name__ == '__main__':
unittest.main()
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!