Piszę program do łamania szyfru afinicznego. Gdy znajdzie poprawny klucz, musi on wstrzymywać swoje działanie i spytać użytkownika czy tekst odszyfrowany według domniemanego klucza jest sensowny (znaleziono właściwy klucz, koniec działania) czy też nie (dalsze poszukiwanie).
Próbowałem rozwiązać to w ten sposób, że w klasie, która zajmuje się poszukiwaniem właściwego klucza, umieściłem niewidzialny button. Kiedy zostanie znaleziony prawdopodobny klucz na przycisku wywołuję metodę doClick(), klasa implementująca ActionListenera odbiera zdarzenie i dalej powinno odbyć się próbne dekodowanie i wyświetlenie pytania czy tak odkodowany tekst jest ok, czy dalej poszukiwać klucza.
Niestety, program nie dokonuje próbnej deszyfracji tylko zawiesza się i jedynym wyjściem jest zabicie procesu. Sprawdziłem i jestem pewien , że nie mam żadnej nieskończonej pętli. Zastanawiam się czy nie dochodzi do jakiegoś zakleszczenia wątków (chociaż jawnie żadnego nie tworzę).
Metoda poszukująca klucz:
public void findProperSubstitutions(int x2, int y2)
{
// ax + b = x2
// ay + b = y2
int x,y;
int g, m; // licznik i mianownik
x = y = -1;
M26Arithmetic m26Artm = new M26Arithmetic();
checkButton.setActionCommand("checkButton");
checkButton.addActionListener(listener);
for(int i=0; i<statistic.size(); i++)
{
for(int j=0; j<statistic.get(i).length; j++)
x = statistic.get(i)[j] - 97;
for(int j=0; j<statistic.size(); j++)
{
for(int k=0; k<statistic.get(j).length; k++)
{
y = statistic.get(j)[k] - 97;
if(y == x)
continue;
m = m26Artm.add(y, -x);
g = m26Artm.add(y2, -x2);
a = m26Artm.multiply(g, m26Artm.findReverse(m));
b = m26Artm.add(x2, -m26Artm.multiply(a, x));
if(m26Artm.areCoprimeIntegers(a, b))
{
System.out.println("Click");
checkButton.doClick();
}
}
}
}
}
Fragment klasy implementującej ActionListenera:
else if(aE.getActionCommand().equals("checkButton"))
{
System.out.println("Obsługa kliknięcia");
txtArea.setText(affineCypher.decode(txtArea.getText(), breaker.a, breaker.b));
}
Nie zrobiłem jeszcze panelu pytającego o poprawność dekodowania, ale skoro program nie działa to na razie nie ma po co dalej go rozbudowywać.