jni中的ASCII到HEX转换得到错误的值

时间:2016-04-14 07:40:58

标签: java c encryption java-native-interface

我认为我之前提出的问题不在于pont.So Iam试图解释我到底想要什么。 “尝试从java加密数据并在arduino(c)解密,反之亦然

我在java中尝试过很多3des + ecb加密。对于不同的代码,我得到了不同的答案。最后,我决定使用c代码作为java的库使用jni和iam得到正确的答案。所以在arduino结束时我也可以使用相同的“C”代码

现在让我谈谈:

我使用jni(netbeans)从java发送plain_text到“C”,然后Iam加密数据,然后“我将从c接收加密数据”(prob)。然后我将数据发送到arduino.DECRYPT使用c代码的密文。然后使用c加密从arduino发送一些ENCRYPTed数据,然后在另一端(app)我将decypt并使用它。

我认为这很清楚。

问题: 我不知道如何从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 Ciphertext Block 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

在十六进制中我获得加密数据的确切值,但当我转换为jstring iam得到 99ãäëÊha1¶¥| I#40×O_N谩ׂ 但期望值是  99ãäëÊha1¶¥|Î#4ô×oÁÅ×  我使用下面的代码来获取jstring。  jstring jstrBuf =(* env) - > NewStringUTF(env,enc_data_return);

我也尝试过使用bte数组   jbyteArray array =(* env) - > NewByteArray(env,l);     ( env) - > SetByteArrayRegion(env,array,0,l,(jbyte )(enc_data_return));

面临同样的问题

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

请帮帮我。

2 个答案:

答案 0 :(得分:2)

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

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

"plaintext".toBytes(StandardCharsets.UTF_8);

应该这样做。

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

Base64.getEncoder().encode(ciphertext);

收到后,你首先解码基数64,然后解密密文并通过解码UTF-8字符将其转换回字符串,即反向上述过程。

如果编码不正确,可能会丢失传输中的数据。例如,可以从密文中过滤​​掉控制字符,可以删除未知字符或将其转换为替换字符。

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

这可能是你目前的问题。

答案 1 :(得分:0)

最后我发现我的问题的答案我发帖回答因为它可能对其他人有所帮助。从char *到jstring或jbytearray的转换给出了加密数据的错误答案。所以最好采取thoose值的十六进制值。我做了什么意味着我刚刚转换为jintarray并通过了加密数据的中心,我收到了正确答案。