У меня есть следующий код 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();
или есть более простой способ сделать это?
Нет — код 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.
не похож на меня. версия c ++ проходит по всем _data независимо от длины _key, циклически перемещаясь по _key по мере необходимости. (k=(++k<klen?k:0);
в коде c ++)
Ваш возвращается, как только будет достигнут самый короткий ключ или данные.
Лично я бы начал с самого близкого буквального перевода C ++ в java, который вы можете сделать, сохраняя параметры и локальные имена одинаковыми.
Затем напишите для него модульные тесты с известными входами и выходами из C ++.
затем начните рефакторинг java-версии для использования java idioms / etc, гарантируя, что тесты все еще проходят