0

我有以下 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;
}

我在这个问题中看到过这样的java impl。这对这种情况有用吗?

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

或者有更简单的方法吗?

4

2 回答 2

3

在我看来不一样。无论 _key 长度是多少,c++ 版本都会循环遍历所有 _data,并根据需要循环遍历 _key。(k=(++k<klen?k:0);在 C++ 代码中)

一旦击中最短的键或数据,您的就会返回。

就个人而言,我将从 C++ 到 Java 的最接近的字面翻译开始,保持参数和本地名称相同。

然后为它编写具有已知 C++ 输入和输出的单元测试

然后开始将 java 版本重构为使用 java idioms/etc 确保测试仍然通过。

于 2012-10-02T18:04:43.177 回答
1

不 - java 代码只会异或到较小字符串的长度 - 而 C++ 代码将完全异或整个数据。假设 s1 是您的“关键”,这可以通过更改为

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

也缺少返回值的 base-64 编码。

于 2012-10-02T18:03:19.390 回答