Advertisement
Guest User

lab4 zivvs

a guest
Dec 3rd, 2016
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.03 KB | None | 0 0
  1. import random
  2. from math import gcd
  3.  
  4. __author__ = "sashadereh"
  5.  
  6. SEQUENCE_LEN = 8
  7. START_SEQUENCE_ELEMENT = 2
  8. SEQUENCE_STEP = 4
  9. MAX_SYMBOL_CODE = 2 ** SEQUENCE_LEN - 1
  10. TEXT = "Hello. My name is Sasha Derekh"
  11.  
  12.  
  13. def fill_backpacks(number, sequence):
  14.     result = 0
  15.  
  16.     for num in sequence:
  17.         if number & 1 == 1:
  18.             result += num
  19.         number >>= 1
  20.  
  21.     return result
  22.  
  23.  
  24. def get_random_number(a_from, a_to):
  25.     return random.randint(a_from + 1, a_to)
  26.  
  27.  
  28. def generate_sequence():
  29.     sequence = [START_SEQUENCE_ELEMENT]
  30.     sum = 0
  31.     for i in range(1, SEQUENCE_LEN, 1):
  32.         sum += sequence[i - 1]
  33.         sequence.append(sum + SEQUENCE_STEP)
  34.     sum += sequence[-1]
  35.     sequence = list(reversed(sequence))
  36.  
  37.     return sequence, sum
  38.  
  39.  
  40. def generate_w(p):
  41.     for i in range(2, p - 1):
  42.         if gcd(i, p) == 1:
  43.             return i
  44.  
  45.     return 0
  46.  
  47.  
  48. def generate_u(w, p):
  49.     for i in range(2 , p):
  50.         if (w * i) % p == 1:
  51.             return i
  52.     return 0
  53.  
  54.  
  55. def main():
  56.     print("Source text: {}".format(TEXT))
  57.  
  58.     sequence, sequence_sum = generate_sequence()
  59.     print("Generated sequence: {}, its sum = {}".format(sequence, sequence_sum))
  60.  
  61.     # Start "send"
  62.  
  63.     encoded_text = [ord(c) for c in TEXT]
  64.     print("Encoded source text: {}".format(encoded_text))
  65.  
  66.     p = get_random_number(sequence_sum, sequence_sum * 3)
  67.     print("Generated p = {}".format(p))
  68.  
  69.     w = generate_w(p)
  70.     if w == 0:
  71.         raise ValueError('w is 0')
  72.     print("Generated w = {}".format(w))
  73.  
  74.     # Determine normal backpack sequence via (open key)
  75.     # y = w * x (mod p)
  76.     normal_backpack_sequence = [(w * i) % p for i in sequence]
  77.     print("Generated normal backpack sequence: {}".format(normal_backpack_sequence))
  78.  
  79.     # Fill backpacks
  80.     encrypted_text = [fill_backpacks(code, normal_backpack_sequence) for code in encoded_text]
  81.     print("Encrypted text: {}".format(encrypted_text))
  82.  
  83.     # Start "receive"
  84.  
  85.     u = generate_u(w, p)
  86.     if u == 0:
  87.         raise ValueError('u is 0')
  88.     print("Generated u = {}".format(u))
  89.  
  90.     # Determine encrypted sequence via
  91.     # L = D * u
  92.     # шифротекст нормального рюкзака -> шифротекст рюкзака sequence
  93.     encrypted_message = [(value * u) % p for value in encrypted_text]
  94.  
  95.     # Decrypt message
  96.     decrypted_encoded_message = []
  97.     for encrypted_symbol in encrypted_message:
  98.         decrypted_symbol_as_bits = ''
  99.         for sequence_item in sequence:
  100.             if encrypted_symbol >= sequence_item:
  101.                 decrypted_symbol_as_bits += "1"
  102.                 encrypted_symbol -= sequence_item
  103.             else:
  104.                 decrypted_symbol_as_bits += "0"
  105.         decrypted_encoded_message.append(int(decrypted_symbol_as_bits[::-1], 2))
  106.     print("Encoded decrypted text: {}".format(decrypted_encoded_message))
  107.  
  108.     decrypted_text = [str(chr(i)) for i in decrypted_encoded_message]
  109.     print("Decrypted text: {}".format(decrypted_text))
  110.  
  111.  
  112. if __name__ == "__main__":
  113.     main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement