Java jni中的ASCII到十六进制转换获取错误值

Java jni中的ASCII到十六进制转换获取错误值,java,c,encryption,java-native-interface,character-encoding,encoding,Java,C,Encryption,Java Native Interface,Character Encoding,Encoding,我想我之前的问题不在桥上,所以我试图解释我到底想要什么。 “试图从java加密数据并在arduino(c)和viceversa解密 我在java中尝试了许多3des+ecb加密。我得到了不同的答案,针对不同的代码。因此,最后,我决定使用c代码作为java库,使用jni和iam获得正确的答案。因此在arduino端,我也可以使用相同的“c”代码 现在让我来谈谈这一点: 我使用jni(netbeans)将纯文本从java发送到“C”,在那里我加密数据,然后“我将从C接收加密数据”(prob)。然后我

我想我之前的问题不在桥上,所以我试图解释我到底想要什么。 “试图从java加密数据并在arduino(c)和viceversa解密

我在java中尝试了许多3des+ecb加密。我得到了不同的答案,针对不同的代码。因此,最后,我决定使用c代码作为java库,使用jni和iam获得正确的答案。因此在arduino端,我也可以使用相同的“c”代码

现在让我来谈谈这一点:

我使用jni(netbeans)将纯文本从java发送到“C”,在那里我加密数据,然后“我将从C接收加密数据”(prob)。然后我将数据发送到arduino。使用C代码解密密文。然后使用C加密从arduino发送一些加密数据,然后在另一端(应用程序)我将解密并使用它

我认为这是清楚的

问题: 我不知道如何从c接收正确的密文

unsigned  char *enc_data_return=(char*)malloc(100);
enc_data_return=tdes_encrypt(32, plain_text, encrypted_text);("tdes_encrypt is the method iam using to encrypt i think that code is not needed here if u want i will send late")
当我打印指针值时,我得到了加密数据的十六进制正确值(我使用3des在线工具检查)

printf(“%2x”,*(enc_data_return+30))

TDES密文块0: 39 39 85 e3 7 9a e4 eb
TDES密文块1: ca 68 61 8f 31 b6 a5 b
TDES密文块2: 7c ce 23 34 f4 d7 6f 86
TDES密文块3: c1 9f c5 8b a0 c3 d7 82

在十六进制中,iam获取加密数据的精确值,但当我转换为jstring时,iam获取 99|Î#4ô×oŋ195ׂ 但期望值是 99|Î#4ô×oÁÃ× Iam使用以下代码获取jstring。 jstringjstrbuf=(*env)->NewStringUTF(env,enc_data_return)

我也尝试了bte阵列 jbyterarray=(*env)->NewByteArray(env,l); (env)->SetByteArrayRegion(env,array,0,l,(jbyte)(enc_data_return))

面对同样的问题

我不知道如何获得加密数据,请帮助我。这些加密数据是非ascii或扩展ascii。因此,c端和java端的所有转换器都给出了错误的值。因此,我可以直接将十六进制值从c端发送到java。“不可能”,但如果是,请告诉我是否没有,请给我一个解决方案


请帮帮我。

3DES的明文输入和密文输入是二进制的。因此,创建一个可以处理字节而不是字符的库非常重要。要对字符串进行编码,您应该首先对文本执行编码,创建一个等效的二进制(字节数组)。UTF-8可能是首选

最好在Java中执行此操作,无需在C中执行此操作(无论如何,在您这边):

我们应该做到这一点

现在,如果要将密文作为字符串发送,则需要对字节执行操作。最好使用base 64,同样在Java中:

Base64.getEncoder().encode(ciphertext);
因此,在接收时,您首先对基64进行解码,然后解密密文,并通过解码UTF-8字符将其转换回字符串,也就是说,上述过程与此相反


如果编码不正确,可能会在传输过程中丢失数据。例如,控制字符可能会从密文中筛选出来,未知字符可能会被删除或转换为替换字符

除非您确定您的输入是ASCII码,否则直接使用字符串作为字节时可能会发生同样的情况。如果您使用的字符高于126(保留127),您可能会遇到麻烦


这可能是您当前的问题。

3DES的纯文本输入和密文输入是二进制的。因此,创建一个可以在字节而不是字符上工作的库非常重要。要对字符串进行编码,您应该首先在文本上执行,创建一个等效的二进制(字节数组)。UTF-8可能是首选

最好在Java中执行此操作,无需在C中执行此操作(无论如何,在您这边):

我们应该做到这一点

现在,如果要将密文作为字符串发送,则需要对字节执行操作。最好使用base 64,同样在Java中:

Base64.getEncoder().encode(ciphertext);
因此,在接收时,您首先对基64进行解码,然后解密密文,并通过解码UTF-8字符将其转换回字符串,也就是说,上述过程与此相反


如果编码不正确,可能会在传输过程中丢失数据。例如,控制字符可能会从密文中筛选出来,未知字符可能会被删除或转换为替换字符

除非您确定您的输入是ASCII码,否则直接使用字符串作为字节时可能会发生同样的情况。如果您使用的字符高于126(保留127),您可能会遇到麻烦


这可能是您当前的问题。

最后我找到了问题的答案,我发布了答案,因为这可能会对其他人有所帮助。从char*到jstring或jbyteraray的转换为加密数据给出了错误的答案。因此最好采用这些值的十六进制值。我这样做意味着我只是转换为jintarray,并通过了加密数组数据我收到了正确的答案。

最后我在发布答案时找到了问题的答案,因为这可能会对其他人有所帮助。从char*到jstring或jbyteraray的转换为加密数据给出了错误的答案。所以最好是采用这些值的十六进制值。我所做的就是转换为jintaray并通过了加密数据数组ata我收到了正确的答案。

如果您只需要3DES,请使用集成在Java中的3DES密码。为什么您会认为加密数据可以表示为
字符串
?我的要求是我必须用Java加密/解密数据,我的朋友将用c解密/加密。因此,首先,正如您所说的,我引用了这么多代码来进行3DES+ecb加密,而有这么多的程序给了我一个不同的加密数据。所以我最终决定使用jni。至少我需要从c获取加密数据的十六进制值。我目前正在将加密数据存储在指针中。如何将这些值传递给java,有什么想法吗39 39 85 e3 7 9a e4 eb这些是我的加密