Java, Comment implémenter un chiffrement par décalage (chiffrement César)


Je veux implémenter un décalage de chiffrement César pour augmenter chaque lettre d'une chaîne de 3.

Je reçois cette erreur:

possible loss of precision required char; found int

Voici mon code jusqu'à présent:

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

Quelles sont les causes de cette erreur? Comment puis-je implémenter un décalage de chiffrement césar pour augmenter chaque lettre d'une chaîne de 3?

Author: Eric Leschinski, 2013-10-01

5 answers

Java déplace le chiffrement César par shift espaces.

Restrictions:

  1. Ne fonctionne qu'avec un nombre positif dans le paramètre shift.
  2. Ne fonctionne qu'avec un décalage inférieur à 26.
  3. Fait un += qui va gêner l'ordinateur pour les corps de texte plus longs que quelques milliers de caractères.
  4. Fait un numéro de cast en caractère, donc il échouera avec autre chose que des lettres ascii.
  5. Ne tolère que les lettres a à z. Ne peut pas gérer les espaces, les chiffres, des symboles ou des caractères unicode.
  6. Le code viole le principe DRY (ne vous répétez pas) en répétant le calcul plus qu'il ne le doit.

Pseudo:

  1. Parcourez chaque caractère de la chaîne.
  2. Ajouter shift au caractère et si elle tombe de la fin de l'alphabet puis soustraire shift du nombre de lettres dans l'alphabet (26)
  3. Si le décalage ne fait pas tomber le caractère de la fin de l'alphabet, ajoutez le décalage à caractère.
  4. Ajoutez le caractère à une nouvelle chaîne. De retour de la chaîne.

Fonction:

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

Comment l'invoquer:

System.out.println(cipher("abc", 3));  //prints def
System.out.println(cipher("xyz", 3));  //prints abc
 10
Author: Eric Leschinski, 2014-02-17 04:47:15

Le code ci-dessous gère également les majuscules et les minuscules et laisse un autre caractère tel quel.

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();
    }
}
 3
Author: nanosoft, 2015-07-24 03:11:19

L'avertissement est dû au fait que vous essayez d'ajouter un entier (int shift = 3) à une valeur de caractère. Vous pouvez changer le type de données en char si vous voulez éviter cela.

Un char est de 16 bits, un int est de 32.

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

En aparté, vous pouvez simplifier ce qui suit:

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

À:

char[] message = "onceuponatime".toCharArray();
 1
Author: azz, 2013-10-01 05:43:38

Deux façons d'implémenter un chiffrement Caesar:

Option 1: Changez les caractères en nombres ASCII, puis vous pouvez augmenter la valeur, puis la rétablir au nouveau caractère.

Option 2: Utilisez une carte mapper chaque lettre à un chiffre comme celui-ci.

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

Avec une carte, vous n'avez pas à recalculer le décalage à chaque fois. Ensuite, vous pouvez passer du texte brut au texte chiffré en suivant la carte.

 1
Author: Ayan, 2014-02-17 03:42:16

Bonjour...J'ai créé une application client serveur java dans swing for caesar cipher...J'ai créé une nouvelle formule qui peut déchiffrer le texte correctement... désolé seulement pour les minuscules..!

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<en.length())
{
j=cs.indexOf(en.charAt(i));
k=(j+(26-key))%26;
d=d+cs.charAt(k);
i++;
}
while (num < 21)
{
progress.setValue(num);
try {
Thread.sleep(100);
} catch (InterruptedException ex) { }
progress.setValue( num );
Rectangle progressRect = progress.getBounds();
progressRect.x=0;
progressRect.y=0;
progress.paintImmediately( progressRect );
num++;
}
l5.setText("Decrypted text: "+d);
}
}
public static void main(String args[])throws IOException
{
new ceasarserver();
String strm =new String();
ServerSocket
ss=new ServerSocket(4321);
l1.setText("Secure data transfer Server Started....");
Socket s=ss.accept();
l2.setText("Client Connected !");
while(true)
{
Scanner br1= new Scanner(s.getInputStream());
en=br1.nextLine();
l3.setText("Client:"+en);
}
}
}



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
import java.util.*;
public class ceasarclient extends JFrame
{
String cs="abcdefghijklmnopqrstuvwxyz";
static JLabel l1,l2,l3,l4,l5;
JButton b1,b2,b3;
JTextField t1,t2;
JProgressBar progress;
int num=0;
String en="";
ceasarclient(final Socket s)
{
super("CLIENT");
JPanel p=new JPanel(new GridLayout(10,1));
setSize(500,500);
t1=new JTextField(30);
b1=new JButton("Send");
b1.setMnemonic('S');
b2=new JButton("Close");
b2.setMnemonic('C');
l1=new JLabel("Welcome to Secure Data transfer!");
l2=new JLabel("Enter the word here...");
l3=new JLabel("");
l4=new JLabel("Enter the Key:");
b3=new JButton("Encrypt");
b3.setMnemonic('E');
t2=new JTextField(30);
progress = new JProgressBar(0, 20);
progress.setValue(0);
progress.setStringPainted(true);
p.add(l1);
p.add(l2);
p.add(t1);
p.add(l4);
p.add(t2);
p.add(b3);
p.add(progress);
p.add(b1);
p.add(l3);
p.add(b2);
add(p);
setVisible(true);
b1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e)
{
try{
PrintWriter pw=new PrintWriter(s.getOutputStream(),true);
pw.println(en);
}catch(Exception ex){};
l3.setText("Encrypted Text Sent.");
}
});
b3.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
String strw=t1.getText();
int key=Integer.parseInt(t2.getText());
int i=0,j,k;
while(i<strw.length())
{
j=cs.indexOf(strw.charAt(
i));
k=(j+key)%26;
en=en+cs.charAt(k);
i++;
}
while (num < 21)
{
progress.setValue(num);
try {
Thread.sleep(100);
} catch (InterruptedException exe) { }
progress.setValue( num );
Rectangle progressRect = progress.getBounds();
progressRect.x=0;
progressRect.y=0;
progress.paintImmediately( progressRect );
num++;
}
}
});
b2.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e) 
{
System.exit(0);
}
});
pack();
}
public static void main(String args[])throws IOException
{
final Socket s =new Socket(InetAddress.getLocalHost(),4321);
new ceasarclient(s);
}
}
 0
Author: Sorpresa, 2014-01-15 15:16:23