Java 到 C++ 异或加密失败

标签 java c++

今天,我尝试将 xor 加密 java 代码转换为 C++,但无法正常工作并且输出错误,也许我错了, java代码:

public static String encryptDecryptStr(String str) {

    String key = "ABCDEF";

    final int l0 = key.length() - 1;
    int l1 = key.length() - 1;

    final char[] strRemp = new char[str.length()];
    char opcode = 85;;

    for (int i = strRemp.length - 1; i >= 0; i--) {
        strRemp[i] = (char) (str.charAt(i) ^ opcode ^ key.charAt(l1));
        opcode = (char) ((char) (opcode ^ i ^ key.charAt(l1)) & 63);
        --l1;
        if (l1 < 0) l1 = l0;
    }

    return new String(strRemp);}

我尝试 C++ 代码:

JNIEXPORT jstring JNICALL Java_com_test_app_Utils_encryptDecryptStr(JNIEnv *env, jobject, jstring inStr){

std::string in = env->GetStringUTFChars(inStr, NULL);
std::string key = "ABCDEF";

int l0 = static_cast<int>(key.size() - 1);
int l1 = static_cast<int>(key.size() - 1);

char *strRemp = new char[in.size()];
char opcode = 85;

for (int i = static_cast<int>(strlen(strRemp) - 1); i >= 0; i--) {
    strRemp[i] = in[i] ^ opcode ^ key[l1];
    opcode = static_cast<char >(static_cast<char >(opcode ^ i ^ key[l1]) & 63);
    --l1;
    if (l1 < 0) l1 = l0;
}

return (jstring)env->NewStringUTF(strRemp);}

我测试:

com.test.app.Utils.encryptDecryptStr(encryptDecryptStr("Hello World"));

第二个测试:

encryptDecryptStr(com.test.app.Utils.encryptDecryptStr("Hello World"));

有人可以帮助我吗?

最佳答案

  1. Java 和 C++ 是不同的语言。 char在 Java 和 char在 C++ 中是两种不同的类型。

在 Java 中,您使用的是 2 字节的 UTF-16 编码字符。在 C++ 中,您使用的是 1 字节字符,但它们实际上是多字节 UTF-8 编码的。 (另请参阅 docs for GetStringUTFChars。)您必须确保您使用的是相同的二进制数据。

  1. int i = static_cast<int>(strlen(strRemp) - 1)这是未定义的行为,因为您没有正确地以 0 终止 strRemp .你应该使用 in.size()相反。

  2. std::string in = env->GetStringUTFChars(inStr, NULL);这会造成内存泄漏,因为 std::string构造函数从 GetStringUTFChars 返回的 char* 数组中复制数据,但该数组本身永远不会被释放。

  3. 你没有delete[] strRemp最后,另一个内存泄漏。

  4. 你不应该使用 strings对于此类二进制数据,字符串函数会将所有字节解析为他们认为字符串具有的任何编码中的字符,从而使您的代码在最好的情况下中断或在最坏的情况下引入严重的安全问题。改为使用原始二进制数据数组。

关于Java 到 C++ 异或加密失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52136705/

相关文章:

java - EOF 同时寻找匹配 `"' 错误

C++ boost : loading large (4 GB) files in chunks

c++ - 是否可以有一个变量,该变量是对具有不同类标识符的模板类的引用?

java - 如何在swt中等待另一个shell关闭一个shell?

java - 随机数之和

java - 拆分 Excel 内容并在控制台中显示忽略空白单元格

c++ - 奇怪的数字转换 C++

c++ - 从 MSVC 项目生成 CMAKE?

c++ - 通过Qt widget打开它时是否可能有一个文件 'pop-up'?

多进程fitnesse测试环境中的Java OOM