Простой Цезарь Шифр ​​в Java - PullRequest
6 голосов
/ 30 ноября 2009

Эй, я делаю простой код Цезаря в Java, используя формулу [x-> (x + shift-1) mod 127 + 1] Я хочу, чтобы мой зашифрованный текст содержал символы ASCII, кроме управляющих символов то есть с 32-127). Как можно избежать применения контрольных символов от 0 до 31 в зашифрованном тексте. Спасибо.

Ответы [ 7 ]

8 голосов
/ 30 ноября 2009

Как насчет этого:

public String applyCaesar(String text, int shift)
{
    char[] chars = text.toCharArray();
    for (int i=0; i < text.length(); i++)
    {
        char c = chars[i];
        if (c >= 32 && c <= 127)
        {
            // Change base to make life easier, and use an
            // int explicitly to avoid worrying... cast later
            int x = c - 32;
            x = (x + shift) % 96;
            if (x < 0) 
              x += 96; //java modulo can lead to negative values!
            chars[i] = (char) (x + 32);
        }
    }
    return new String(chars);
}

По общему признанию это рассматривает 127 как неконтролирующий символ, который не является ... Вы можете настроить его, чтобы сохранить диапазон как [32, 126].

1 голос
/ 22 июля 2013

Скопируйте и вставьте это в NetBeans с именем "Цезарь":

    //package caesar;
    import java.io.*;

    public class caesar {

    int offset=3;
    public String encrypt(String s) throws IOException
    {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++)
        {
            char t=s.charAt(i);
            if(t>='A' && t<='Z')
            {
                int t1=t-'A'+offset;
                t1=t1%26;
                sb.append((char)(t1+'A'));
            }
            else if(t>='a' && t<='z')
            {
                int t1=t-'a'+offset;
                t1=t1%26;
                sb.append((char)(t1+'a'));
            }
        }
        return sb.toString();
    }


    public String decrypt(String s) throws IOException
    {
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++)
        {
            char t=s.charAt(i);
            if(t>='A' && t<='Z')
            {
                int t1=t-'A'-offset;
                if(t1<0)t1=26+t1;
                sb.append((char)(t1+'A'));
            }
            else if(t>='a' && t<='z')
            {
                int t1=t-'a'-offset;
                if(t1<0)t1=26+t1;
                sb.append((char)(t1+'a'));
            }
        }
        return sb.toString();
    }


public static void main(String[] args) {
try
{
    System.out.println("Caesar encrypion technique");
    BufferedReader b;
    String oriTxt,encTxt,decTxt;
    System.out.println("Enter string to encrypt:");
    b=new BufferedReader(new InputStreamReader(System.in));
    oriTxt=b.readLine();
    caesar c=new caesar();
    encTxt=c.encrypt(oriTxt);
    System.out.println("Encrypted text :"+encTxt);
    decTxt=c.decrypt(encTxt);
    System.out.println("Derypted text :"+decTxt);
}
catch(Exception e)
{
    System.out.println(e.toString());
}
}

}

1 голос
/ 11 января 2011

Почему бы не попробовать

for(int i = 0; i < length; i++) { char c = chars[i] if(Character.isLetter(c)) { int x = c - 32; x = (x + shift) % 96; chars[i] = (char) (x+32); } }

1 голос
/ 14 июня 2010

есть! Есть ли способ рассмотреть весь спектр символов? Например, «á», «é», «ö», «ñ», а не считать «» ([Space])? (Например, моя строка - «Hello World», а стандартный результат - «Khoor # Zruog»; я хочу стереть это «#», поэтому результатом будет «KhoorZruog»)

Я уверен, что мой ответ в этом куске кода:

if (c >= 32 && c <= 127)
        {
            // Change base to make life easier, and use an
            // int explicitly to avoid worrying... cast later
            int x = c - 32;
            x = (x + shift) % 96;
            chars[i] = (char) (x + 32);
        }

... Но я попробовал кое-что, и это не сработало: S Итак, я буду ждать ваших ответов: D Увидимся!

1 голос
/ 17 декабря 2009

Обычно зашифрованный текст кодируется в base64, base16 (hex) также работает хорошо. Base64 чаще всего используется для зашифрованного текста, потому что он занимает меньше места, чем шестнадцатеричный код, а шестнадцатеричный чаще всего используется для дайджестов сообщений. В библиотеке java.util.prefs.Base64 вы найдете функции byteArrayToBase64 () и base64ToByteArray ().

С другой стороны, вы НИКОГДА не должны писать свой собственный алгоритм шифрования по соображениям безопасности, вы должны использовать блочный шифр или потоковый шифр. Я надеюсь, что это для удовольствия!

1 голос
/ 30 ноября 2009

Сопоставьте своих персонажей с [32..127] на [0..95], выполните mod 95+1 и сопоставьте результат с [32..127].

0 голосов
/ 27 сентября 2016
import java.util.Scanner;
//caeser

public class Major_Assingment {

public static final String ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZhh";

public static String encrypt(String plainText,int shiftKey)
{

plainText = plainText.toUpperCase();

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

        sc.close();

    }

}
...