Пример #1
0
    def encrypt_block(self, plaintext):
        """Return 8-word ciphertext, encrypted from plaintext.

        `plaintext` must be a list of 8 64-bit words.

        """
        key = self.key
        tweak = self.tweak
        state = words(list(imap(add64, plaintext, key[:8])))
        state[5] = add64(state[5], tweak[0])
        state[6] = add64(state[6], tweak[1])

        for r, s in izip(xrange(1, 19), cycle((0, 16))):
            for i in xrange(16):
                m, n = PERM[i]
                state[m] = add64(state[m], state[n])
                state[n] = RotL_64(state[n], ROT[i + s])
                state[n] = state[n] ^ state[m]
            for y in xrange(8):
                state[y] = add64(state[y], key[(r + y) % 9])
            state[5] = add64(state[5], tweak[r % 3])
            state[6] = add64(state[6], tweak[(r + 1) % 3])
            state[7] = add64(state[7], r)

        return state
Пример #2
0
    def encrypt_block(self, plaintext):
        """Return 8-word ciphertext, encrypted from plaintext.

        `plaintext` must be a list of 8 64-bit words.

        """
        key = self.key
        tweak = self.tweak
        state = words(list(imap(add64, plaintext, key[:8])))
        state[5] = add64(state[5], tweak[0])
        state[6] = add64(state[6], tweak[1])

        for r,s in izip(xrange(1,19),cycle((0,16))):
            for i in xrange(16):
                m,n = PERM[i]
                state[m] = add64(state[m], state[n])
                state[n] = RotL_64(state[n], ROT[i+s])
                state[n] = state[n] ^ state[m]
            for y in xrange(8):
                     state[y] = add64(state[y], key[(r+y) % 9])
            state[5] = add64(state[5], tweak[r % 3])
            state[6] = add64(state[6], tweak[(r+1) % 3])
            state[7] = add64(state[7], r)

        return state
Пример #3
0
 def prepare_tweak(self):
     """Compute tweak."""
     final = self.tweak[0] ^ self.tweak[1]
     try:
         self.tweak[2] = final
     except IndexError:
         # self.tweak.append(final)
         self.tweak = words(list(self.tweak) + [final])
Пример #4
0
 def prepare_key(self):
     """Compute key."""
     final = reduce(xor, self.key[:8]) ^ SKEIN_KS_PARITY
     try:
         self.key[8] = final
     except IndexError:
         # self.key.append(final)
         self.key = words(list(self.key) + [final])
Пример #5
0
 def prepare_tweak(self):
     """Compute tweak."""
     final =  self.tweak[0] ^ self.tweak[1]
     try:
         self.tweak[2] = final
     except IndexError:
         #self.tweak.append(final)
         self.tweak = words(list(self.tweak) + [final])
Пример #6
0
 def prepare_key(self):
     """Compute key."""
     final = reduce(xor, self.key[:8]) ^ SKEIN_KS_PARITY
     try:
         self.key[8] = final
     except IndexError:
         #self.key.append(final)
         self.key = words(list(self.key) + [final])
Пример #7
0
    def __init__(self, key=None, tweak=None):
        """Set key and tweak.

        The key and the tweak will be lists of 8 64-bit words
        converted from `key` and `tweak` bytestrings, or all
        zeroes if not specified.

        """
        if key:
            self.key = bytes2words(key)
            self.prepare_key()
        else:
            self.key = words(zero_words[:] + [0])
        if tweak:
            self.tweak = bytes2words(tweak, 2)
            self.prepare_tweak()
        else:
            self.tweak = zero_words[:3]
Пример #8
0
    def __init__(self, key=None, tweak=None):
        """Set key and tweak.

        The key and the tweak will be lists of 8 64-bit words
        converted from `key` and `tweak` bytestrings, or all
        zeroes if not specified.

        """
        if key:
            self.key = bytes2words(key)
            self.prepare_key()
        else:
            self.key = words(zero_words[:] + [0])
        if tweak:
            self.tweak = bytes2words(tweak, 2)
            self.prepare_tweak()
        else:
            self.tweak = zero_words[:3]