我试图在java中创建替换加密程序,但是我在创建代码时遇到了问题,我想知道您是否有任何提示。我的想法是将字母表转换为数字,然后将其与plainText进行比较,然后创建一个新的字符串以便发回。
这是我的代码:
package ComputerSecurity;
public class Substitution {
String str = "abcdefghijklmnopqrstuvwxyz";
public String encrypt(int key, String plainText){
StringBuilder temp = new StringBuilder();
for(int i=0; i< plainText.length(); i++){
int position = plainText.charAt(i);
temp.append(str.charAt(plainText.indexOf(position)+key));
}
return temp.toString();
}
}
key=3
但主要方法plainText
发送的是&#34; hello world&#34;。
答案 0 :(得分:1)
我认为您尝试实施凯撒密码。
plainText.charAt(i)
返回实际的当前字符,而不是位置。您可以使用该字符查找字母表中的位置:
char c = plainText.charAt(i)
int aPos = str.indexOf(c);
然后你可以移动这个位置并获得加密的字母,但你需要环绕。这通常通过模运算完成:
int encPos = aPos;
if (key >= 0) {
encPos = (aPos + key) % str.length();
} else {
// the key may be bigger than the alphabet length
encPos = (str.length() + ((key + aPos) % str.length())) % str.length();
}
char ec = str.indexOf(encPos);
对于aPos
为-1的每个字符,您可以跳过加密。如果这样做,那么您还可以加密空格和其他非字母字符。
您想要返回“数字字符串”的问题是您不知道一个字符编号的结束位置以及下一个字符编号的开始位置。所以,如果你想要,你必须添加分隔符,这会不必要地增加你的密文。
答案 1 :(得分:1)
有3个问题:
str
。它将限制您可以使用的字母表。在您的情况下,大写字母H和W以及2字之间的空格将提供相同的输出,因为它们不在str
中。str
中不存在的位置设置字符。我的建议是使用int
的{{1}}值。你可以使用char
获得它
对于&#34; abc&#34;它会返回97,98和99,因为plainText.charAt(i)
的代码是97.如果你减去96,你a
得1,a
得2 ......登记/>
您只需要将密钥添加到其中即可。
b
package ComputerSecurity;
public class Substitution {
public String encrypt(int key, String plainText){
StringBuilder temp = new StringBuilder();
for(int i=0; i< plainText.length(); i++){
int val = plainText.charAt(i) - 96;
temp.append((val+key) + ";");
}
return temp.toString();
}
将输出encrypt(3, "Hello World")
如果您想让-21,8,15,15,18,-61,26,18,21,15,7,
放置plainText 11,8,15,15,18,-61,26,18,21,15,7,
。