2012-10-02 6 views
0

XOR을 사용하여 문자열을 암호화하는 다음 C++ 코드가 있습니다.C++ 암호화를 Java로 변환

#define MPI_CIPHER_KEY "qwerty" 

Buffer FooClient::cipher_string(const Buffer& _landing_url) 
{ 
    String key(CIPHER_KEY); 
    Buffer key_buf(key.chars(), key.length()); 
    Buffer landing_url_cipher = FooClient::XOR(_url, key_buf); 

    Buffer b64_url_cipher; 
    base64_encode(landing_url_cipher, b64_url_cipher); 

    return b64_url_cipher; 
} 

Buffer FooClient::XOR(const Buffer& _data, const Buffer& _key) 
{ 
    Buffer retval(_data); 
    unsigned int klen=_key.length(); 
    unsigned int dlen=_data.length(); 
    unsigned int k=0; 
    unsigned int d=0; 

    for(;d<dlen;d++) 
    { 
     retval[d]=_data[d]^_key[k]; 
     k=(++k<klen?k:0); 
    } 

    return retval; 
} 

나는 그러한 자바 impl.을 this question에서 보았다. 이 사건에 효과가 있습니까?

String s1, s2; 

StringBuilder sb = new StringBuilder(); 
for(int i=0; i<s1.length() && i<s2.length();i++) 
    sb.append((char)(s1.charAt(i)^s2.charAt(i))); 
String result = sb.toString(); 

또는 더 쉬운 방법이 있습니까?

답변

1

아니요 - Java 코드는 작은 문자열의 길이까지 XOR됩니다. 반면 C++ 코드는 전체 데이터를 완전히 XOR합니다. 가정 S1이

for(int i=0; i<s2.length();i++) 
    sb.append((char)(s1.charAt(i%s1.length())^s2.charAt(i))); 

또한 반환 값의베이스 64 부호화 누락

변경하여 고정 할 수있는 "키"이다.

3

이 (가) 나에게 들쑥날쑥 해 보입니다. _key가 _key 길이에 관계없이 C++ 버전은 _data 전체에서 반복되고 필요에 따라 _key를 순환합니다. (k=(++k<klen?k:0);은 C++ 코드)

키나 데이터가 가장 짧게 나오면 곧 반환됩니다.

필자는 개인적으로 가장 가까운 리터럴 변환 인 C++에서부터 java 로의 변환부터 시작하여 param과 로컬 이름을 동일하게 유지합니다.

그때 그때 등/자바 숙어를 사용하여 테스트가 아직 전달 보장에 Java 버전 리팩토링 시작 C++

공지 입출력이 그것을위한 유닛 테스트 물품.

+0

네, 알겠습니다. 그래서 내가 사용할 수있는 도서관과 같은 쉬운 방법이 있는지 물었습니다. 감사. – DarthVader