Feistel Cipher ararrayindexoutofbounds 与函数 F 异或后。

Posted

技术标签:

【中文标题】Feistel Cipher ararrayindexoutofbounds 与函数 F 异或后。【英文标题】:Feistel Cipher arrrayindexoutofbounds after XOR with function, F. 【发布时间】:2017-03-13 23:06:42 【问题描述】:

我正在尝试在 Java 中实现纯文本 Feistel Cipher,我使用硬编码的“字母”数组为原始纯文本消息的每个字符分配数值。我的问题是,一旦我将函数应用于右半边并与左半边进行异或运算,有时我会留下一个超出“字母”数组范围的数字。

这是字母数组:

public static char[] alphabet = new char[] 'a', 'b', 'c', 'd', 'e','f' ,'g', 'h', 'i',
        'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ';

这是函数:

    private static int function(int character, int key, int roundNumber) 
    return (2 * roundNumber * key * character) % 26;

这是用于加密的代码块:

for(int r = 1; r <= rounds; r++) 

        String str1 = "";
        String str2 = "";
        // looping through left half and applying XOR with function
        for(int i = 0; i < midpoint; i++)
            leftHalf[i] ^= (function(rightHalf[i], KEY, r));
            System.out.println(leftHalf[i]);

            // turn left half numbers back to chars
            str1 += alphabet[leftHalf[i]];

        

        // turning right half numbers back to chars
        for (int i = 0; i < rightHalf.length; i++) 
            str2 += alphabet[rightHalf[i]];
        

        System.out.println("ENCIPHER-" + r + " " + str1 + str2);
        temp = leftHalf; leftHalf = rightHalf; rightHalf = temp; // swap after

        KEY++;
    

错误发生在这一行:

str1 += alphabet[leftHalf[i]];

我已经尝试了 %26 leftHalf[i] 数字,以便它适合字母数组,但这破坏了密码的要点,我无法破译它。

我也尝试了几种不同的功能,但我认为主要与 XOR 有关。有没有办法确保 XOR 将返回字母数组范围内的某些内容,或者我是否以错误的方式处理这整个事情?任何帮助表示赞赏。

另外,错误代码:

Please enter a message to be encrypted: hello  there
Please enter number of encryption rounds between 1 and 20: 5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 31
at com.company.FeistelCipher.main(FeistelCipher.java:94)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at       sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
[7][4][11][11][14][26][26][19][7][4][17][4]
Original Message: hello  there
5
24
31

Process finished with exit code 1

【问题讨论】:

【参考方案1】:

我很确定我能弄明白。因此,由于字母数组中的最高数组索引是 26,这意味着 XOR 将是最高的 5 位操作(二进制为 10111)。对于 5 位,XOR 将产生的最大数字为 31(二进制为 11111)。所以我只是在字母数组中添加了 5 个多余的、未使用的小写字母,使其长度为 31。然后我只需要确保函数也返回一个 5 位内的数字,这就是模数的用途。

新数组:

public static char[] alphabet = new char[] 'a', 'b', 'c', 'd', 'e','f' ,'g', 'h', 'i',
        'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', ' ', 'a', 'b', 'c', 'd', 'e', 'f';

新功能:

  private static int function(int character, int key, int roundNumber) 
    return (2 * roundNumber * key * character) % 23;

%26 的旧函数很好,但 %23 给了我更好的加密结果。无论哪种方式,它们都低于 5 位或低于 5 位。

【讨论】:

以上是关于Feistel Cipher ararrayindexoutofbounds 与函数 F 异或后。的主要内容,如果未能解决你的问题,请参考以下文章

网络安全课 03 (Feistel密码 DES加密)

一个非常简陋的基于LFSR和Feistel网络的加解密运算,有位处理。C

分组密码

java cipher

cipher命令有啥用?

一直以来任何英语中cypher和cipher意思完全一样吗?