java - 将 C++ 加密转换为 Java

标签 java c++ encryption xor

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

相关文章:

c++ - 运行 FUSE c++ 代码时的奇怪行为

java - 为什么我的 Java while 循环首先进行两次传递?

java - 反转属性的最短方法

java - 如何通过忽略空格来分割字符串

c++ - 你能解释一下这个语法吗:ros::Rate loop_rate(10);

c++ - 从 glutMainLoop() 中调用函数

android.security.KeyStoreException -62

mysql - CF8和AES解密MySQL AES : encodings are not same

java - 理解 Play 2.4 依赖注入(inject)

javascript - 解密 - 加密 crypto-js