Almanların meşhur Enigma makinesinin şifreleme algoritmasını programlama dilinde yazmak için, Enigma'nın temel işleyişine uygun bir sınıf yapısı oluşturabiliriz. Bu işlemde rotorlar, yansıtıcı (reflector) ve harf harfine dönüşüm gibi adımlar bulunur.
VB.Net Örnek Kodu :
Imports System
Module Program
Sub Main()
' Örnek kullanım
Dim enigma As New EnigmaMachine()
enigma.SetRotorPositions("A", "A", "A")
Dim plaintext As String = "HELLO"
Dim ciphertext As String = enigma.EncryptMessage(plaintext)
Console.WriteLine("Şifreli Mesaj: " & ciphertext)
End Sub
End Module
Public Class EnigmaMachine
Private Reflector As String = "YRUHQSLDPXNGOKMIEBFZCWVJAT" ' Basit bir yansıtıcı
Private Rotor1 As String = "EKMFLGDQVZNTOWYHXUSPAIBRCJ"
Private Rotor2 As String = "AJDKSIRUXBLHWTMCQGZNPYFVOE"
Private Rotor3 As String = "BDFHJLCPRTXVZNYEIWGAKMUSQO"
Private Notches As Integer() = {16, 4, 21} ' Dönme konumları
Private RotorPositions As Integer() = {0, 0, 0} ' A, A, A
Public Sub SetRotorPositions(pos1 As Char, pos2 As Char, pos3 As Char)
RotorPositions(0) = Asc(pos1) - Asc("A"c)
RotorPositions(1) = Asc(pos2) - Asc("A"c)
RotorPositions(2) = Asc(pos3) - Asc("A"c)
End Sub
Public Function EncryptMessage(message As String) As String
Dim result As String = ""
For Each ch In message
If Char.IsLetter(ch) Then
StepRotors()
result &= EncryptCharacter(Char.ToUpper(ch))
End If
Next
Return result
End Function
Private Sub StepRotors()
' Rotor 1 her harften sonra bir kez döner
RotorPositions(0) = (RotorPositions(0) + 1) Mod 26
' Rotor 2'yi döndürme
If RotorPositions(0) = Notches(0) Then
RotorPositions(1) = (RotorPositions(1) + 1) Mod 26
End If
' Rotor 3'ü döndürme
If RotorPositions(1) = Notches(1) Then
RotorPositions(2) = (RotorPositions(2) + 1) Mod 26
End If
End Sub
Private Function EncryptCharacter(ch As Char) As Char
Dim index As Integer = Asc(ch) - Asc("A"c)
' Rotorlar üzerinden ileri dönüşüm
index = MapThroughRotor(index, Rotor1, RotorPositions(0))
index = MapThroughRotor(index, Rotor2, RotorPositions(1))
index = MapThroughRotor(index, Rotor3, RotorPositions(2))
' Yansıtıcı
index = Asc(Reflector(index)) - Asc("A"c)
' Rotorlar üzerinden geri dönüşüm (ters yönde)
index = MapThroughRotor(index, Rotor3, RotorPositions(2), True)
index = MapThroughRotor(index, Rotor2, RotorPositions(1), True)
index = MapThroughRotor(index, Rotor1, RotorPositions(0), True)
' Şifreli harfi oluştur
Return Chr(index + Asc("A"c))
End Function
Private Function MapThroughRotor(index As Integer, rotor As String, position As Integer, Optional reverse As Boolean = False) As Integer
If reverse Then
' Ters yönde rotor haritalaması
Dim ch As Char = Chr((index + position) Mod 26 + Asc("A"c))
index = rotor.IndexOf(ch)
index = (index - position + 26) Mod 26
Else
' İleri yönde rotor haritalaması
Dim ch As Char = rotor((index + position) Mod 26)
index = Asc(ch) - Asc("A"c)
index = (index - position + 26) Mod 26
End If
Return index
End Function
End Class