Hey tôi đang tạo một mật mã caesar đơn giản trong Java bằng công thức [x-> (x + shift-1) mod 127 + 1] Tôi muốn có văn bản được mã hóa để có các ký tự ASCII ngoại trừ các ký tự điều khiển (ví dụ: từ 32-127). Làm thế nào tôi có thể tránh các ký tự điều khiển từ 0-31 áp dụng trong văn bản được mã hóa. Cảm ơn bạn.Mật mã caesar đơn giản trong java
Trả lời
Làm thế nào về một cái gì đó như thế này:
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);
}
Phải thừa nhận rằng đây đối xử với 127 như một nhân vật không điều khiển, mà nó không phải là ... bạn có thể muốn tinh chỉnh nó để giữ cho các phạm vi như [32, 126].
Lập bản đồ các ký tự của bạn từ [32..127] đến [0..95], thực hiện mod 95+1
và ánh xạ kết quả trở lại [32..127].
-1 Và còn các ký tự điều khiển thì sao? –
Thông thường văn bản mã hóa được mã hóa base64, base16 (hex) cũng hoạt động tốt. Base64 được sử dụng thường xuyên nhất cho văn bản mã hóa bởi vì nó chiếm ít không gian hơn hex, hex được sử dụng phổ biến nhất để phân loại thông báo. Trong thư viện java.util.prefs.Base64 bạn sẽ tìm thấy byteArrayToBase64() và base64ToByteArray().
Trên một lưu ý phụ, bạn KHÔNG BAO GIỜ nên viết thuật toán mã hóa của riêng mình vì lý do bảo mật, bạn nên sử dụng mật mã khối hoặc mật mã dòng. Tôi hy vọng điều này là cho vui!
đó! Có cách nào để xem xét toàn bộ phạm vi của các nhân vật? Ví dụ: "á", "é", "ö", "ñ" và không xem xét "" ([Không gian])? (Ví dụ: Chuỗi của tôi là "Hello World" và kết quả chuẩn là "Khoor # Zruog"; Tôi muốn xóa "#", do đó kết quả sẽ là "KhoorZruog")
Tôi chắc chắn câu trả lời nằm trong đoạn mã sau:
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);
}
... Nhưng tôi đã thử một số thứ và không hoạt động: S Vì vậy, tôi sẽ đợi câu trả lời của bạn: D Hẹn gặp bạn!
Tại sao không thử
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); } }
Sao chép dán này trong NetBeans với tên "caesar":
//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());
}
}
}
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();
}
}
để được trợ giúp liên hệ với tôi. –
Bài tập về nhà? Nếu có, vui lòng gắn thẻ như vậy. –