如何更改我的加密代码,使其仅加密给定的字符串,而不加密以前加密的内容?

时间:2018-12-30 23:18:31

标签: java

我的代码对输入的句子中以前加密的短语进行加密。我希望它只对原始字符串中的字母v,m,g和b进行加密,而不对以前加密的字母进行加密(如果有任何意义)。因此,使用“非常好”这样的字符串,它将把字母v加密为正确的短语,但是随后会在该加密的短语中找到字母“ b”,然后进一步对其进行加密,这是我不想要的。显然,解密也不能正常工作,因为它需要特定的短语才能将其转换为正确的字母,但是不能解密,因为该短语的加密程度超出了应有的程度。

我试图更改先加密的字母的顺序,希望可以避免冲突,但这根本没有用。

加密类

public String encryptdSntnc;
public String decryptdSntnc;
public String sntnc;
public String encrypt(String sntnc)
{
    String encrypt1 = sntnc.replace("v", "ag',r");
    String encrypt2 = encrypt1.replace("V", "ag',r");
    String encrypt3 = encrypt2.replace("m", "ssad");
    String encrypt4 = encrypt3.replace("M", "ssad");
    String encrypt5 = encrypt4.replace("g", "jeb..w");
    String encrypt6 = encrypt5.replace("G", "jeb..w");
    String encrypt7 = encrypt6.replace("b", "dug>?/");
    encryptdSntnc = encrypt7.replace("B", "dug>?/");
    return encryptdSntnc;
}

public String decrypt(String encryptdSntnc)
{
    String decrypt1 = encryptdSntnc.replace("dug>?/", "B");
    String decrypt2 = decrypt1.replace("dug>?/", "b");
    String decrypt3 = decrypt2.replace("jeb..w", "G");
    String decrypt4 = decrypt3.replace("jeb..w", "g");
    String decrypt5 = decrypt4.replace("ssad", "M");
    String decrypt6 = decrypt5.replace("ssad", "m");
    String decrypt7 = decrypt6.replace("ag',r", "V");
    decryptdSntnc = decrypt7.replace("ag',r", "v");
    return decryptdSntnc;
}

测试器类

    Scanner kbReader = new Scanner(System.in);
    System.out.print("Enter a sentence that is to be encrypted: ");
    String sntnc = kbReader.nextLine();

    Crypto myCryptObj = new Crypto();
    String encryptdSntnc = myCryptObj.encrypt(sntnc);
    System.out.println("Encrypted sentence = " + encryptdSntnc);

    String decryptdSntnc = myCryptObj.decrypt(encryptdSntnc);
    System.out.println("Decrypted sentence = " + decryptdSntnc);

我期望的是,如果您键入“非常好”,则加密的句子将为“ ag”,解密后的句子将为“非常好”。

但是,相反,我使用“ ajedug>?/ .. w',rery jedug>?/ .. wood”进行加密,并使用“ ajeB..w',rery jeB..wood”进行解密,使用同样的“很好”。

1 个答案:

答案 0 :(得分:1)

您的加密方法不会满足您的要求。您希望修改影响原始字符串。但是,循序渐进的方法意味着您会有所不同。让我们只考虑前两个更改:

Very good

成为

ag',rery good

基于替换vV的第一对规则。

因此encrypt2具有此值,然后应用下一对规则将gG 替换为该值。这具有替换不是来自原始字符串而是由第一步添加的第一个g的效果。因此encrypt5的值是:

ajeb..w',rery good

您的加密将以这种方式继续进行,您会得到不想要的结果。

您可能想尝试在原始字符串上循环。像这样:

public String encrypt(String sntnc) {
    StringBuilder encryptdSntnc = new StringBuilder();
    for (char c : sntnc.toCharArray()) {
        c = Character.toLowerCase(c);
        switch (c) {
            case 'v' :
                encryptdSntnc.append("ag',r");
                break;
            case 'm' :
                encryptdSntnc.append("ssad");
                break;
            case 'g' :
                encryptdSntnc.append("jeb..w");
                break;
            case 'b' :
                encryptdSntnc.append("dug>?/");
                break;
            default :
                encryptdSntnc.append(c);
                break;
        }
    }
    return encryptdSntnc.toString();
}

由于您需要匹配字符串并将其替换为字符,因此解密将更加复杂。但是,使用循环的类似方法应该是可能的。除了搜索switch语句外,您还可以搜索每个可以用字符替换的字符串。