Преобразование шифрования C ++ в Java

У меня есть следующий код C ++ для шифрования строки с помощью XOR.

#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;
}

Я видел в этот вопрос такой ява импл. будет ли это работать для этого случая?

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();

или есть более простой способ сделать это?

0

Решение

Нет — код Java будет XOR только до длины меньшей строки — в то время как код C ++ будет XOR полностью все данные.
Предполагая, что s1 — ваш «ключ», это можно исправить, изменив на

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

Также отсутствует кодировка возвращаемого значения в base-64.

1

Другие решения

не похож на меня. версия c ++ проходит по всем _data независимо от длины _key, циклически перемещаясь по _key по мере необходимости. (k=(++k<klen?k:0); в коде c ++)

Ваш возвращается, как только будет достигнут самый короткий ключ или данные.

Лично я бы начал с самого близкого буквального перевода C ++ в java, который вы можете сделать, сохраняя параметры и локальные имена одинаковыми.

Затем напишите для него модульные тесты с известными входами и выходами из C ++.

затем начните рефакторинг java-версии для использования java idioms / etc, гарантируя, что тесты все еще проходят

3

По вопросам рекламы [email protected]