এনিগমা মেশিনটি প্রয়োগ করুন


18

এনিগমা মেশিন হ'ল একটি জটিল জটিল সাইফার মেশিন যা জার্মানরা এবং অন্যরা তাদের বার্তাগুলি এনক্রিপ্ট করতে ব্যবহার করে। এই মেশিনটি * প্রয়োগ করা আপনার কাজ।

পদক্ষেপ 1, আবর্তন

আমাদের এনিগমা মেশিনে রোটারগুলির জন্য 3 টি স্লট এবং এই স্লটের প্রতিটিটির জন্য 5 টি রোটার রয়েছে। প্রতিটি রটার 26 বিভিন্ন সম্ভব অবস্থানের (থেকে গেছে Aকরার Z)। প্রতিটি রটারের একটি পূর্বনির্ধারিত খাঁজ অবস্থান থাকে :

Rotor  Notch
------------
1      Q
2      E
3      V
4      J
5      Z

কীপ্রেসে নিম্নলিখিত পদক্ষেপগুলি ঘটে:

  1. স্লট 1 এ রটার ঘোরানো
  2. স্লট 1-র রটার যদি তার খাঁজ পেরিয়ে যায়, তবে এটি স্লট 2 এ রটারটি ঘোরাবে।
  3. স্লট 2-এ রটার যদি তার খাঁজতে থাকে (তবে কেবল সেখানে সরেনি), রটার 2 এবং 3 উভয়ই একবার ঘোরান।

আমরা rotors 1,3,5 ব্যবহার করছেন এবং তারা অবস্থানকে হন P,U,Hতারপর পজিশনের ক্রম: P,U,H> Q,U,H> R,V,H>S,W,I

পদক্ষেপ 2, প্রতিস্থাপন

প্রতিটি রোটর একটি সাধারণ চরিত্রের প্রতিস্থাপন সম্পাদন করে। নিম্নলিখিত Aঅবস্থানে প্রতিটি রোটরের একটি চার্ট রয়েছে :

  ABCDEFGHIJKLMNOPQRSTUVWXYZ
  --------------------------
1 EKMFLGDQVZNTOWYHXUSPAIBRCJ
2 AJDKSIRUXBLHWTMCQGZNPYFVOE
3 BDFHJLCPRTXVZNYEIWGAKMUSQO
4 ESOVPZJAYQUIRHXLNFTGKDCMWB
5 VZBRGITYUPSDNHLXAWMJQOFECK
R YRUHQSLDPXNGOKMIEBFZCWVJAT

অবস্থান টি মধ্যে রটার 1 PAIBRCJEKMFLGDQVZNTOWYHXUSযা চিঠি প্রতিস্থাপন করবে, Cজন্য I

তিনটি রোটর তাদের প্রতিস্থাপন সম্পাদন করার পরে, প্রতিফলককে আঘাত করা হয় ( Rউপরে তালিকাভুক্ত )। এটি নিজস্ব প্রতিস্থাপন সম্পাদন করে এবং তারপরে রোটারগুলির মাধ্যমে সংকেতটি প্রতিবিম্বিত করে। এরপরে রোটারগুলি বিপরীত ক্রমে বিপরীত প্রতিস্থাপন সম্পাদন করে।

বিপরীত প্রতিকল্পন মানে পরিবর্তে রটার 1 স্থলে Aসঙ্গে E, এটা পরিপূরক Eসঙ্গেA

স্লটগুলি সমস্ত পজিশনে 1,2,3 রোটার দিয়ে পূর্ণ A। চিঠিটি রোটারগুলির মধ্য দিয়ে Qপথ অনুসরণ করে Q>X>V>MMপ্রতিফলিত করে O, যা এরপরে বিপরীত পথ অনুসরণ করে O>Z>S>S। সুতরাং, Aসঙ্গে প্রতিস্থাপিত হয় S

ইনপুট আউটপুট

আপনি পাস করেছেন:

  1. 3 টি রোটরের একটি তালিকা (পূর্ণসংখ্যা হিসাবে)
  2. 3 শুরু রটার পজিশনের একটি তালিকা (চিঠি হিসাবে)
  3. একটি স্ট্রিং যা এনক্রিপ্ট করা দরকার।

আপনি ধরে নিতে পারেন যে আপনার ইনপুটটি ভালভাবে গঠিত হবে এবং সমস্ত অক্ষর বড় হাতের অক্ষর হবে, কোনও স্থান নেই।

আপনাকে অবশ্যই এনক্রিপ্ট করা স্ট্রিংটি ফিরিয়ে দিতে হবে।

আপনি ইনপুট হিসাবে orsচ্ছিকভাবে রোটার, খাঁজ এবং প্রতিবিম্বকে গ্রহণ করতে পারেন। যাঁরা তাদের স্কোর থেকে 95 বাইট নিতে পারেন না95 = ceil(log2(26 letters ^(26*6 rotors +5 notches))/8 bytes)

পরীক্ষার মামলা

Rotor Position Input              Output
4,1,5 H,P,G    AAAAAAAAA          RPWKMBZLN
1,2,3 A,A,A    PROGRAMMINGPUZZLES RTFKHDOVZSXTRMVPFC
1,2,3 A,A,A    RTFKHDOVZSXTRMVPFC PROGRAMMINGPUZZLES
2,5,3 U,L,I    GIBDZNJLGXZ        UNCRACKABLE

আমার বাস্তবায়ন পাওয়া যাবে গিথুব-এ । আমি এটি পরীক্ষা করেছি, তবে আমার বাস্তবায়নে আমার বাগ থাকতে পারে (যার অর্থ আমার পরীক্ষার কেসগুলি সম্ভবত ভুল)।

* আমি এটি যথাসম্ভব যথাযথ করার চেষ্টা করেছি , তবে মেশিনের মধ্যে পার্থক্যের কারণে আমার কিছু বিবরণ ভুল হতে পারে। তবে আপনার কাজটি হ'ল আমি যা বর্ণনা করেছি তা বাস্তবায়ন করা, এমনকি আমি ভুল না হলেও। সরলতার জন্য আমি প্লাগবোর্ডটি অন্তর্ভুক্ত করছি না


1
এনিগমা I, M3 এবং M4 এ ব্যবহৃত এনক্রিপশন অ্যালগরিদমের জন্য এটি সঠিক প্রয়োগ implementation সমস্ত সেটিংস উপস্থিত রয়েছে, প্লাগবোর্ড এবং উহর স্যুইচ পাশাপাশি কাজ করে: https://github.com/arduinoenigma/ArdinoEnigmaEngineAndUhr এটি একই একই এনক্রিপশন ইঞ্জিনটি

আমি মনে করি আমি বুঝতে পেরেছি, তবে এটি সঠিকভাবে কাজ করছে বলে মনে হচ্ছে না। এখানে gist.github.com/JJ-Atkinson/ddd3896fe10d85b3b584 ব্যাখ্যা করে একটি বক্তব্য এখানে দেওয়া হয়েছে
জে আতকিন

প্রথম উদাহরণে আপনি বলেছিলেন "যদি আমরা 1, 3 এবং 5 রোটার ব্যবহার করি তবে" আমি মনে করি এটি 1, 2 এবং 5 (বা শেষের জন্য যাই হোক না কেন) হবে rot
coredump

@ কর্ডম্প্প ফিক্সড
নাথান মেরিল

রোটারগুলি কীভাবে কাজ করে সে সম্পর্কে আমার বোঝা কি এখনও ভুল?
জে আতকিন

উত্তর:


4

পাইথন 3, 403 বাইট

আমি মনে করি এটি সঠিকভাবে কাজ করছে। ঘূর্ণায়মান এটি পাস:

def z(p,o,m,f,g,h):
 O=ord;b=lambda a:a[1:]+a[:1];d=lambda a:chr(a+O('A'));e=lambda a:O(a)-O('A');i=[list(g[i-1])for i in p];j=[f[i-1]for i in p];i=[x[e(y):]+x[:e(y)]for x,y in zip(i,o)];k=[]
 for l in m:
  if i[0][0]==j[0]:i[1]=b(i[1])
  elif i[1][0]==j[1]:i[1]=b(i[1]);i[2]=b(i[2])
  i[0]=b(i[0]);c=l
  for n in i:c=n[e(c)]
  c=h[e(c)]
  for n in reversed(i):c=d(n.index(c))
  k+=[c]
 return''.join(k)

f খাঁজ, g হয়, ঘূর্ণনকারী এবং hপ্রতিফলক হয়।

Ungolfed:

shift = lambda rotor: rotor[1:] + rotor[:1]
letter = lambda num: chr(num + ord('A'))
number = lambda chr: ord(chr) - ord('A')


def encode(rotors, rotorStart, message, defaultRotors, reflector, rotorNotchPositions):
    usedRotors = [list(defaultRotors[i - 1]) for i in rotors]
    notches = [rotorNotchPositions[i - 1] for i in rotors]
    usedRotors = [rotor[number(offset):] + rotor[:number(offset)] for rotor, offset in zip(usedRotors, rotorStart)]

    sub = []

    for char in message:
        # print([''.join(rotor) for rotor in usedRotors])
        if usedRotors[0][0] == notches[0]:
            usedRotors[1] = shift(usedRotors[1])
        elif usedRotors[1][0] == notches[1]:
            usedRotors[1] = shift(usedRotors[1])
            usedRotors[2] = shift(usedRotors[2])

        usedRotors[0] = shift(usedRotors[0])

        c = char
        for rotor in usedRotors:
            c = rotor[number(c)]
        c = reflector[number(c)]
        for rotor in reversed(usedRotors):
            c = letter(rotor.index(c))
        sub += [c]
        print([''.join(rotor) for rotor in usedRotors], char, c, message)

    return ''.join(sub)

rotorNotchPositions = 'QEVJZ'
*defaultRotors, reflector = [
    #ABCDEFGHIJKLMNOPQRSTUVWXYZ#
    "EKMFLGDQVZNTOWYHXUSPAIBRCJ",  # 1
    "AJDKSIRUXBLHWTMCQGZNPYFVOE",  # 2
    "BDFHJLCPRTXVZNYEIWGAKMUSQO",  # 3
    "ESOVPZJAYQUIRHXLNFTGKDCMWB",  # 4
    "VZBRGITYUPSDNHLXAWMJQOFECK",  # 5
    "YRUHQSLDPXNGOKMIEBFZCWVJAT"   # R
]

#             Rotor       Position        Input                 Output
assert encode((4, 1, 5), ('H', 'R', 'G'), 'AAAAAAAAA',
              defaultRotors, reflector, rotorNotchPositions) == 'PXSHJMMHR'
assert encode((1, 2, 3), ('A', 'A', 'A'), 'PROGRAMMINGPUZZLES',
              defaultRotors, reflector, rotorNotchPositions) == 'RTFKHDOCCDAHRJJDFC'
assert encode((1, 2, 3), ('A', 'A', 'A'), 'RTFKHDOVZSXTRMVPFC',
              defaultRotors, reflector, rotorNotchPositions) == 'PROGRAMRXGVGUVFCES'
assert encode((2, 5, 3), ('U', 'L', 'I'), 'GIBDZNJLGXZ',
              defaultRotors, reflector, rotorNotchPositions) == 'UNCRAUPSCTK'

আমি মনে করি এটি কাজ করছে, তবে এটি একটি আলাদা আউটপুট উত্পাদন করে, যা (আমার মনে হয়) রেফারেন্স ইমপ্লের মধ্যে একটি বাগ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.