0

我目前正在尝试以稳固的方式偏移字节以实现简单的凯撒密码解密。但是,我无法弄清楚如何做到这一点。这是我当前的代码,它在 Remix 中给出了一些编译器错误:

function decrypt(bytes32 data, int key) public returns (bool) {
    bytes32 decryptedData = data;    // `data` here is the encrypted data
    // decryption
    for (int i = 0; i < decryptedData.length; i++) {
        decryptedData[i] = (decryptedData[i] - key) % 256;
    }
    // returns if sha256(decryptedData) matches some value
}

但是,这给了我以下错误:

TypeError: Expression has to be an lvalue.
            decryptedData[i] = (decryptedData[i] - key) % 256;
            ^--------------^

TypeError: Operator - not compatible with types bytes1 and int256
           decryptedData[i] = (decryptedData[i] - key) % 256;
                               ^--------------------^

TypeError: Operator % not compatible with types bytes1 and int_const 256
           decryptedData[i] = (decryptedData[i] - key) % 256;
                              ^----------------------------^

谢谢!

4

1 回答 1

0

就像 Damian Green 所说,我对您尝试编写的算法有点困惑,但下面的合同将解密凯撒加密文本。您应该能够根据需要对其进行修改。(请原谅 ASCII 值的懒惰硬编码)。

请注意,您不能使用bytes32它,因为它在 Solidity 中被视为特殊数组并且是只读的。请参阅http://solidity.readthedocs.io/en/develop/types.html#fixed-size-byte-arrays的“索引访问”部分

pragma solidity ^0.4.17;

contract CaesarDecryption {
  function decrypt(bytes data, int key) pure public returns (bytes) {
      bytes memory decryptedData = data;

      for (uint i = 0; i < decryptedData.length; i++) {
          decryptedData[i] = decryptByte(decryptedData[i], key);
      }

      return decryptedData;
  }

  function decryptByte(byte b, int k) pure internal returns (byte) {
      uint8 ascii = uint8(b);
      uint8 asciiShift;

      if (ascii >= 65 && ascii <= 90)
        asciiShift = 65;
      else if (ascii >= 97 && ascii <=122)
        asciiShift = 97;

      return byte(((ascii - asciiShift - k + 26) % 26) + asciiShift);
  }
}
于 2017-12-22T21:26:30.203 回答