This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2021-06-14
Channels
- # announcements (3)
- # asami (22)
- # babashka (9)
- # beginners (92)
- # calva (7)
- # clj-kondo (8)
- # clojure (61)
- # clojure-australia (3)
- # clojure-boston (1)
- # clojure-dev (3)
- # clojure-europe (24)
- # clojure-nl (3)
- # clojure-spec (4)
- # clojure-uk (14)
- # clojurescript (5)
- # conjure (12)
- # core-async (44)
- # cryogen (8)
- # crypto (2)
- # cursive (24)
- # data-science (5)
- # events (1)
- # fulcro (10)
- # garden (2)
- # graalvm (19)
- # helix (4)
- # instaparse (13)
- # lsp (13)
- # luminus (1)
- # malli (5)
- # meander (22)
- # off-topic (22)
- # polylith (8)
- # re-frame (69)
- # react (1)
- # reagent (2)
- # releases (2)
- # shadow-cljs (52)
- # sql (7)
- # test-check (3)
- # timbre (2)
- # tools-deps (9)
Hi there! I'm struggling with what are probably some basic crypto questions. I'm trying to port some code from Python to Clojure.
(def some-key-bytes-in-base64 (make-random-bytes->b64 256))
(def public-key-text "-----BEGIN PUBLIC KEY-----QfAt0/EME\n...snip...AwIDAQAB\n-----END PUBLIC KEY-----\n")
(def rsa (rsa-fn??? public-key-text))
(def encrypted-key (rsa-encrypt??? rsa some-key-bytes-in-base64))
(def secret-message "hi")
(def aes-encrypted-secret-message (aes-encrypt??? (b64->bytes some-key-bytes-in-base64) secret-message))
(def response (send-secret-message-and-encrypted-key aes-encrypted-secret-message encrypted-key))
(def decrypted-results (aes-decrypt??? (b64->bytes some-key-bytes-in-base64) response))
Some further details -- the RSA is using PKCS1 v1.5, and the AES is using PKCS7Here is the corresponding Python code:
import base64
import os
from pkcs7 import PKCS7Encoder
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
class AESManager(object):
def __init__(self, key=None, iv=None):
self.key = key if key else base64.b64encode(os.urandom(16))
self.iv = iv if iv else '\x00' * 16
self.encoder = PKCS7Encoder()
def encrypt(self, data):
aes = AES.new(self.key, AES.MODE_CBC, self.iv)
padded_text = self.encoder.encode(data)
cipher_text = aes.encrypt(padded_text)
return base64.b64encode(cipher_text)
def decrypt(self, data):
aes = AES.new(self.key, AES.MODE_CBC, self.iv)
cipher_text = base64.b64decode(data)
clear = aes.decrypt(cipher_text)
text = self.encoder.decode(clear.decode('utf-8'))
return text
class RSAManager(object):
def __init__(self, public_key=None, private_key=None):
self.public_key = RSA.importKey(public_key) if public_key else None
self.private_key = RSA.importKey(private_key) if private_key else None
def encrypt(self, data, encode=True):
if not self.public_key:
raise Exception("Cannot encrypt without public key")
cipher = PKCS1_v1_5.new(self.public_key)
encrypted_data = cipher.encrypt(data)
encrypted_data = base64.b64encode(encrypted_data) if encode else encrypted_data
return encrypted_data
def decrypt(self, data, decode=True):
if not self.private_key:
raise Exception("Cannot decrypt without private key")
data = base64.b64decode(data) if decode else data
cipher = PKCS1_v1_5.new(self.private_key)
return cipher.decrypt(data, None)