2017-12-22 4 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++) 

에서 루프 문을 변경 한

경우 루프는 모든 값을 반복합니다. e0length-1. 즉, 문자 배열을 반복합니다 (길이는 크기라고 가정).

두 번째 경우에는 i < length을 테스트 중이지만 각 루프 반복에서 i--을 수행하므로 예측할 수없는 동작이 발생합니다. 자세한 정보보기 here.

+0

실제로는 예측할 수 없습니다. [부호가있는 오버플로는 C++에서 정의되지 않은 동작이므로] (http://blog.llvm.org/2011/05/what-multi.htm)에서 '정의 된 동작이 아니므로'MSVC가 실제로이 코드에 대해 수행하는 작업을 확인하지 않는 한 'i - every-c-programmer-should-know.html) 컴파일러는 함수 엔트리에'length> 0 '이 있으면 필연적으로 컴파일 타임에 알 수 있으며, 불법적 인 명령을 내릴 수 있으므로이 함수가 실행되면 오류가 발생합니다. 'length'가 비 양수 여야한다고 가정하는 코드를 생성 할 수 있으므로 루프가 0 번 실행됩니다. 즉 UB는 범위 한도를 의미합니다 –

+0

계몽 주셔서 감사합니다, 나는 내 게시물을 수정합니다 –