Java,如何实现移位密码(Caesar Cipher)

我想实现一个Caesar Cipher移位,将字符串中的每个字母增加3。

我收到此错误:

possible loss of precision required char; found int 

这是我到目前为止的代码:

 import java.util.Scanner; import java.io.*; public class CaesarCipher { public static void main (String [] args) { char[] letters = {'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'}; char[] message = "onceuponatime".toCharArray(); char[] eMessage = new char[message.length]; char shift = 3; //encrypting message for(int i = 0; i <= message.length; ++i) { eMessage[i] = (message[i] + shift) % (char) letters.length; System.out.println(x); } } } 

是什么导致这个错误? 如何实现caesar Cipher shift以将字符串中的每个字母增加3?

Java Shift Caesar Cipher由shift空间组成。

限制:

  1. 仅适用于shift参数中的正数。
  2. 仅适用于低于26的class次。
  3. a + =会使计算机停滞不前,因为文本的主体长度超过几千个字符。
  4. 是一个转换编号到字符,所以它将失败除了ascii字母之外的任何东西。
  5. 只容忍字母a到z。 无法处理空格,数字,符号或unicode。
  6. 代码违反了DRY(不要重复自己)原则,重复计算的次数超过了它。

伪代码:

  1. 循环遍历字符串中的每个字符。
  2. 添加到角色的移位,如果它从字母表的末尾掉落,则从字母表中的字母数减去移位(26)
  3. 如果移位不会使角色从字母表的末尾掉落,则将移位添加到角色。
  4. 将字符附加到新字符串上。 返回字符串。

function:

 String cipher(String msg, int shift){ String s = ""; int len = msg.length(); for(int x = 0; x < len; x++){ char c = (char)(msg.charAt(x) + shift); if (c > 'z') s += (char)(msg.charAt(x) - (26-shift)); else s += (char)(msg.charAt(x) + shift); } return s; } 

如何调用它:

 System.out.println(cipher("abc", 3)); //prints def System.out.println(cipher("xyz", 3)); //prints abc 

下面的代码也处理大小写的情况,并保留其他字符。

 import java.util.Scanner; public class CaesarCipher { public static void main(String[] args) { Scanner in = new Scanner(System.in); int length = Integer.parseInt(in.nextLine()); String str = in.nextLine(); int k = Integer.parseInt(in.nextLine()); k = k % 26; System.out.println(encrypt(str, length, k)); in.close(); } private static String encrypt(String str, int length, int shift) { StringBuilder strBuilder = new StringBuilder(); char c; for (int i = 0; i < length; i++) { c = str.charAt(i); // if c is letter ONLY then shift them, else directly add it if (Character.isLetter(c)) { c = (char) (str.charAt(i) + shift); // System.out.println(c); // checking case or range check is important, just if (c > 'z' // || c > 'Z') // will not work if ((Character.isLowerCase(str.charAt(i)) && c > 'z') || (Character.isUpperCase(str.charAt(i)) && c > 'Z')) c = (char) (str.charAt(i) - (26 - shift)); } strBuilder.append(c); } return strBuilder.toString(); } } 

警告是由于您尝试将整数( int shift = 3 )添加到字符值。 如果要避免这种情况,可以将数据类型更改为char

char是16位, int是32。

 char shift = 3; // ... eMessage[i] = (message[i] + shift) % (char)letters.length; 

另外,您可以简化以下操作:

 char[] message = {'o', 'n', 'c', 'e', 'u', 'p', 'o', 'n', 'a', 't', 'i', 'm', 'e'}; 

至:

 char[] message = "onceuponatime".toCharArray(); 

实现凯撒密码的两种方法:

选项1:将字符更改为ASCII数字,然后您可以增加该值,然后将其还原为新字符。

选项2:使用地图将每个字母映射到这样的数字。

 A - 0 B - 1 C - 2 etc... 

使用地图,您无需每次都重新计算class次。 然后,您可以通过以下地图更改为从明文更改为加密。

您好…我已经为凯撒密码创建了一个Java客户端服务器应用程序…我创建了一个新的公式,可以正确解密文本…对不起只有小写..!

 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; import java.util.*; public class ceasarserver extends JFrame implements ActionListener { static String cs="abcdefghijklmnopqrstuvwxyz"; static JLabel l1,l2,l3,l5,l6; JTextField t1; JButton close,b1; static String en; int num=0; JProgressBar progress; ceasarserver() { super("SERVER"); JPanel p=new JPanel(new GridLayout(10,1)); l1=new JLabel(""); l2=new JLabel(""); l3=new JLabel(""); l5=new JLabel(""); l6=new JLabel("Enter the Key..."); t1=new JTextField(30); progress = new JProgressBar(0, 20); progress.setValue(0); progress.setStringPainted(true); close=new JButton("Close"); close.setMnemonic('C'); close.setPreferredSize(new Dimension(300, 25)); close.addActionListener(this); b1=new JButton("Decrypt"); b1.setMnemonic('D'); b1.addAction Listener(this); p.add(l1); p.add(l2); p.add(l3); p.add(l6); p.add(t1); p.add(b1); p.add(progress); p.add(l5); p.add(close); add(p); setVisible(true); pack(); } public void actionPerformed(ActionEvent e) { if(e.getSource()==close) System.exit(0); else if(e.getSource()==b1) { int key=Integer.parseInt(t1.getText()); String d=""; int i=0,j,k; while(i