Java 替代加密
我正在尝试用java编写一个替换加密程序,但是我在创建代码时遇到了问题,我想知道您是否有什么建议。我的想法是将字母表转换成数字,然后将其与明文进行比较,然后生成一个新字符串发送回 这是我的代码:Java 替代加密,java,encryption,Java,Encryption,我正在尝试用java编写一个替换加密程序,但是我在创建代码时遇到了问题,我想知道您是否有什么建议。我的想法是将字母表转换成数字,然后将其与明文进行比较,然后生成一个新字符串发送回 这是我的代码: package ComputerSecurity; public class Substitution { String str = "abcdefghijklmnopqrstuvwxyz"; public String encrypt(int key, String plainT
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();
}
}
软件包安全;
公共阶级替代{
String str=“abcdefghijklmnopqrstuvxyz”;
公共字符串加密(整数密钥、字符串明文){
StringBuilder temp=新的StringBuilder();
for(int i=0;i
key=3
但它是通过主方法发送的明文
是“hello world”我想你是在尝试实现凯撒密码
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的每个字符,可以跳过加密。如果这样做,还可以加密空格和其他非字母字符
返回“数字字符串”的想法的问题在于,您不知道一个字符数字的结尾和下一个字符数字的开头。因此,如果您想这样做,您必须添加分隔符,这会不必要地膨胀密文。有3个问题:
- 您可以使用
。这将限制你可以使用的字母表。大写字母H和W以及两个单词之间的空格将给出相同的输出,因为它们不在str
中str
- 此外,如果您尝试使用密钥>3加密xyz,那么最终将尝试在
中不存在的位置获取字符str
- 最后,如果在我们的输出中不使用分隔符,将很难区分像“ak”和“ka”这样的大小写,因为它们都将输出键为0的“111”
char
的int
值。您可以通过纯文本.charAt(i)
获得它对于“abc”,它将返回97、98和99,因为
a
的代码是97。如果减去96,则a
得到1,b
得到2,…您只需将您的密钥添加到它
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();
}
软件包安全;
公共阶级替代{
公共字符串加密(整数密钥、字符串明文){
StringBuilder temp=新的StringBuilder();
for(int i=0;i
加密(3,“你好世界”)
将输出-21,8,15,15,18,-61,26,18,21,15,7,
如果你想得到
11,8,15,15,18,-61,26,18,21,15,7,
把明文toLowerCase()
你到底有什么问题?“但是它是由主方法发送的”-什么?@runDOSrun,他的意思是主方法调用加密(3,“你好,世界”)
Hah。谢谢解密!是的,这就是我的意思。我将测试它。注意,这也是通过传递负“密钥”来解密的函数还要注意的是,凯撒密码是绝对不安全的。一个好的现代密码是AES。我知道我现在正在上一门计算机安全课程,我想做一个简单的加密,但我不擅长编程XD