2017-12-22 16 views
0

저는 현재 단순한 시저 암호 해독을 구현하기 위해 바이트 단위의 오프셋을 시도하고 있습니다. 그러나, 나는 이것을하는 방법을 알아낼 수 없습니다.바이트 단위로 정수 단위로 바이트를 오프셋하는 방법은 무엇입니까?

그러나
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; 
           ^----------------------------^ 

감사합니다 여기에 리믹스에 몇 가지 컴파일러 오류를 제공 내 현재 코드입니다!

+0

"색인 액세스"섹션을 참조하십시오. –

+0

오른쪽, 키는 함수 매개 변수의 int로 정의됩니다! 나는 그것에 대해 미안한 것을 업데이트 할 것이다. – aevumcessi

+0

따라서 제시된 알고리즘은 질문에서 제시된 것처럼 색인 개수만큼 바이트를 이동시키지 않으므로 시저 암호의 알고리즘이 아닙니다. –

답변

0

Damian Green이 말했듯이, 나는 당신이 작성하려고하는 알고리즘에 다소 혼란 스럽지만, 아래 계약은 Caesar 암호화 된 텍스트를 해독 할 것입니다. 필요에 맞게 수정할 수 있어야합니다. (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); 
    } 
}