我有以下 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;
}
我在this question看到过这样的java实现。这对这种情况有用吗?
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();
或者有更简单的方法吗?
最佳答案
我觉得不一样。 c++ 版本循环遍历所有 _data,无论 _key 长度是多少,根据需要循环遍历 _key。 (C++ 代码中的 k=(++k<klen?k:0);
)
一旦最短的键或数据被击中,您的返回。
就个人而言,我会从 C++ 到 java 的最接近字面翻译开始,保持参数和本地名称相同。
然后为其编写具有已知输入和输出的 C++ 单元测试
然后开始将 java 版本重构为使用 java 习语/等,确保测试仍然通过。
关于java - 将 C++ 加密转换为 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12695145/