2009-11-30 38 views
5

嘿,我正在使用公式[x->(x + shift-1)mod 127 + 1]在Java中創建一個簡單的凱撒密碼。我想讓我的加密文本具有ASCII字符除控制字符外(即32-127)。如何避免0-31中的控制字符應用於加密文本中。謝謝。java中的簡單凱撒密碼

+2

家庭作業?如果是這樣,請標記爲這樣。 – 2009-11-30 18:34:43

回答

8

怎麼是這樣的:

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

將你的角色從[32..127]映射到[0..95],做一個mod 95+1並將結果映射回[32..127]。

+0

-1那麼控制字符呢? – 2010-06-14 02:07:44

1

通常密文是base64編碼,base16(十六進制)也適用。 Base64最常用於密文,因爲它佔用的空間比十六進制少,十六進制最常用於消息摘要。在java.util.prefs.Base64庫中,您將找到byteArrayToBase64()和base64ToByteArray()。

在旁註中,出於安全原因,您絕不應編寫自己的加密算法,您應該使用分組密碼或流密碼。我希望這是爲了好玩!

1

有!有沒有辦法考慮整個角色的範圍?例如,「á」,「é」,「ö」,「ñ」,而不是「」([Space])? (例如,我的String是「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

爲什麼不試試

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

副本名爲 「凱撒」 粘貼在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()); 
} 
} 

}

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

任何幫助與我聯繫。 – 2016-09-27 20:53:05