【问题标题】:Unexpected output from program that brute-forces affine ciphers蛮力仿射密码的程序的意外输出
【发布时间】:2021-12-04 12:38:16
【问题描述】:

在编写暴力仿射密码的程序时,我偶然发现了一些奇怪的输出。 对于每个 a 值,随着 b 值的增加,输出似乎会溢出一个字母。似乎解密方程的结果永远不会低于-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

【问题讨论】:

    标签: java encryption cryptography


    【解决方案1】:

    看来我的解密方程式中缺少一对括号。

    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);   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-17
      • 1970-01-01
      相关资源
      最近更新 更多