2009-11-30 8 views
5

अरे मैं फ़ॉर्मूला [x-> (x + shift-1) mod 127 + 1 का उपयोग कर जावा में एक साधारण सीज़र सिफर बना रहा हूं] मैं अपने एन्क्रिप्टेड टेक्स्ट को ASCII वर्ण रखने के लिए चाहता हूं नियंत्रण पात्रों को छोड़कर (यानी 32-127 से)। एन्क्रिप्टेड टेक्स्ट में आवेदन करने वाले 0-31 से नियंत्रण वर्णों से मैं कैसे बच सकता हूं। धन्यवाद।जावा में सरल सीज़र सिफर

+2

होमवर्क? यदि ऐसा है, तो कृपया इसे इस तरह टैग करें। –

उत्तर

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 रखने के लिए tweak करना चाह सकते हैं, 126]।

1

[32..127] से [0..95] तक अपने पात्रों को मानचित्र करें, mod 95+1 करें और परिणाम को [32..127] पर मानचित्र करें।

+0

-1 और नियंत्रण पात्रों के बारे में क्या? किसी भी मदद के लिए –

1

आमतौर पर सिफर टेक्स्ट बेस 64 एन्कोडेड होता है, बेस 16 (हेक्स) भी अच्छी तरह से काम करता है। बेस 64 का उपयोग अक्सर सिफर टेक्स्ट के लिए किया जाता है क्योंकि यह हेक्स की तुलना में कम जगह लेता है, हेक्स का उपयोग आमतौर पर संदेश डाइजेस्ट के लिए किया जाता है। Java.util.prefs.Base64 लाइब्रेरी में आपको byteArrayToBase64() और base64ToByteArray() मिलेगा।

एक तरफ ध्यान दें कि आपको कभी भी सुरक्षा कारणों से अपना स्वयं का एन्क्रिप्शन एल्गोरिदम नहीं लिखना चाहिए, आपको ब्लॉक सिफर या स्ट्रीम सिफर का उपयोग करना चाहिए। मुझे उम्मीद है कि यह मजेदार है!

1

वहाँ! क्या पात्रों की पूरी श्रृंखला पर विचार करने का कोई तरीका है? उदाहरण के लिए, "á", "é", "ö", "ñ", और "" [स्पेस]) पर विचार नहीं करते? (उदाहरण के लिए, मेरा स्ट्रिंग "हैलो वर्ल्ड" है, और मानक परिणाम "खुर # ज़्रूग" है; मैं उस "#" को मिटाना चाहता हूं, इसलिए परिणाम "खुरज़्रोग" होगा)

मुझे यकीन है कि मेरा जवाब कोड के इस टुकड़े में है:

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

... लेकिन मैं कुछ बातें की कोशिश की है, और काम नहीं किया: एस तो, मैं अपने जवाब के लिए इंतजार करेंगे: घ मिलते हैं!

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

मुझसे संपर्क करें। –

संबंधित मुद्दे