创建替代密码以将一串普通字母表映射到一串混乱字母表以加密消息的最佳方法是什么?

问题描述

public static String EncodeString() { 
    String plaintext = "Hello Jon";
    String alphabet = "abcdefghijklmnopqrstuvwxyz";
    String Substituion = "zyxwvutsrqponmlkjihgfedcba";
    
    for(int i=0; i<plaintext.length(); i++){
        for(int j=0; j<alphabet.length(); j++){
            if(plaintext[i]==alphabet[j]) {
                //not sure what to do here because the code above is giving an error
            }
            
        }

    }

例如“abcdefghijklmnopqrstuvwxyz”是普通字母,混杂字母是“zyxwutsrqponmlkjihgfedcba”,字符串消息是“Hi Jon”。所以消息应该按照乱码加密,但是字母可以由用户输入,这意味着每次都会不同。

我知道我可以使用数组、for 循环或哈希图,但哪个最有效?

以上是我目前正在尝试的代码,但我有点卡住了,我知道我做错了什么但不确定是什么。它也应该返回一个加密的纯文本但加密的字符串,我还没有添加

解决方法

您的代码出现错误,因为您试图将 plaintextalpabet 用作数组,但它们不是数组。所以 plaintext[int] 不能工作。相反,我会使用 String.charAt(int)。这允许您在不使用数组的情况下检查两个 字符 是否相等。我认为,通过用户可以更改混乱的字母表,这更容易。代码将是:

public static String EncodeString() { 
    String plaintext = "Hello Jon";
    String alphabet = "abcdefghijklmnopqrstuvwxyz "; //space added
    String substitution = "zyxwvutsrqponmlkjihgfedcba ";
    String encrypted_message = "";

for(int i=0; i<plaintext.length(); i++){
    for(int j=0; j<alphabet.length(); j++){
        if(plaintext.charAt(i)==alphabet.charAt(j)) {
            encrypted_message += Substitution.charAt(j); //This adds the right character of the jumbled aplhabet to the encrypted message
        }
        }
    }
    return encrypted_message; //returns the encrypted message
}

现在,您应该知道该程序仅适用于从 a 到 z 的小写字母和空格。为避免这种情况,您可以将所有大写字符添加到两个字母表中,或使用 .toLowerCase()

,

这里没有必要重新发明轮子。只需使用 java.util.Base64 类。虽然不是过于安全,但它在安全性方面仍然比您尝试使用的要好得多,而且......更容易编码和使用:

public class MyClass {

    public static void main(String[] args) {  
        String message = "\nWhat is your name?\nYour Address?\nYour Phone Number?";  
        System.out.println("Original Message: --> " + message);
        String encodedMessage = encode(message);
        System.out.println("Encoded Message:  --> " + encodedMessage);
        System.out.println("Decoded Message:  --> " + decode(encodedMessage));   
    }

    public static String encode(String inputString) {
        // Getting MIME encoder 
        java.util.Base64.Encoder encoder = java.util.Base64.getMimeEncoder();  
        // Encode supplied String and return.
        return encoder.encodeToString(inputString.getBytes());  
    }
    
    public static String decode(String encodedString) {
        // Getting MIME Decoder 
        java.util.Base64.Decoder decoder = java.util.Base64.getMimeDecoder();  
        // Decode supplied Encoded String and return.
        return new String(decoder.decode(encodedString));  
    }

}

控制台输出将是:

Original Message: --> 
What is your name?
Your Address?
Your Phone Number?
Encoded Message:  --> CldoYXQgaXMgeW91ciBuYW1lPwpZb3VyIEFkZHJlc3M/CllvdXIgUGhvbmUgTnVtYmVyPw==
Decoded Message:  --> 
What is your name?
Your Address?
Your Phone Number?