2

如果这里有人知道这些算法的含义,请帮助我理解,因为我不想在不知道它是如何工作的情况下简单地复制。

这是代码:

1:

    public static String encryptKey(String key){
    int ch = 0;

    StringBuilder encryptedKey = new StringBuilder();

    for(int i = 0; i < key.length(); i++ ){

        ch = key.charAt(i);

        ch = ~ch;

        encryptedKey.append(ch);
    }

    return encryptedKey.toString();
    }

2:

    public String encrypt(String message, String key){

    StringBuilder encryptedMessage = new StringBuilder();
    char ch;
    int j = 0;

    for(int i = 0; i < message.length(); i++, j++ ){

        if(j >= key.length()){
            j = 0;
        }

        ch = message.charAt(i);

        ch = (char) (key.charAt(j) ^ ch);

        encryptedMessage.append(ch);

    }

    return encryptedMessage.toString();
    }

再次感谢

4

1 回答 1

8

这是以可逆方式更改数据的两种简单且标准(并且完全不安全,但这是一种学习体验)的方法。

第一个用于ch = ~ch;切换字符中的所有位。因此,例如,aASCII 97 或二进制的字母01100001将变为10011110。这是可逆的,因为您可以对加密数据应用完全相同的操作来检索原始消息。

第二种稍微安全一些,并使用^(异或)运算符根据密钥更改每个字符中的位:将消息字符中的每个位与密钥字符中的相应位进行比较。如果位相同(两者0或两者都相同1),则加密位为0。如果位不同,则加密位为1. 这是可逆的,因为您可以^使用相同的密钥再次应用相同的操作来检索原始消息。

作为旁注,所有现代密码(例如 DES3 和 AES)都基于异或运算,并结合以指定方式“混合”位的算法,因此猜测密钥要困难得多。可以通过反向运行算法或通过采用数学上等效的计算捷径来解密密文。

警告和咆哮: 这显然是功课,你已经承认你和你的朋友都在通过抄袭别人的答案来作弊。尽管这可能很糟糕,但如果您无法解释它,情况会更糟,特别是因为我向您保证,所有其他曾经参加过该课程并复制答案的学生都会产生这两个相同的解决方案。更愚蠢的是,加密非常简单:这一切都归结为翻转位。

所以这里是密码学的本质:

  • 获取消息中的每个字符。
  • 根据您发明的某些规则,以某种方式修改角色。重要的是您必须能够反转此规则,例如,始终将第 3 位设置为1,将第 6 位设置为0将不起作用,因为您将不再知道它们最初是什么。但是交换第 3 位和第 6 位就可以了;您只需再次交换它们即可解密。
  • 将修改后的字符作为加密文本附加到您的输出中。
  • 重复直到你用完字符。

要解密,请遵循相同的算法,但颠倒您用于修改每个字符的任何规则。

Uibu't bmm uifsf jt up ju。hppe mvdl!

于 2012-05-15T02:14:25.820 回答