Java 到 c++ 异或加密失败

Java to c++ xor encryption failed

本文关键字:加密 失败 c++ Java      更新时间:2023-10-16

今天,我尝试将异或加密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"((;

测试2nd:

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

有人可以帮助我吗?

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

在 Java 中,您正在使用 2 字节 UTF-16 编码字符。在C++中,您使用的是 1 字节字符,但它们实际上是多字节 UTF-8 编码的。(另请参阅 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,因为字符串函数会将所有字节解析为他们认为字符串具有的任何编码的字符,从而使您的代码充其量是中断,或者在最坏的情况下引入严重的安全问题。请改用原始二进制数据数组。