Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 替代加密_Java_Encryption - Fatal编程技术网

Java 替代加密

Java 替代加密,java,encryption,Java,Encryption,我正在尝试用java编写一个替换加密程序,但是我在创建代码时遇到了问题,我想知道您是否有什么建议。我的想法是将字母表转换成数字,然后将其与明文进行比较,然后生成一个新字符串发送回 这是我的代码: package ComputerSecurity; public class Substitution { String str = "abcdefghijklmnopqrstuvwxyz"; public String encrypt(int key, String plainT

我正在尝试用java编写一个替换加密程序,但是我在创建代码时遇到了问题,我想知道您是否有什么建议。我的想法是将字母表转换成数字,然后将其与明文进行比较,然后生成一个新字符串发送回

这是我的代码:

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个问题:

  • 您可以使用
    str
    。这将限制你可以使用的字母表。大写字母H和W以及两个单词之间的空格将给出相同的输出,因为它们不在
    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