java java凯撒密码

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35242376/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 23:53:10  来源:igfitidea点击:

java caesar cipher code

javaencryptioncaesar-cipher

提问by mandip

i did caesar cipher code by java it runs but doesnt encrypt anything after user enter the key !

我用它运行的java做了凯撒密码,但在用户输入密钥后不加密任何东西!

here is my code

这是我的代码

public class CaesarCipher
{
    public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";

    public static String encrypt(String plainText, int shiftKey)
    {
        plainText = plainText.toLowerCase();
        String cipherText = "";
        for (int i = 0; i < plainText.length(); i++)
        {
            int charPosition = ALPHABET.indexOf(plainText.charAt(i));
            int keyVal = (shiftKey + charPosition) % 26;
            char replaceVal = ALPHABET.charAt(keyVal);
            cipherText += replaceVal;
        }
        return cipherText;
    }

    public static String decrypt(String cipherText, int shiftKey)
    {
        cipherText = cipherText.toLowerCase();
        String plainText = "";
        for (int i = 0; i < cipherText.length(); i++)
        {
            int charPosition = ALPHABET.indexOf(cipherText.charAt(i));
            int keyVal = (charPosition - shiftKey) % 26;
            if (keyVal < 0)
            {
                keyVal = ALPHABET.length() + keyVal;
            }
            char replaceVal = ALPHABET.charAt(keyVal);
            plainText += replaceVal;
        }
        return plainText;
    }

    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter the String for Encryption: ");
        String message = new String();
        message = sc.next();
        System.out.println(encrypt(message, 3));
        System.out.println(decrypt(encrypt(message, 3), 3));
        sc.close();
    }
}

run:

跑:

Enter The Plain Text:
Reem LA
Enter The Key:
2
The Cipher Text

回答by Sunil Dabburi

Try this:

试试这个:

import java.util.*;

public class CaesarCipher
{ 
public static final String ALPHABET = "abcdefghijklmnopqrstuvwxyz";
public static String encrypt(String plainText, int shiftKey)
{
    plainText = plainText.toLowerCase();
    String cipherText = "";
    for (int i = 0; i < plainText.length(); i++)
    {
        char replaceVal = plainText.charAt(i);
        int charPosition = ALPHABET.indexOf(replaceVal);        
        if(charPosition != -1) {
            int keyVal = (shiftKey + charPosition) % 26;
            replaceVal = ALPHABET.charAt(keyVal);
        }

        cipherText += replaceVal;
    }
    return cipherText;
}

public static String decrypt(String cipherText, int shiftKey)
{
    cipherText = cipherText.toLowerCase();
    String plainText = "";
    for (int i = 0; i < cipherText.length(); i++)
    {
        char replaceVal = cipherText.charAt(i);
        int charPosition = ALPHABET.indexOf(replaceVal);
        if(charPosition != -1) {
            int keyVal = (charPosition - shiftKey) % 26;
            if (keyVal < 0) {
                keyVal = ALPHABET.length() + keyVal;
            }   
            replaceVal = ALPHABET.charAt(keyVal);
        }     
        plainText += replaceVal;
    }
    return plainText;
}

public static void main(String[] args)
{
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the String for Encryption: ");
    String message = new String();
    message = sc.nextLine();
    System.out.println(encrypt(message, 3));
    System.out.println(decrypt(encrypt(message, 3), 3));
    sc.close();
}
}

This will work for all alphabetical strings... But as per your program, this will convert the original message to lowercase. So this is not pure encryption since your program is case insensitive.

这将适用于所有字母字符串......但根据您的程序,这会将原始消息转换为小写。所以这不是纯加密,因为您的程序不区分大小写。

If you want your program to be case sensitive, here is the program:

如果你希望你的程序区分大小写,这里是程序:

import java.util.*;

public class CaesarCipher
{ 
public static final String ALPHABET_LOWER = "abcdefghijklmnopqrstuvwxyz";
public static final String ALPHABET_UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static String encrypt(String plainText, int shiftKey)
{
    String cipherText = "";
    for (int i = 0; i < plainText.length(); i++)
    {
        int charPosition = -1;
        char replaceVal;
        int keyVal = -1;
        char val = plainText.charAt(i);
        System.out.println(val);
        if(Character.isUpperCase(val)) {
            charPosition = ALPHABET_UPPER.indexOf(val);
            if(charPosition != -1) {
                keyVal = (shiftKey + charPosition) % 26;
                replaceVal = ALPHABET_UPPER.charAt(keyVal);
            } else {
                replaceVal = plainText.charAt(i);
            }           
        } else {
            charPosition = ALPHABET_LOWER.indexOf(val);
            if(charPosition != -1) {
                keyVal = (shiftKey + charPosition) % 26;
                replaceVal = ALPHABET_LOWER.charAt(keyVal);
            } else {
                replaceVal = plainText.charAt(i);
            }
        }       
        System.out.println("Cipher: "+cipherText);
        cipherText += replaceVal;        
    }
    return cipherText;
}

public static String decrypt(String cipherText, int shiftKey)
{
    String plainText = "";
    for (int i = 0; i < cipherText.length(); i++)
    {
        int charPosition = -1;
        char replaceVal;
        int keyVal = -1;
        char val = cipherText.charAt(i);

        if(Character.isUpperCase(val)) {
            charPosition = ALPHABET_UPPER.indexOf(val);
            if(charPosition != -1) {
                keyVal = (charPosition - shiftKey) % 26;
                if (keyVal < 0) {
                    keyVal = ALPHABET_UPPER.length() + keyVal;
                }
                replaceVal = ALPHABET_UPPER.charAt(keyVal);
            } else {
                replaceVal = cipherText.charAt(i);
            }           
        } else {
            charPosition = ALPHABET_LOWER.indexOf(val);
            if(charPosition != -1) {
                keyVal = (charPosition - shiftKey) % 26;
                if (keyVal < 0) {
                    keyVal = ALPHABET_LOWER.length() + keyVal;
                }
                replaceVal = ALPHABET_LOWER.charAt(keyVal);
            } else {
                replaceVal = cipherText.charAt(i);
            }
        }
        plainText += replaceVal;
    }
    return plainText;
}

public static void main(String[] args)
{
    Scanner sc = new Scanner(System.in);
    System.out.println("Enter the String for Encryption: ");
    String message = new String();
    message = sc.nextLine();
    System.out.println(encrypt(message, 3));
    System.out.println(decrypt(encrypt(message, 3), 3));
    sc.close();
}
}

Hope this gives some idea. All the best.

希望这能给一些想法。一切顺利。

回答by OneCricketeer

Using indexOfis not very efficient... You can do integer arithmetic on charvalues to get their indices.

使用indexOf不是很有效......您可以对char值进行整数运算以获得它们的索引。

I included comments in the code to explain more, but this is what I came up with.

我在代码中加入了注释来解释更多,但这就是我想出来的。

public class CaesarCipher {
    // Rotate a character k-positions
    public static char cipher(char c, int k) {
        // declare some helping constants
        final int alphaLength = 26;
        final char asciiShift = Character.isUpperCase(c) ? 'A' : 'a';
        final int cipherShift = k % alphaLength;

        // shift down to 0..25 for a..z
        char shifted = (char) (c - asciiShift);
        // rotate the letter and handle "wrap-around" for negatives and value >= 26
        shifted = (char) ((shifted + cipherShift + alphaLength) % alphaLength);
        // shift back up to english characters
        return (char) (shifted + asciiShift);
    }

    // Rotate a string k-positions
    public static String cipher(String s, int k) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            sb.append(cipher(s.charAt(i), k));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        String password;
        int key;

        System.out.print("Please enter a password: ");
        password = keyboard.nextLine();

        do {
            System.out.print("Please enter a key between 1-25: ");
            key = keyboard.nextInt();

            if (key < 1 || key > 25) {
                System.out.printf(" The key must be between 1 and 25, you entered %d.\n", key);
            }
        } while (key < 1 || key > 25);


        System.out.println("Password:\t" + password);
        String encryption = cipher(password, key);
        System.out.println("Encrypted:\t" + encryption);
        System.out.println("Decrypted:\t" + cipher(encryption, -key));

    }
}

The output should be something like

输出应该是这样的

Please enter a password: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Please enter a key between 1-25: 1
Password:   ABCDEFGHIJKLMNOPQRSTUVWXYZ
Encrypted:  BCDEFGHIJKLMNOPQRSTUVWXYZA
Decrypted:  ABCDEFGHIJKLMNOPQRSTUVWXYZ

回答by mandip

This is probably the easiest way to do it and the most easy to understand:

这可能是最简单的方法,也是最容易理解的:

import java.util.*;
public class CeaserCipher {
   public static void main (String [] args) {
      Scanner input = new Scanner(System.in);
      System.out.print("Type your message ");
      String message = input.nextLine().toUpperCase();
      System.out.print("Set Encoding Key ");
      int key = input.nextInt() % 26;
      for (int i = 0; i < message.length(); i++) {
         char c = message.charAt(i);
         if (c <= 64 || c >= 91) {
            c += 0;
          }
         else {
            c += key;
            if (c >= 91) {
               c -= 26;
            }
         }
         System.out.print(c);
      }
   }
}