查找字符的奇数和偶数索引值时遇到问题

Trouble with finding odd and even index values for characters

我正在创建简单的 encryption/decryption 软件作为一个有趣的项目。我能够加密。它给了我加密的密码和密钥。我遇到的问题是解密。例如,这是一条加密消息:eUwG:Q_vul=u^CMiojpnif,这里是密钥:103141109141719141119050117050318040907010912。它的工作方式是首先在消息的开头或结尾添加一个随机盐,该盐由密钥中的第一个数字。因此,由于第一个数字是 1,因此 salt 位于开头(salt 有 14 个字符长),因此它删除了该文本,留下了 Miojpnif。在盐号后面的键中,文本中每个字母有 2 个数字。这就是我被困的地方。数字 1 表示字符向前移动,0 表示向后移动。因此,对于该字符的键中的 'M',它是 0,所以它向后移动,下一个数字是 3,这意味着它向后移动了 3。所以要反转这个,我需要将该字符向前移动 3。问题是,我不知道如何使它正常工作。我的想法是,它从键中删除第一个数字(盐),然后如果数字是奇数,那么它会记录该字符是向前还是向后,如果是偶数则它将向前或向后移动该字符(与其他数字一样存储为 int)按该数字。所以我卡住的地方是弄清楚它是偶数还是奇数不能正常工作,我不太清楚如何移动那个角色。

我已经查过如何判断它是偶数还是奇数,但它仍然不起作用。实际上改变了我自己编写代码的角色。我不知道你们是否明白我需要什么帮助,因为我真的不知道如何用语言表达。所以这是我的代码,希望大家能帮忙。

for(int i= 0; i < keyNew.length(); i++){
    if(i % 2 == 1){
        /*odd*/
        if(keyNew.charAt(i) == '1') {
        forward = 1;
        backward = 0;
        } else {
        forward = 0;
        backward = 1;
        }
    }else{
        /*even*/
    if(forward == 1 && backward == 0) {
        /*forward*/
        System.out.println("forward");
        String encryptedNewer = encryptedNew.charAt(i / 2) += keyNew.charAt(i);
    } else if(forward == 0 && backward == 1) {
        *backward*/
        System.out.println("backward");
        String encryptedNewer = encryptedNew.charAt(i / 2) += keyNew.charAt(i);
    }
     }
}

encrypted 是密文,key 是密钥,encryptedNew 是没有加盐的文本,keyNew 是没有第一位数字的密钥。

这是长方法味道的一个很好的例子。我推荐以下内容:

  • 使用 String 并使用 substring(...) 函数。它更容易,因为您需要更少的变量并且不必从 char 转换为 int 并返回。
  • 创建一个函数 encrypt(...) 和 decrypt(...) 调用一些 "subfunctions"
  • 一个子函数是 addSalt(...) 和 removeSalt(...)
  • 一个子函数是 splitKeyToPairs(...),它 returns 一个字符串列表,每个项目有 2 位数字。
  • 一个子函数是 shiftForward(...) 和 shiftBackwards(...)

那么我会按如下方式实现它:

public String decrypt(String key, String cipher) {
       String cipherModified = removeSalt(key, cipher);
       List<String> keyPairs = splitKeyToPairs(key.substring(1, key.length()));
       String message = "";
       for(int position = 0; position < keyPairs.size();++position) {
         String keyTmp = keyPairs.get(position);
         String cipherLetter = cipherModified.substring(position, position + 1);
         message += "0".equals(keyTmp.substring(0, 1)) ? shiftBackwards(cipherLetter, keyTmp.substring(1, 2)) : shiftForward(cipherLetter, keyTmp.substring(1, 2));
       }

       return message;  
    }

    public List<String> splitKeyToPairs(String key) {
      List<String> result = new ArrayList<String>();
      for(int i = 0; i < key.length(); i += 2) {
        //i += 2 because we jump 2 characters per iteration.
        result.add(key.substring(i, i+2));
      }

      return result;
    }

这里有一个用于拆分但不用于解密的小测试函数:

    public static void main(String[] args) {
        List<String> result = splitKeyToPairs("1234567890");
        List<String> test = new ArrayList<>(Arrays.asList("12", "34", "56", "78", "90"));

        for(int i = 0; i < result.size();++i) {
            if(!result.get(i).equals(test.get(i))) {
                System.out.println("error on position " + i);
            }
        }
    }

好的,这是解密消息的另一种方法。建立方法并将它们藏在图书馆中是可取的。在下面的示例中,我省略了密钥中的加盐数字。适应这一点的逻辑是微不足道的。

      String key = "03141109141719141119050117050318040907010912";
      String code = "eUwG:Q_vul=u^CMiojpnif";
      int i = 0;
      StringBuilder sb = new StringBuilder();
      for (int pos = 0; pos < code.length(); pos++) {
         // get codeLetter
         char codeLetter = code.charAt(pos);
         // set direction
         int direction = key.charAt(i++) == '0' ? 1
               : -1;
         // set count
         int count = key.charAt(i++) - '0';
         // modify codeLetter based on direction and count
         char c = (char) (codeLetter + (count * direction));
         // save it.
         sb.append(c);
      }
      System.out.println(sb.toString().substring(14));