def test_03_encrypt_bytes(self):
        "test des_encrypt_block()"
        from passlib.utils.des import (des_encrypt_block, shrink_des_key,
                                       _pack64, _unpack64)

        # run through test vectors
        for key, plaintext, correct in self.des_test_vectors:
            # convert to bytes
            key = _pack64(key)
            plaintext = _pack64(plaintext)
            correct = _pack64(correct)

            # test 64-bit key
            result = des_encrypt_block(key, plaintext)
            self.assertEqual(result, correct,
                             "key=%r plaintext=%r:" % (key, plaintext))

            # test 56-bit version
            key2 = shrink_des_key(key)
            result = des_encrypt_block(key2, plaintext)
            self.assertEqual(
                result, correct,
                "key=%r shrink(key)=%r plaintext=%r:" % (key, key2, plaintext))

            # test with random parity bits
            for _ in range(20):
                key3 = _pack64(self._random_parity(_unpack64(key)))
                result = des_encrypt_block(key3, plaintext)
                self.assertEqual(
                    result, correct, "key=%r rndparity(key)=%r plaintext=%r:" %
                    (key, key3, plaintext))

        # check invalid keys
        stub = b('\x00') * 8
        self.assertRaises(TypeError, des_encrypt_block, 0, stub)
        self.assertRaises(ValueError, des_encrypt_block, b('\x00') * 6, stub)

        # check invalid input
        self.assertRaises(TypeError, des_encrypt_block, stub, 0)
        self.assertRaises(ValueError, des_encrypt_block, stub, b('\x00') * 7)

        # check invalid salts
        self.assertRaises(ValueError, des_encrypt_block, stub, stub, salt=-1)
        self.assertRaises(ValueError,
                          des_encrypt_block,
                          stub,
                          stub,
                          salt=1 << 24)

        # check invalid rounds
        self.assertRaises(ValueError,
                          des_encrypt_block,
                          stub,
                          stub,
                          0,
                          rounds=0)
    def test_03_encrypt_bytes(self):
        """test des_encrypt_block()"""
        from passlib.utils.des import (des_encrypt_block, shrink_des_key,
                                       _pack64, _unpack64)

        # run through test vectors
        for key, plaintext, correct in self.des_test_vectors:
            # convert to bytes
            key = _pack64(key)
            plaintext = _pack64(plaintext)
            correct = _pack64(correct)

            # test 64-bit key
            result = des_encrypt_block(key, plaintext)
            self.assertEqual(result, correct, "key=%r plaintext=%r:" %
                                              (key, plaintext))

            # test 56-bit version
            key2 = shrink_des_key(key)
            result = des_encrypt_block(key2, plaintext)
            self.assertEqual(result, correct, "key=%r shrink(key)=%r plaintext=%r:" %
                                              (key, key2, plaintext))

            # test with random parity bits
            for _ in range(20):
                key3 = _pack64(self._random_parity(_unpack64(key)))
                result = des_encrypt_block(key3, plaintext)
                self.assertEqual(result, correct, "key=%r rndparity(key)=%r plaintext=%r:" %
                                                  (key, key3, plaintext))

        # check invalid keys
        stub = b('\x00') * 8
        self.assertRaises(TypeError, des_encrypt_block, 0, stub)
        self.assertRaises(ValueError, des_encrypt_block, b('\x00')*6, stub)

        # check invalid input
        self.assertRaises(TypeError, des_encrypt_block, stub, 0)
        self.assertRaises(ValueError, des_encrypt_block, stub, b('\x00')*7)

        # check invalid salts
        self.assertRaises(ValueError, des_encrypt_block, stub, stub, salt=-1)
        self.assertRaises(ValueError, des_encrypt_block, stub, stub, salt=1<<24)

        # check invalid rounds
        self.assertRaises(ValueError, des_encrypt_block, stub, stub, 0, rounds=0)
    def test_01_expand(self):
        "test expand_des_key()"
        from passlib.utils.des import expand_des_key, shrink_des_key, _KDATA_MASK, INT_56_MASK

        # make sure test vectors are preserved (sans parity bits)
        # uses ints, bytes are tested under # 02
        for key1, _, _ in self.des_test_vectors:
            key2 = shrink_des_key(key1)
            key3 = expand_des_key(key2)
            # NOTE: this assumes expand_des_key() sets parity bits to 0
            self.assertEqual(key3, key1 & _KDATA_MASK)

        # type checks
        self.assertRaises(TypeError, expand_des_key, 1.0)

        # too large
        self.assertRaises(ValueError, expand_des_key, INT_56_MASK + 1)
        self.assertRaises(ValueError, expand_des_key, b("\x00") * 8)

        # too small
        self.assertRaises(ValueError, expand_des_key, -1)
        self.assertRaises(ValueError, expand_des_key, b("\x00") * 6)
    def test_02_shrink(self):
        "test shrink_des_key()"
        from passlib.utils.des import expand_des_key, shrink_des_key, INT_64_MASK
        from passlib.utils import random, getrandbytes

        # make sure reverse works for some random keys
        # uses bytes, ints are tested under # 01
        for i in range(20):
            key1 = getrandbytes(random, 7)
            key2 = expand_des_key(key1)
            key3 = shrink_des_key(key2)
            self.assertEqual(key3, key1)

        # type checks
        self.assertRaises(TypeError, shrink_des_key, 1.0)

        # too large
        self.assertRaises(ValueError, shrink_des_key, INT_64_MASK + 1)
        self.assertRaises(ValueError, shrink_des_key, b("\x00") * 9)

        # too small
        self.assertRaises(ValueError, shrink_des_key, -1)
        self.assertRaises(ValueError, shrink_des_key, b("\x00") * 7)
    def test_01_expand(self):
        "test expand_des_key()"
        from passlib.utils.des import expand_des_key, shrink_des_key, \
                                      _KDATA_MASK, INT_56_MASK

        # make sure test vectors are preserved (sans parity bits)
        # uses ints, bytes are tested under # 02
        for key1, _, _ in self.des_test_vectors:
            key2 = shrink_des_key(key1)
            key3 = expand_des_key(key2)
            # NOTE: this assumes expand_des_key() sets parity bits to 0
            self.assertEqual(key3, key1 & _KDATA_MASK)

        # type checks
        self.assertRaises(TypeError, expand_des_key, 1.0)

        # too large
        self.assertRaises(ValueError, expand_des_key, INT_56_MASK + 1)
        self.assertRaises(ValueError, expand_des_key, b("\x00") * 8)

        # too small
        self.assertRaises(ValueError, expand_des_key, -1)
        self.assertRaises(ValueError, expand_des_key, b("\x00") * 6)
    def test_02_shrink(self):
        "test shrink_des_key()"
        from passlib.utils.des import expand_des_key, shrink_des_key, \
                                      INT_64_MASK
        from passlib.utils import random, getrandbytes

        # make sure reverse works for some random keys
        # uses bytes, ints are tested under # 01
        for i in range(20):
            key1 = getrandbytes(random, 7)
            key2 = expand_des_key(key1)
            key3 = shrink_des_key(key2)
            self.assertEqual(key3, key1)

        # type checks
        self.assertRaises(TypeError, shrink_des_key, 1.0)

        # too large
        self.assertRaises(ValueError, shrink_des_key, INT_64_MASK + 1)
        self.assertRaises(ValueError, shrink_des_key, b("\x00") * 9)

        # too small
        self.assertRaises(ValueError, shrink_des_key, -1)
        self.assertRaises(ValueError, shrink_des_key, b("\x00") * 7)
Beispiel #7
0
import sys
import re
import os

# ./shrink_des.py file_to_modify ciphertext
if __name__ == '__main__':

    hashfile = sys.argv[1]
    ciphertext = sys.argv[2]

    tmpfile = 'hash.tmp'

    with open(hashfile, 'r') as f:
        hash_lines = f.readlines()

    with open(tmpfile, 'w') as tmpf:
        for hash_line in hash_lines:
            if (ciphertext in hash_line):
                # found the one to shrink
                hash_line = hash_line.rstrip()
                hash_line_parts = hash_line.split(':')
                old_keyhash = hash_line_parts[-1]
                old_keyhash = re.sub('\$HEX\[', '', old_keyhash)
                old_keyhash = re.sub('\]', '', old_keyhash)
                new_keyhash = shrink_des_key(old_keyhash.decode('hex')).encode('hex')

                hash_line = ciphertext + ':' + new_keyhash + '\n'
            tmpf.write(hash_line)

    os.rename(tmpfile, hashfile)