Ejemplo n.º 1
0
 def __init__(self, key='phqgmeaylnofdxkrcvszwbuti', period=5):
     self.key = [k.upper() for k in key]
     self.pb = PolybiusSquare(self.key, size=5)
     self.period = period
     assert len(
         key
     ) == 25, 'invalid key in init: must have length 25, has length ' + str(
         len(key))
     assert period >= 1, 'invalid period in init: period should be >= 1'
Ejemplo n.º 2
0
    def decipher(self, string):
        """Decipher string using ADFGX cipher according to initialised key information.
        Punctuation and whitespace are removed from the input.

        Example::

            plaintext = ADFGX('phqgmeaylnofdxkrcvszwbuti', 'HELLO').decipher(ciphertext)

        :param string: The string to decipher.
        :returns: The enciphered string.
        """
        step2 = ColTrans(self.keyword).decipher(string)
        step1 = PolybiusSquare(self.key, size=5, chars='ADFGX').decipher(step2)
        return step1
Ejemplo n.º 3
0
    def encipher(self, string):
        """Encipher string using ADFGVX cipher according to initialised key information.
        Punctuation and whitespace are removed from the input.

        Example::

            ciphertext = ADFGVX('ph0qg64mea1yl2nofdxkr3cvs5zw7bj9uti8', 'HELLO').encipher(plaintext)

        :param string: The string to encipher.
        :returns: The enciphered string.
        """
        step1 = PolybiusSquare(self.key, size=6, chars='ADFGVX').encipher(string)
        step2 = ColTrans(self.keyword).encipher(step1)
        return step2
Ejemplo n.º 4
0
class Bifid(Cipher):
    """The Bifid Cipher is a fractionating cipher, and has a key consisting of a 25 letter keysquare (with a letter removed e.g. 'J'), along with
    a 'period', which is an integer.
    For more information, the algorithm can be 
    seen e.g. http://www.practicalcryptography.com/ciphers/bifid-cipher/
    
    :param key: The keysquare, as a 25 character string.    
    :param period: an integer.
    """
    def __init__(self, key='phqgmeaylnofdxkrcvszwbuti', period=5):
        self.key = [k.upper() for k in key]
        self.pb = PolybiusSquare(self.key, size=5)
        self.period = period
        assert len(
            key
        ) == 25, 'invalid key in init: must have length 25, has length ' + str(
            len(key))
        assert period >= 1, 'invalid period in init: period should be >= 1'

    def encipher(self, string):
        """Encipher string using Bifid cipher according to initialised key. Punctuation and whitespace
        are removed from the input.       

        Example::

            ciphertext = Bifid('phqgmeaylnofdxkrcvszwbuti',5).encipher(plaintext)     

        :param string: The string to encipher.
        :returns: The enciphered string.
        """
        string = self.remove_punctuation(string)
        step1 = self.pb.encipher(string)
        evens = step1[::2]
        odds = step1[1::2]
        step2 = []
        for i in range(0, len(string), self.period):
            step2 += evens[i:int(i + self.period)]
            step2 += odds[i:int(i + self.period)]
        return self.pb.decipher(''.join(step2))

    def decipher(self, string):
        """Decipher string using Bifid cipher according to initialised key. Punctuation and whitespace
        are removed from the input.

        Example::

            plaintext = Bifid('phqgmeaylnofdxkrcvszwbuti',5).decipher(ciphertext)     

        :param string: The string to decipher.
        :returns: The deciphered string.
        """
        ret = ''
        string = string.upper()
        rowseq, colseq = [], []
        # take blocks of length period, reform rowseq,colseq from them
        for i in range(0, len(string), self.period):
            tempseq = []
            for j in range(0, self.period):
                if i + j >= len(string): continue
                tempseq.append(int(self.key.index(string[i + j]) / 5))
                tempseq.append(int(self.key.index(string[i + j]) % 5))
            rowseq.extend(tempseq[0:int(len(tempseq) / 2)])
            colseq.extend(tempseq[int(len(tempseq) / 2):])
        for i in range(len(rowseq)):
            ret += self.key[rowseq[i] * 5 + colseq[i]]
        return ret
Ejemplo n.º 5
0
class Bifid(Cipher):
    """The Bifid Cipher is a fractionating cipher, and has a key consisting of a 25 letter keysquare (with a letter removed e.g. 'J'), along with
    a 'period', which is an integer.
    For more information, the algorithm can be 
    seen e.g. http://www.practicalcryptography.com/ciphers/bifid-cipher/
    
    :param key: The keysquare, as a 25 character string.    
    :param period: an integer.
    """
    def __init__(self,key='phqgmeaylnofdxkrcvszwbuti',period=5):
        self.key = [k.upper() for k in key]
        self.pb = PolybiusSquare(self.key,size=5)
        self.period = period
        assert len(key)==25, 'invalid key in init: must have length 25, has length '+str(len(key))
        assert period>=1, 'invalid period in init: period should be >= 1'

    def encipher(self,string):
        """Encipher string using Bifid cipher according to initialised key. Punctuation and whitespace
        are removed from the input.       

        Example::

            ciphertext = Bifid('phqgmeaylnofdxkrcvszwbuti',5).encipher(plaintext)     

        :param string: The string to encipher.
        :returns: The enciphered string.
        """                
        string = self.remove_punctuation(string)
        step1 = self.pb.encipher(string)
        evens = step1[::2]
        odds = step1[1::2]
        step2 = []
        for i in range(0,len(string),self.period):
            step2 += evens[i:i+self.period]
            step2 += odds[i:i+self.period]
        return self.pb.decipher(''.join(step2))

    def decipher(self,string):
        """Decipher string using Bifid cipher according to initialised key. Punctuation and whitespace
        are removed from the input.

        Example::

            plaintext = Bifid('phqgmeaylnofdxkrcvszwbuti',5).decipher(ciphertext)     

        :param string: The string to decipher.
        :returns: The deciphered string.
        """       
        ret = ''
        string = string.upper()
        rowseq,colseq = [],[]
        # take blocks of length period, reform rowseq,colseq from them
        for i in range(0,len(string),self.period):
            tempseq = []
            for j in range(0,self.period):
                if i+j >= len(string): continue
                tempseq.append( self.key.index(string[i + j]) / 5 )
                tempseq.append( self.key.index(string[i + j]) % 5 )
            rowseq.extend(tempseq[0:len(tempseq)/2])
            colseq.extend(tempseq[len(tempseq)/2:])
        for i in range(len(rowseq)):
            ret += self.key[rowseq[i]*5 + colseq[i]]  
        return ret    
Ejemplo n.º 6
0
 def __init__(self,key='phqgmeaylnofdxkrcvszwbuti',period=5):
     self.key = [k.upper() for k in key]
     self.pb = PolybiusSquare(self.key,size=5)
     self.period = period
     assert len(key)==25, 'invalid key in init: must have length 25, has length '+str(len(key))
     assert period>=1, 'invalid period in init: period should be >= 1'