"Fossies" - the Fresh Open Source Software Archive

Member "reportlab-3.5.23/src/reportlab/lib/arciv.py" (17 Feb 2016, 7604 Bytes) of package /linux/privat/reportlab-3.5.23.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style: standard) with prefixed line numbers. Alternatively you can here view or download the uninterpreted source code file. For more information about "arciv.py" see the Fossies "Dox" file reference documentation.

    1 #copyright ReportLab Europe Limited. 2000-2016
    2 #see license.txt for license details
    3 '''
    4 Arciv Stream  ciphering
    5 '''
    6 __all__='''ArcIV encode decode'''.split()
    7 __version__="1.0"
    8 from reportlab.lib.utils import isUnicode, isPy3
    9 class ArcIV:
   10     '''
   11     performs 'ArcIV' Stream Encryption of S using key
   12     Based on what is widely thought to be RSA's ArcIV algorithm.
   13     It produces output streams that are identical.
   14 
   15     NB there is no separate decoder arciv(arciv(s,key),key) == s
   16     '''
   17     def __init__(self,key):
   18         self._key = key
   19         self.reset()
   20 
   21     def reset(self):
   22         '''restore the cipher to it's start state'''
   23         #Initialize private key, k With the values of the key mod 256.
   24         #and sbox With numbers 0 - 255. Then compute sbox
   25         key = self._key
   26         if isUnicode(key): key = key.encode('utf8')
   27         sbox = list(range(256))
   28         k = list(range(256))
   29         lk = len(key)
   30         if isPy3:
   31             for i in sbox:
   32                 k[i] = key[i % lk] % 256
   33         else:
   34             for i in sbox:
   35                 k[i] = ord(key[i % lk]) % 256
   36 
   37         #Re-order sbox using the private key, k.
   38         #Iterating each element of sbox re-calculate the counter j
   39         #Then interchange the elements sbox[a] & sbox[b]
   40         j = 0
   41         for i in range(256):
   42             j = (j+sbox[i]+k[i]) % 256
   43             sbox[i], sbox[j] = sbox[j], sbox[i]
   44         self._sbox, self._i, self._j = sbox, 0, 0
   45 
   46     def _encode(self, B):
   47         '''
   48         return the list of encoded bytes of B, B might be a string or a
   49         list of integers between 0 <= i <= 255
   50         '''
   51         sbox, i, j = self._sbox, self._i, self._j
   52 
   53         if isPy3:
   54             C = list(B.encode('utf8')) if isinstance(B,str) else (list(B) if isinstance(B,bytes) else B[:])
   55         elif isinstance(B,basestring):
   56             C = list(map(ord,B.encode('utf8') if isinstance(B,unicode) else B))
   57         else:
   58             C = B[:]
   59         n = len(C)
   60         p = 0
   61         while p<n:
   62             #update the variables i, j.
   63             self._i = i = (i + 1) % 256
   64             self._j = j = (j + sbox[i]) % 256
   65             #swap sbox[i] and sbox[j]
   66             sbox[i], sbox[j] = sbox[j], sbox[i]
   67             #overwrite the plaintext with the ciphered byte
   68             C[p] = C[p] ^ sbox[(sbox[i] + sbox[j]) % 256]
   69             p += 1
   70         return C
   71 
   72     if isPy3:
   73         def encode(self,S):
   74             'ArcIV encode string S'
   75             return bytes(self._encode(S))
   76     else:
   77         def encode(self,S):
   78             'ArcIV encode string S'
   79             return "".join(map(chr,self._encode(S)))
   80 
   81 _TESTS=[{
   82         'key': b"\x01\x23\x45\x67\x89\xab\xcd\xef",
   83         'input': b"\x01\x23\x45\x67\x89\xab\xcd\xef",
   84         'output': b"\x75\xb7\x87\x80\x99\xe0\xc5\x96",
   85         },
   86 
   87         {
   88         'key': b"\x01\x23\x45\x67\x89\xab\xcd\xef",
   89         'input': b"\x00\x00\x00\x00\x00\x00\x00\x00",
   90         'output': b"\x74\x94\xc2\xe7\x10\x4b\x08\x79",
   91         },
   92 
   93         {
   94         'key': b"\x00\x00\x00\x00\x00\x00\x00\x00",
   95         'input': b"\x00\x00\x00\x00\x00\x00\x00\x00",
   96         'output': b"\xde\x18\x89\x41\xa3\x37\x5d\x3a",
   97         },
   98 
   99         {
  100         'key': b"\xef\x01\x23\x45",
  101         'input': b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
  102         'output': b"\xd6\xa1\x41\xa7\xec\x3c\x38\xdf\xbd\x61",
  103         },
  104 
  105         {
  106         'key': b"\x01\x23\x45\x67\x89\xab\xcd\xef",
  107         'input': b"\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  108 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  109 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  110 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  111 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  112 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  113 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  114 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  115 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  116 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  117 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  118 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  119 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  120 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  121 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  122 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  123 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  124 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  125 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  126 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  127 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  128 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  129 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  130 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  131 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  132 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  133 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  134 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  135 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  136 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  137 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  138 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  139 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  140 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  141 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  142 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  143 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  144 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  145 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  146 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  147 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  148 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  149 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  150 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  151 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  152 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  153 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  154 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  155 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  156 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  157 \x01\x01\x01\x01\x01\x01\x01\x01\x01\x01\
  158 \x01",
  159     'output': b"\x75\x95\xc3\xe6\x11\x4a\x09\x78\x0c\x4a\xd4\
  160 \x52\x33\x8e\x1f\xfd\x9a\x1b\xe9\x49\x8f\
  161 \x81\x3d\x76\x53\x34\x49\xb6\x77\x8d\xca\
  162 \xd8\xc7\x8a\x8d\x2b\xa9\xac\x66\x08\x5d\
  163 \x0e\x53\xd5\x9c\x26\xc2\xd1\xc4\x90\xc1\
  164 \xeb\xbe\x0c\xe6\x6d\x1b\x6b\x1b\x13\xb6\
  165 \xb9\x19\xb8\x47\xc2\x5a\x91\x44\x7a\x95\
  166 \xe7\x5e\x4e\xf1\x67\x79\xcd\xe8\xbf\x0a\
  167 \x95\x85\x0e\x32\xaf\x96\x89\x44\x4f\xd3\
  168 \x77\x10\x8f\x98\xfd\xcb\xd4\xe7\x26\x56\
  169 \x75\x00\x99\x0b\xcc\x7e\x0c\xa3\xc4\xaa\
  170 \xa3\x04\xa3\x87\xd2\x0f\x3b\x8f\xbb\xcd\
  171 \x42\xa1\xbd\x31\x1d\x7a\x43\x03\xdd\xa5\
  172 \xab\x07\x88\x96\xae\x80\xc1\x8b\x0a\xf6\
  173 \x6d\xff\x31\x96\x16\xeb\x78\x4e\x49\x5a\
  174 \xd2\xce\x90\xd7\xf7\x72\xa8\x17\x47\xb6\
  175 \x5f\x62\x09\x3b\x1e\x0d\xb9\xe5\xba\x53\
  176 \x2f\xaf\xec\x47\x50\x83\x23\xe6\x71\x32\
  177 \x7d\xf9\x44\x44\x32\xcb\x73\x67\xce\xc8\
  178 \x2f\x5d\x44\xc0\xd0\x0b\x67\xd6\x50\xa0\
  179 \x75\xcd\x4b\x70\xde\xdd\x77\xeb\x9b\x10\
  180 \x23\x1b\x6b\x5b\x74\x13\x47\x39\x6d\x62\
  181 \x89\x74\x21\xd4\x3d\xf9\xb4\x2e\x44\x6e\
  182 \x35\x8e\x9c\x11\xa9\xb2\x18\x4e\xcb\xef\
  183 \x0c\xd8\xe7\xa8\x77\xef\x96\x8f\x13\x90\
  184 \xec\x9b\x3d\x35\xa5\x58\x5c\xb0\x09\x29\
  185 \x0e\x2f\xcd\xe7\xb5\xec\x66\xd9\x08\x4b\
  186 \xe4\x40\x55\xa6\x19\xd9\xdd\x7f\xc3\x16\
  187 \x6f\x94\x87\xf7\xcb\x27\x29\x12\x42\x64\
  188 \x45\x99\x85\x14\xc1\x5d\x53\xa1\x8c\x86\
  189 \x4c\xe3\xa2\xb7\x55\x57\x93\x98\x81\x26\
  190 \x52\x0e\xac\xf2\xe3\x06\x6e\x23\x0c\x91\
  191 \xbe\xe4\xdd\x53\x04\xf5\xfd\x04\x05\xb3\
  192 \x5b\xd9\x9c\x73\x13\x5d\x3d\x9b\xc3\x35\
  193 \xee\x04\x9e\xf6\x9b\x38\x67\xbf\x2d\x7b\
  194 \xd1\xea\xa5\x95\xd8\xbf\xc0\x06\x6f\xf8\
  195 \xd3\x15\x09\xeb\x0c\x6c\xaa\x00\x6c\x80\
  196 \x7a\x62\x3e\xf8\x4c\x3d\x33\xc1\x95\xd2\
  197 \x3e\xe3\x20\xc4\x0d\xe0\x55\x81\x57\xc8\
  198 \x22\xd4\xb8\xc5\x69\xd8\x49\xae\xd5\x9d\
  199 \x4e\x0f\xd7\xf3\x79\x58\x6b\x4b\x7f\xf6\
  200 \x84\xed\x6a\x18\x9f\x74\x86\xd4\x9b\x9c\
  201 \x4b\xad\x9b\xa2\x4b\x96\xab\xf9\x24\x37\
  202 \x2c\x8a\x8f\xff\xb1\x0d\x55\x35\x49\x00\
  203 \xa7\x7a\x3d\xb5\xf2\x05\xe1\xb9\x9f\xcd\
  204 \x86\x60\x86\x3a\x15\x9a\xd4\xab\xe4\x0f\
  205 \xa4\x89\x34\x16\x3d\xdd\xe5\x42\xa6\x58\
  206 \x55\x40\xfd\x68\x3c\xbf\xd8\xc0\x0f\x12\
  207 \x12\x9a\x28\x4d\xea\xcc\x4c\xde\xfe\x58\
  208 \xbe\x71\x37\x54\x1c\x04\x71\x26\xc8\xd4\
  209 \x9e\x27\x55\xab\x18\x1a\xb7\xe9\x40\xb0\
  210 \xc0",
  211         },
  212     ]
  213 
  214 def encode(text, key):
  215     "One-line shortcut for making an encoder object"
  216     return ArcIV(key).encode(text)
  217 
  218 def decode(text, key):
  219     "One-line shortcut for decoding"
  220     # yes, encode and decode are symmetric - see docstring
  221     return ArcIV(key).encode(text)
  222 
  223 if __name__=='__main__':
  224     i = 0
  225     for t in _TESTS:
  226         o = ArcIV(t['key']).encode(t['input'])
  227         o = ArcIV(t['key']).encode(t['output'])
  228         i += 1