B1KMusic

Me trying to learn the vigenere cipher at 1AM

Feb 23rd, 2018
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.46 KB | None | 0 0
  1. Goal: put in "ATTACKATDAWN" with the key "LEMON" and get the string "LXFOPVEFRNHR" as output.
  2.  
  3. Here's our vigenere square:
  4.  
  5. ABCDEFGHIJKLMNOPQRSTUVWXYZ
  6. LMNOPQRSTUVWXYZABCDEFGHIJK
  7. EFGHIJKLMNOPQRSTUVWXYZABCD
  8. MNOPQRSTUVWXYZABCDEFGHIJKL
  9. OPQRSTUVWXYZABCDEFGHIJKLMN
  10. NOPQRSTUVWXYZABCDEFGHIJKLM
  11.  
  12. The idea is that we'll go through the key (wrapping) for each letter of the message, and then use the rows to encipher/decipher
  13.  
  14. To encode, look up key letter row, and find plaintext letter in top row. Trace column to matching row to get ciphertext letter
  15.  
  16. To decode, Look at key letter row, find ciphertext letter, trace to top row.
  17.  
  18. ATTACKATDAWN
  19. LEMONLEMONLE
  20.  
  21. A
  22. [A]BCDEFGHIJKLMNOPQRSTUVWXYZ
  23. [L]MNOPQRSTUVWXYZABCDEFGHIJK
  24. T
  25. ABCDEFGHIJKLMNOPQRS[T]UVWXYZ
  26. EFGHIJKLMNOPQRSTUVW[X]YZABCD
  27. ...
  28.  
  29. ATTACKATDAWN
  30. LEMONLEMONLE
  31. LXFOPVEFRNHR
  32.  
  33. Alright, so I understand it.
  34.  
  35. Now to do this programmatically.
  36.  
  37. First list the letters' offsets from A:
  38.  
  39. ATTACKATDAWN = 0, 19, 19, 0, 2, 10, 0, 19, 3, 0, 22, 13
  40.  
  41. LEMONLEMONLE
  42.  
  43. And then add the offsets mod 26, standard caesar cipher rules.
  44.  
  45. L + 0 = L
  46. E + 19 = X
  47. M + 19 = F
  48. O + 0 = O
  49. N + 2 = P
  50. L + 10 = V
  51. E + 0 = E
  52. M + 19 = F
  53. O + 3 = R
  54. N + 0 = N
  55. L + 22 = H
  56. E + 13 = R
  57.  
  58. Okay, now to decode...
  59.  
  60. 1AM, can't think straight. Gonna guess.
  61.  
  62. LXFOPVEFRNHR = 11 23 5 14 15 21 4 5 17 13 7 17
  63.  
  64. L - 11 = 0 = A
  65. E - 23 = -19 = H
  66. M - 5 = 7 = H
  67. O - 14 = 0 = A
  68. N - 15 = -2 = Y
  69. L - 21 = -10 = Q
  70. E - 4 = 0 = A
  71. M - 5 = 7 = H
  72. O - 17 = -3 = ?
  73. N - 13 = 0 = ?
  74. L - 7 = 4 = ?
  75. E - 17 = -13 = ?
  76.  
  77. Ugh, that's not even close to right.
  78.  
  79. Oh. Duh. If A + B = C then C - B = A, not B - C = A. I got out from adding in + key, so need to be subtracting out - key = in.
  80.  
  81. LEMON = 11, 4, 12, 14, 13
  82. LEMONLEMONLE = 11, 4, 12, 14, 13, 11, 4, 12, 14, 13, 11, 4
  83.  
  84. L - 11 = A
  85. X - 4 = T
  86. F - 12 = T
  87. O - 14 = A
  88. P - 13 = C
  89. V - 11 = K
  90. E - 4 = A
  91. F - 12 = T
  92. R - 14 = D
  93. N - 13 = A
  94. H - 11 = W
  95. R - 4 = N
  96.  
  97. ATTACK AT DAWN
  98.  
  99. So when implementing, I'll just force the letters to be uppercase and treat everything as offsets (i.e. T -> toupper('T') - 'A' = 19 / offset 19 to chr -> 'A' + 19 = T). The offset logic will make it simpler to rotate about the alphabet (mod 26 to prevent over flow, while x < 0: x += 26 to prevent underflow. So keep it signed. While loop might not even be necessary)
  100.  
  101. The only really tricky part will be dealing with non-alpha characters while keeping the code from turning into spaghetti.
Add Comment
Please, Sign In to add comment