强制执行仿射密码的程序的意外输出



在编写一个程序来暴力执行仿射密码时,我偶然发现了一些奇怪的输出。对于每个a值,随着b值的增加,输出似乎会被一个字母所占用。看起来,似乎解密方程的结果永远不会低于-1,为了使程序正常工作,它需要-1,但这只是对哪里出错的猜测。

a Value: 1
esxlnxxceslj
drwkmwwbdrki
cqvjlvvacqjh
bpuikuuzbpig
aothjttzaohf
znsgisszznge
zmrfhrrzzmfd
zlqegqqzzlec
zkpdfppzzkdb
zjoceoozzjca
zinbdnnzzibz
zhmacmmzzhaz
zglzbllzzgzz
zfkzakkzzfzz
zejzzjjzzezz
zdizziizzdzz
zchzzhhzzczz
zbgzzggzzbzz
zafzzffzzazz
zzezzeezzzzz
zzdzzddzzzzz
zzczzcczzzzz
zzbzzbbzzzzz
zzazzaazzzzz
zzzzzzzzzzzz
zzzzzzzzzzzz
a Value: 3
kgzvnzzskgvd
bxqmeqqjbxmu
sohdvhhasodl
jfyumyyrjfuc
awpldpprawlt
rngcuggrrnck
rextlxxrretb
rvokcoorrvks
rmfbtffrrmbj
rdwskwwrrdsa
runjbnnrrujr
rleaseerrlar
rcvrjvvrrcrr
rtmrammrrtrr
rkdrrddrrkrr
rburruurrbrr
rslrrllrrsrr
rjcrrccrrjrr
ratrrttrrarr
rrkrrkkrrrrr
rrbrrbbrrrrr
rrsrrssrrrrr
rrjrrjjrrrrr
rrarraarrrrr
rrrrrrrrrrrr
rrrrrrrrrrrr
a Value: 5
//and so on

实际上,每个a值只有前5行左右是正确的。之后似乎就跑题了。

package Ciphers;
public class AffineBruteForce {
private static String alphabet = "abcdefghijklmnopqrstuvwxyz";

public static void decrypt(String str) {
str = str.toLowerCase();
int[] aValues = {1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25};
StringBuilder insert = new StringBuilder();

//i = a-value
for (int i = 0; i < aValues.length; i++) { 
System.out.println();
System.out.println("a Value: " + aValues[i]);
System.out.println();
//j = b-value
for (int j = 0; j < 25; j++) {      

for (int k = 0; k < str.length(); k++) {

//Decryption equation, x = a^-1(y–b) mod 26
int num = Math.floorMod(MultiInverse.modInverse(aValues[i], 26) * (alphabet.indexOf((str.charAt(k)) - j)), 26); 
insert.append(alphabet.charAt(num));            
}
System.out.println(insert.toString());
insert.setLength(0);
}
}
}

public static void main (String[]args) {
AffineBruteForce.decrypt("ESXLNXXCESLJ");
}
}
package Ciphers;
public class MultiInverse {
static int modInverse(int a, int m)
{

for (int x = 1; x < m; x++)
if (Math.floorMod((Math.floorMod(a, m)) * (Math.floorMod(x, m)), m) == 1)
return x;
return 1;
}
}

例如,如果我们看a = 1

预期输出

esxlnxxceslj
drwkmwwbdrki
cqvjlvvacqjh
bpuikuuzbpig
aothjttyaohf
znsgissxznge
ymrfhrrwymfd
xlqegqqvxlec
wkpdfppuwkdb
vjoceootvjca
uinbdnnsuibz
thmacmmrthay
sglzbllqsgzx
rfkyakkprfyw
qejxzjjoqexv
pdiwyiinpdwu
ochvxhhmocvt
nbguwgglnbus
maftvffkmatr
lzesueejlzsq
kydrtddikyrp
jxcqscchjxqo
iwbprbbgiwpn
hvaoqaafhvom
guznpzzegunl
ftymoyxdftmk
实际输出

a Value: 1
esxlnxxceslj
drwkmwwbdrki
cqvjlvvacqjh
bpuikuuzbpig
aothjttzaohf
znsgisszznge
zmrfhrrzzmfd
zlqegqqzzlec
zkpdfppzzkdb
zjoceoozzjca
zinbdnnzzibz
zhmacmmzzhaz
zglzbllzzgzz
zfkzakkzzfzz
zejzzjjzzezz
zdizziizzdzz
zchzzhhzzczz
zbgzzggzzbzz
zafzzffzzazz
zzezzeezzzzz
zzdzzddzzzzz
zzczzcczzzzz
zzbzzbbzzzzz
zzazzaazzzzz
zzzzzzzzzzzz
zzzzzzzzzzzz

看起来我在解密方程中缺少一对括号。

int num = Math.floorMod(MultiInverse.modInverse(aValues[i], 26) * (alphabet.indexOf((str.charAt(k)) - j)), 26);

应该是

int num = Math.floorMod(MultiInverse.modInverse(aValues[i], 26) * (((alphabet.indexOf(str.charAt(k))) - j)), 26);