2012-10-06 2 views
1

게임에서 플레이어의 데이터를 암호화하고 암호 해독하는 매우 간단한 시저 알고리즘을 만들려고 노력 중입니다. 그러나 이상한 결과를 얻고 있습니다. 알고리즘의 작업은 간단합니다. ascii 테이블의 문자를 뒤로 이동합니다.C++ 간단한 시저 암호화 알고리즘

std::string Encrypt(std::string in,int key) 
{ 
    const char* chars=in.data(); 
    char* newchar=(char*)malloc(sizeof(char)*in.length()); 
    for(int c=0;c<in.length();c++) 
    { 
     newchar[c]=char(((int)chars[c])+key);//I suspect somewhere here is the problem 
    } 

    std::string out(newchar); 
    return out; 
} 

LOGI("encrypt:%s",Encrypt("hello",10).data()); 
LOGI("decrypt:%s",Encrypt(Encrypt("hello",10),-10).data()); 

출력 :

encrypt:[email protected] 
decrypt:hellok 

내가 암호화에 대해 잘 몰라요 내가 아스키 전체 문자 것은 C에서 작동하는 방법에 대해 덜 알고

+0

왜 게임의 텍스트 부분을 해독합니까? 그렇지 않은 경우 왜 기존의 라이브러리에서 최신 암호화 기술을 사용하지 않는 것이 아닙니까? 편지 대체 알고리즘은 오늘날의 어떤 보호에도 유용하지 않습니다. 지옥, 사람들은 재미있게 [신문에서] (http://en.wikipedia.org/wiki/Cryptogram) 그들을합니다. –

+0

'sizeof (char) == 1', 정의에 따라. – qdii

+0

당신은'newchar'을 해방해야합니다. 'out'은 문자열의 복사본을 만듭니다. – qdii

답변

4
std::string Encrypt(const std::string & in, int key) 
{ 
    std::string out(in); 
    for(int i=0; i < in.length(); ++i) 
    { 
     out[i] += key; 
    } 
    return out; 
} 
+0

이것은 완벽합니다. – SteveL

0

문제는 "추가이다 키 "를 a..z의 값으로 다시 설정하면 해당 범위로 되돌아 가지 않을 수 있습니다. 비슷한 것

if (chars[c] >= 'a' && chars[c] <='z') newchar[c] = 'a' + ((chars[c]-'a'+key)%26); 
else if (chars[c] >= 'A' && chars[c] <='Z') newchar[c] = 'A' + ((chars[c]-'A'+key)%26); 
else newchar[c] = chars[c]; 

약한 것을 사용하는 것이 좋을 것입니다. BTW, 반전 26 키를 사용하십시오.

-1

카이사르 암호를 만드는 법을 알고 싶다면 차갑게하십시오. 실제로 일부 데이터를 보호하려면이 작업을 수행하지 마십시오! 그것은 돼지 라틴보다 더 이상 암호화 방법이 아닙니다.

대신 사전에 작성된 암호화 라이브러리를 사용하십시오. 제대로하기까지 오랜 시간이 걸리기 때문에 직접 쓰지 마십시오. AES는 대부분의 경우에 빠르고 빠르며 거의 모든 프로그래밍 언어 용 라이브러리가 있습니다.