2009-11-30 51 views
5

Oye Estoy haciendo un cifrado César simple en Java usando la fórmula [x-> (x + shift-1) mod 127 + 1] Quiero que mi texto cifrado tenga los caracteres ASCII excepto los caracteres de control (es decir, de 32 a 127). ¿Cómo puedo evitar que los caracteres de control 0-31 se apliquen en el texto cifrado? Gracias.Cifrado César simple en java

+2

tarea? Si es así, por favor marqúelo como tal. –

Respuesta

8

¿Qué tal algo como esto:

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

cierto que esto trata a 127 como un personaje no-control, que no lo es ... es posible que desee modificarlo para mantener el rango como [32, 126].

1

Asigne sus caracteres desde [32..127] a [0..95], haga un mod 95+1 y asocie el resultado de nuevo a [32..127].

+0

-1 ¿Y los personajes de control? –

1

Normalmente el texto de cifrado está codificado en base64, base16 (hexadecimal) también funciona bien. Base64 se usa con más frecuencia para el texto de cifrado porque ocupa menos espacio que el hexadecimal, el hexadecimal se usa con mayor frecuencia para resúmenes de mensajes. En la biblioteca java.util.prefs.Base64 encontrará byteArrayToBase64() y base64ToByteArray().

Como nota adicional, NUNCA debe escribir su propio algoritmo de encriptación por razones de seguridad, debe usar un cifrado de bloque o un cifrado de flujo. ¡Espero que esto sea por diversión!

1

allí! ¿Hay alguna manera de considerar toda la gama de personajes? Por ejemplo, "á", "é", "ö", "ñ", y no considerar "" (el [Espacio])? (Por ejemplo, mi String es "Hello World", y el resultado estándar es "Khoor # Zruog"; quiero borrar ese "#", por lo que el resultado sería "KhoorZruog")

Estoy seguro de que respuesta está en este pedazo de código:

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

... Pero he intentado algunas cosas, y la no funcionó: S por lo tanto, voy a esperar por sus respuestas: D Nos vemos!

1

Por qué no pruebas

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

copiar y pegar esto en NetBeans con el nombre de "César":

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

}

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

    } 

} 
+0

para cualquier ayuda póngase en contacto conmigo. –