2

我正在尝试使用 java 方法解密密码加密,但是我的代码似乎没有正确返回。我试图扭转加密过程,但我看不出我做错了什么。抱歉,我希望这不是一个愚蠢的问题。

public void decrypt()
{
    String cipherText = this.message;
    String key = this.KEY;
    String alphabet = "abcdefghijklmnopqrstuvwxyz"; 
    int alphabetSize = alphabet.length();
    int textSize = cipherText.length();
    int keySize = key.length();
    StringBuilder decryptedText = new StringBuilder(textSize);

    for (int i = 0; i < textSize; i++)
    {
        char encyrptChar = cipherText.charAt(i); // get the current character to be shifted
        char keyChar = key.charAt(i % keySize); // use key again if the end is reached
        int plainPos = alphabet.indexOf(encyrptChar); // plain character's position in alphabet string
         // decrypt the input text
        int keyPos = alphabet.indexOf(keyChar); // key character's position in alphabet
        int shiftedPos = plainPos-keyPos;
        shiftedPos += alphabetSize;
        decryptedText.append(alphabet.charAt(shiftedPos));
    }

    this.message =  decryptedText.toString();
}
4

2 回答 2

0

采取了这些措施:

    char encyrptChar = cipherText.charAt(i); // get the current character to be shifted
    char keyChar = key.charAt(i % keySize); // use key again if the end is reached
    int plainPos = alphabet.indexOf(encyrptChar); // plain character's position in alphabet string

    int keyPos = alphabet.indexOf(keyChar); // key character's position in alphabet
            int shiftedPos = plainPos-keyPos;
            shiftedPos += alphabetSize;

有几个问题。

  1. plainPos实际上是一个加密值,不要混淆它们。
  2. plainPos-keyPos应该等于解密后的值。然后,您应该通过alphabetSize, 对其进行修改以获得正确的值。

处理命名约定时要小心。这真的会导致一些问题......

除此之外,我认为您的代码实际上工作正常。我当然看不出任何问题。通过在线加密器/解密器尝试一下。

于 2012-11-15T23:57:39.973 回答
0
shiftedPos += alphabetSize;

你为何这样做?我认为只有在 shiftPos<0 时才需要这样做。

if(shiftedPos<0)
   shiftedPos += alphabetSize;

这是因为如果 a=0 且 b=1,(ab)=-1 表示 z。要使用整个 ASCII 集,您只需以正确的顺序将 alpabeth 字符串和大小替换为所有 ASCII 字符。

于 2012-11-15T19:37:45.950 回答