2017-12-22 32 views
-7
void encrypt_chars(int length) 
{ 
    char temp_char;     

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

     __asm {       
      push eax     
      push ecx     

      movzx ecx, temp_char  
      call encrypt_nn   
      mov temp_char, al   

      pop ecx     
      pop eax     
     } 
     EChars[i] = temp_char;   
    } 
    return; 


    __asm { 

    encrypt_nn: 
     mov eax, ecx   
      inc eax 
      ret 
    } 

暗号化部は結構ですが、私は解読にコードをコピーして貼り付けるだろうと思ったし、代わりにそれが戻ってデータを復号なるように、私は、値をデクリメントうインクリメントのC++の暗号化と復号化


//--------------------------------------------------------------------------------------------------------------- 
//----------------- DECRYPTION ROUTINES ------------------------------------------------------------------------- 
// 
void decrypt_chars(int length) 
{ 
    char temp_char;      

    for (int i = 0; i < length; i--) 
    { 
     temp_char = OChars[i]; 

     __asm {      
      push eax     
      push ecx     

      movzx ecx, temp_char  
      call encrypt_nn   
      mov temp_char, al   

      pop ecx     
      pop eax    
     } 
     EChars[i] = temp_char;  
    } 
    return; 
} 
+3

これはアセンブリ言語ではなく、C++ –

+6

あなたの質問がありますか? –

+0

基本的には、配列から文字を取り出し、1だけインクリメントし、最後の半分を配列に戻します。それは非常に優れた暗号化ではありません。基本的にあなたはecxをdecしなければならないだろうし、あなたはチャーバックを持っていただろう[編集:これは "cesarの暗号化"ではない?] – clockw0rk

答えて

3

回答:

あなたの暗号化操作の逆を行うために、あなたはencrypt_nnへの呼び出しを置き換える必要があります代わりに増分のデクリメント新しいルーチンを持つ:

__asm { 

    decrypt_nn: 
     mov eax, ecx   
      dec eax 
      ret 
    } 

コメント:あなたが最初に

for (int i = 0; i < length; i--) 

for (int i = 0; i < length; i++) 

からループ文を変更した

大文字小文字を区別すると、ループはすべての値を繰り返しますe0およびlength-1。これは、charの配列を繰り返し処理することを意味します(長さはそのサイズです)。

i < lengthをテストしていて、ループの繰り返しごとにi--を実行しているため、2番目のケースでは予測できない動作が発生します。 詳細については、hereを参照してください。

+0

実際には予測できません[C++での署名されたオーバーフローの定義されていない動作](http://blog.llvm.org/2011/05/what-label/)は、MSVCの実際の動作をチェックしていない限り、正確に 'i - every-c-programmer-should-know.html)コンパイラは、コンパイル時に、関数の入力時に 'length> 0'を指定しなければならないことに気付くでしょう。 'length'が非正でなければならないというコードを出すことができるので、ループはゼロ回実行されます。すなわち、UBは範囲の制限を意味します。 –

+0

啓発のおかげで、私は私のポストを修正します –