Editorial Workflows

Encrypt

public workflow

Install Workflow...

This workflow contains at least one Python script. Only use it if you trust the person who shared this with you, and if you know exactly what it does.

I understand, install the workflow!

This is a workflow for Editorial, a Markdown and plain text editor for iOS. To download it, you need to view this page on a device that has the app installed.

Description: Encrypt document (AES) using PyCrypto.
Keep your notes/messages/text secure.

Shared by: chew-z

Comments: Comment Feed (RSS)

scitoast — 21 Feb
Brilliant work! Thank you.

+ Add Comment

Workflow Preview
Extend Selection ?
Direction
  • Backward
  • Forward
  • Both
Unit
  • Start/End of Document
  • Start/End of Line
  • Number of Characters...
1
Set Clipboard ?
Run Python Script ?
Source Code
#coding: utf-8

import sys
import logging
import base64
import hashlib
import console
import clipboard
from Crypto import Random
from Crypto.Cipher import AES

class AESCipher(object):
    """
    A classical AES Cipher. Can use any size of data and any size of password thanks to padding.
    Also ensure the coherence and the type of the data with a unicode to byte converter.
    """
    def __init__(self, key):
        self.bs = 32
        self.key = hashlib.sha256(AESCipher.str_to_bytes(key)).digest()
        self.mode = AES.MODE_CBC
		# AES.MODE_CBC i AES.MODE_CTR is good - OFB is for Editorial script

    @staticmethod
    def str_to_bytes(data):
        u_type = type(b''.decode('utf8'))
        if isinstance(data, u_type):
            return data.encode('utf8')
        return data

    def _pad(self, s):
        return s + (self.bs - len(s) % self.bs) * AESCipher.str_to_bytes(chr(self.bs - len(s) % self.bs))

    @staticmethod
    def _unpad(s):
        return s[:-ord(s[len(s)-1:])]

    def encrypt(self, raw):
        raw = self._pad(AESCipher.str_to_bytes(raw))
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(self.key, self.mode, iv)
        return base64.b64encode(iv + cipher.encrypt(raw)).decode('utf-8')

    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        iv = enc[:AES.block_size]
        cipher = AES.new(self.key, self.mode, iv)
        return self._unpad(cipher.decrypt(enc[AES.block_size:])).decode('utf-8')

if __name__ == '__main__':
	try:
		key = console.password_alert("Document Password Required", "Enter your password",'',"OK")
		cleartext = clipboard.get()
		cipher = AESCipher(key)
		encrypted = cipher.encrypt(cleartext)
		clipboard.set(encrypted)
	except Exception as e:
		logging.exception("Fatal error in __main__ loop")
Get Clipboard ?
Extend Selection ?
Direction
  • Backward
  • Forward
  • Both
Unit
  • Start/End of Document
  • Start/End of Line
  • Number of Characters...
1
Replace Selected Text ?
Replacement Text
Clipboard
Run Python Script ?
Source Code
#coding: utf-8
import clipboard

clipboard.set('')