-2

Possible Duplicate:
How can I decrypt this encryption routine?

I have been on this program for a week now and I am so confused. I tried everything and anything but I didn't manage to make it work. I would really appreciate it if you could give me some help with my program. thank you.

I have the following code and I need to write the Decryption routine for it.

OChars = Original char -> is the word which the user types in.           
EKey = The Encryption Key (one letter)              
Length = The length of characters that the user needs to put             
EChars = Stores the Encrypted characters in so the decryption routine can use it to decrypt it.

    void encrypt_chars (int length, char EKey){
char temp_char;                 // original/encrypted char temporary store

for (int i = 0; i < length; i++){
    temp_char = OChars [i];     // get next char from original string
    __asm {                     // call the encrypt subroutine
        push   eax              // save register values on stack to be safe
        push   ecx
        movsx  ecx,temp_char    // enregister the source character
        movsx  eax,EKey         // and encryption key.
        call   encryptB         // calls the encryption subroutingencrypt the character
        mov    temp_char,al     // only need lower byte of EAX to return encrypted char
        pop    ecx              // restore original register values from stack
        pop    eax
    }
    EChars [i] = temp_char;     // Store encrypted char in the encrypted chars array
   }
     return;

encryption routine ASM          

     __asm {

encryptB: push edx          //saves register value edx on stack
          push ecx          //saves register value ecx on stack
          not  eax          //
          add  eax,0x04     //add 4 to eax register
          mov  edx,eax      //move eax to edx
          pop  eax          //brings eax back to
          xor  eax,edx      //clear values to zero
          pop  edx          //bring edx back 
          rol  al,3         //three times.
          sub  al,0x02      //subtracts 2 from al
          ret 
}               
Here ends the encryption part            
The decryption routine will start as follows             

void decrypt_chars (int length, char EKey){
  char temp_char;                       

for (int i = 0; i < length; i++){
    temp_char = EChars [i];         
    __asm {                         


     }

      DChars [i] = temp_char;           
}
 return;

decryption routine ASM

__asm {


      }
4

3 に答える 3

3

文字「E」をキー「K」で暗号化してみて、ルーチンが各ステップで何を行っているかを確認してください。次に、それらの横にある各操作の元に戻すを右にしようとします。暗号化ルーチンの「元に戻す」を取得するには、元に戻す命令セットの順序を逆にします。

于 2012-08-06T11:30:03.493 に答える
1

命令ニーモニックを拡張するだけの無駄なコメントを、各ステップで操作される値の説明に置き換えることから始めることをお勧めします。何かのようなもの:

    push   eax              // avoid clobbering registers; just preamble
    push   ecx
    movsx  ecx,temp_char    // ecx = byte_to_encrypt
    movsx  eax,EKey         // eax = key
    ...
    push ecx                // Stack[0] = byte_to_encrypt
    ...
    pop eax                 // eax = byte_to_encrypt now...

等々。これで、疑似コードと、最終的には演算の数式を抽出するのは簡単になるはずです。これは簡単に元に戻すことができ、レジスタ間で値を無意味にシャッフルすることなく (必要に応じてアセンブリで) コードを戻すよりも簡単です。

于 2012-08-06T11:30:24.127 に答える
1

f(Key)where is some 関数との XOR であるため、構成するものを除いfてすべての計算を元に戻す必要があります。通常どおりに実行する必要があります。f

だから、このようなもの:(テストされていません)

; eax = EKey, cl = char
decryptB:
  add ecx, 2   // undo sub 2
  ror cl, 3    // undo rol
  not eax      // actually do not
  add eax, 4   // actually do add 4
  xor eax, ecx // undo xor
  ret
于 2012-08-06T13:31:27.157 に答える