我的代码对输入的句子中以前加密的短语进行加密。我希望它只对原始字符串中的字母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”进行解密,使用同样的“很好”。
答案 0 :(得分:1)
您的加密方法不会满足您的要求。您希望修改影响原始字符串。但是,循序渐进的方法意味着您会有所不同。让我们只考虑前两个更改:
Very good
成为
ag',rery good
基于替换v
或V
的第一对规则。
因此encrypt2
具有此值,然后应用下一对规则将g
或G
替换为该值。这具有替换不是来自原始字符串而是由第一步添加的第一个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
语句外,您还可以搜索每个可以用字符替换的字符串。