Java 到 c++ 异或加密失败
Java to c++ xor encryption failed
今天,我尝试将异或加密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"((;
有人可以帮助我吗?
- Java和C++是不同的语言。 Java 中的
char
和C++中的char
是两种不同的类型。
在 Java 中,您正在使用 2 字节 UTF-16 编码字符。在C++中,您使用的是 1 字节字符,但它们实际上是多字节 UTF-8 编码的。(另请参阅 GetStringUTFChars 的文档。必须确保使用相同的二进制数据。
-
int i = static_cast<int>(strlen(strRemp) - 1)
这是未定义的行为,因为您没有正确 0 终止strRemp
。您应该改用in.size()
。 -
std::string in = env->GetStringUTFChars(inStr, NULL);
这会产生内存泄漏,因为std::string
构造函数从GetStringUTFChars
返回的 char* 数组中复制数据,但该数组本身永远不会被释放。 -
你不会在最后
delete[] strRemp
,另一个内存泄漏。 -
您不应该对此类二进制数据使用
strings
,因为字符串函数会将所有字节解析为他们认为字符串具有的任何编码的字符,从而使您的代码充其量是中断,或者在最坏的情况下引入严重的安全问题。请改用原始二进制数据数组。
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- AES加密到解密未正确输出
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- Java 到 c++ 异或加密失败
- openssl c++ 3DES文件加密解密失败
- RSA 加密然后解密失败,并显示"oaep decoding error"
- c++ openssl加密有时会失败