Use PKCS#7 for encryption

Closes #156
This commit is contained in:
Manuel Ebert 2014-04-16 17:03:24 -04:00
parent 036244fd29
commit d38937e672
2 changed files with 17 additions and 4 deletions

View file

@ -66,11 +66,19 @@ class Journal(object):
except ValueError: except ValueError:
util.prompt("ERROR: Your journal file seems to be corrupted. You do have a backup, don't you?") util.prompt("ERROR: Your journal file seems to be corrupted. You do have a backup, don't you?")
sys.exit(1) sys.exit(1)
padding = " ".encode("utf-8")
if not plain.endswith(padding): # Journals are always padded padding_length = ord(plain[-1])
if padding_length > AES.block_size and padding_length != 32:
# 32 is the space character and is kept for backwards compatibility
return None
elif padding_length == 32:
plain = plain.strip()
elif plain[-padding_length:] != util.int2byte(padding_length) * padding_length:
# Invalid padding!
return None return None
else: else:
return plain.decode("utf-8") plain = plain[:-padding_length]
return plain.decode("utf-8")
def _encrypt(self, plain): def _encrypt(self, plain):
"""Encrypt a plaintext string using self.key as the key""" """Encrypt a plaintext string using self.key as the key"""
@ -80,7 +88,8 @@ class Journal(object):
iv = Random.new().read(AES.block_size) iv = Random.new().read(AES.block_size)
crypto = AES.new(self.key, AES.MODE_CBC, iv) crypto = AES.new(self.key, AES.MODE_CBC, iv)
plain = plain.encode("utf-8") plain = plain.encode("utf-8")
plain += b" " * (AES.block_size - len(plain) % AES.block_size) padding_length = AES.block_size - len(plain) % AES.block_size
plain += util.int2byte(padding_length) * padding_length
return iv + crypto.encrypt(plain) return iv + crypto.encrypt(plain)
def make_key(self, password): def make_key(self, password):

View file

@ -141,3 +141,7 @@ def slugify(string):
slug = re.sub(r'[-\s]+', '-', no_punctuation) slug = re.sub(r'[-\s]+', '-', no_punctuation)
return u(slug) return u(slug)
def int2byte(i):
"""Converts an integer to a byte.
This is equivalent to chr() in Python 2 and bytes((i,)) in Python 3."""
return chr(i) if PY2 else bytes((i,))