Hướng giải quyết cho bài toán cipher encryption

Mình đang học java và đang bế tắc vs bài tập này. Mong mọi người định hướng cách giải quyết vấn đề này:
Caesar cipher is a substitution cipher method which was used by Julius Caesar to protect private information from the enemies. By replace each letter in the original letter with a letter some fixed positions down the alphabet, the result is meaningless to anyone who doesn’t know the secret.
Write a program that apply Caesar cipher on a message taken from user and print the result. Assuming all input letters are lower case. The letters shift are provided as below.

Plain: ABCDEFGHIJKLMNOPQRSTUVWXYZ
Cipher: DEFGHIJKLMNOPQRSTUVWXYZABC
E.g. Original message: hello world
Encrypted message: khoor zruog

1 Like

Cơ bản như sau:
index = 1 -> A
index = 2 -> B
index = 3 -> C

Theo input thì A sẽ được chuyển thành D, tức là chỉ số index được cộng thêm cho 3. Bảng ký tự alphabet có 26 ký tự, cho nên khi index + 3 > 26 thì quay ngược trở về đầu bảng.

index_của_ký_tự_được_mã_hóa = (index_của_ký_tự_ban_đầu + 3) % 26

P.s Cần lưu ý trường hợp (23 + 3) % 26, công thức tổng quát nhất là:

index_của_ký_tự_được_mã_hóa = 1 + (index_của_ký_tự_ban_đầu + 3 - 1) % 26

5 Likes

Vì đề bài yêu cầu chỉ nhập vào chữ thường nên bạn dùng hàm lấy mã ASCII của từng kí tự, tính toán với cái mã đó, rồi đổi kết quả vừa tính được thành kí tự để xuất ra.

Khoảng cách giữa kí tự plain với kí tự được mã hóa gọi là độ dời. Trong bài này thấy từ ‘h’ dịch lên 3 đơn vị thành ‘k’ thì độ dời là 3.

Gửi bạn cái demo để tham khảo.

1 Like

tks b :slight_smile:

tks b nhé :grinning:

1 Like

Khi mình nhập vào dấu cách thì nó ra chữ c . làm sao để xử lý vấn đề này vậy b?

public static void main(String[] args) {
    System.out.println("Enter your message: ");
    Scanner inp = new Scanner(System.in);
    final String alpha = " abcdefghijklmnopqrstuvwxyz"; 
    String str = inp.nextLine();   //the string user input           
    String ans = "";     //the encrypted output string
    int ind1; int ind2;  //the index of str and ans strings
    char x;              //the character followed by ind2 in ans string
    int i = 0;
    while (i < str.length()) {
        ind1 =alpha.indexOf(str.charAt(i)); //index of str with i variable 
        ind2 = 1+ (ind1 + 3-1)%26;              //using ind1 to count ind2
        i++;            
        x = alpha.charAt(ind2);             
        ans = ans +x;            
    }
           System.out.println(ans);
              
}

check nếu không phải là kí tự chữ cái thì k mã hóa và giải mã char đó thôi

1 Like

tks b nhé :grinning:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?