带有空格的凯撒密码解密方法

时间:2019-05-09 00:28:40

标签: java encryption caesar-cipher

我正在做一个凯撒密码程序,这是我在Java I中的最终项目。我有一种处理小写和大写字符的加密方法。但是我碰壁试图调整算法以相反的方向工作移位因子来解密已经在程序中运行的文本。

另一个问题是我无法使程序使用空格,要么忽略它们,要么也对其进行加密。到目前为止,它仅加密第一个单词,而忽略其余单词。 到目前为止,这是我的加密方法,其中从main()传递的消息作为参数。

//Caesar Cipher
public class EncryptionClass1 { 
     protected static String encryptedMessageString;

    public static String setEncryptedMessage(String message) { 
        StringBuffer encryptedMessageBuffer = new StringBuffer();
        char newCharacter;
        int shiftFactor = 1;
        int i;

             //for length of secret message
          for (i = 0; i<message.length(); i++) { 
            //uppercase encoder
            if (Character.isUpperCase(message.charAt(i))) { 
                newCharacter = (char)(((int)message.charAt(i) - 
                                  shiftFactor - 65) % 26 + 65); 
                encryptedMessageBuffer.append(newCharacter);          
            }//if close 

            //lowercase encoder
            else { 
                newCharacter = (char)(((int)message.charAt(i) - 
                                  shiftFactor - 97) % 26 + 97); 
                encryptedMessageBuffer.append(newCharacter); 
            }//else close 

          }//for close 
        //convert StringBuffer to string 
        encryptedMessageString = encryptedMessageBuffer.toString();
        return encryptedMessageString;  

    }//setEncryptedMessage close  
}//EncryptionClass1 close 

对于解密,我认为我只需要调整加密方法的一些操作,但是我无法查明是什么。

对于空格,输入和输出示例应如下:

Input: “my secret message”
Output: rp dbxbbf rbddtfb

1 个答案:

答案 0 :(得分:0)

要沿相反方向移动,请沿当前方向进一步移动。在360°转盘上可视化26个字母。如果加密是将转盘5个字母向右旋转(移动),通常您会认为解密是将转盘5个字母向左旋转。但是您也可以向右旋转转盘21(26-5)个字母。因此,如果加密向上移动shiftFactor,则解密向上移动26 - shiftFactor。通过仅向上移动,% 26操作将正确地包裹该移位。

由于加密后的消息的长度始终与原始消息相同,并且一次只能替换一个字母,因此,如果您仅使用原始消息中的char[],则代码将更加简单。如果这样做,则只需跳过数组中非ASCII字母的字符即可。

不要使用幻数65和97,而应使用它们的char值使代码更具可读性。

以上所有内容意味着您的代码可以这样编写:

private static final int SHIFT_FACTOR = 5;

public static String encryptMessage(String message) {
    return applyShift(message, SHIFT_FACTOR);
}

public static String decryptMessage(String message) {
    return applyShift(message, 26 - SHIFT_FACTOR);
}

private static String applyShift(String message, int shiftFactor) {
    char[] chars = message.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        char c = chars[i];
        if (c >= 'A' && c <= 'Z')
            chars[i] = (char) ((c - 'A' + shiftFactor) % 26 + 'A');
        else if (c >= 'a' && c <= 'z')
            chars[i] = (char) ((c - 'a' + shiftFactor) % 26 + 'a');
    }
    return new String(chars);
}

测试

public static void main(String[] args) {
    test("my secret message");
    test("Hello World!");
}
private static void test(String message) {
    String encrypted = encryptMessage(message);
    System.out.println("Input    : " + message);
    System.out.println("Encrypted: " + encrypted);
    System.out.println("Decrypted: " + decryptMessage(encrypted));
    System.out.println();
}

输出

Input    : my secret message
Encrypted: rd xjhwjy rjxxflj
Decrypted: my secret message

Input    : Hello World!
Encrypted: Mjqqt Btwqi!
Decrypted: Hello World!