2016-04-14 2 views
0

私の前の質問はpontではなかったと思います。私は正確に何が欲しいか説明しようとしています。 "arduino(c)とviceversaでjavaとdecryptaからデータを暗号化しようとしていますASCIIからHEXへの変換が間違った値になっています

私は多くの3des + ecb暗号化をJavaで試しましたが、私は別のコードで別の答えを得ていました。また、私は同じ「C」コードを使用することができますArduinoの終わりにJNIとIAMなっ正しいanswer.soを使用してJavaのためのライブラリとしてCコードを使用する

今私はポイントに来てみましょう:。

私はjavaから "C"にjni(netbeans)を使ってplain_textを送信しています。データを暗号化して、 "cから暗号化されたデータを受け取ります"(prob)。次にデータをarduino.DECRYPTに送信します。 c code.Th暗号化を使用してarduinoからENCRYPTedデータを送信すると、もう一方の端(アプリ)で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") 

私は暗号化されたデータの進に正しい値を取得していますポインタ値(Iは、3DESのオンラインツールを使用してチェック)

のprintf( "%の2倍"、*(enc_data_return + 30))を印刷します。

TDES暗号文ブロック0: 39 39 85 E3 7 9aはE4 EB
TDES暗号文ブロック1:86 6F 7C CE 23 34 F4のD7: 68 61 8F 31 B6のA5のB
TDES暗号文ブロック2 CA
TDES暗号文ブロック3: C1 9F C5 8bはA0 C3 D7の六角IAMで82

は暗号化されたデータの正確な値を得ることが、私はJSTRINGに変換する際、IAMなっ 99ãäëÊha1¶¥|Î#40×o_ŋÃׂ が、期待値は 99ã jstring jstrBuf =(* env) - > NewStringUTF(env、enc_data_return);

私もbte配列で試しました jbyteArray array =(* env) - > NewByteArray(env、l);() - > SetByteArrayRegion(env、array、0、l、(jbyte)(enc_data_return));

同じ問題に直面し

私は私を助けてください、暗号化されたデータを取得する方法を知りません。これらの暗号化されたデータはASCII以外のASCII文字です。だから、すべてのコンバータをc endとjava endが間違った値を与えてしまいます.soは、私は直接c endからjavaに16進値を送ることができます。 "それは不可能なiguess"ですが、もし私に解決策を教えてくれれば教えてください。

私を助けてください。

+2

3DESが必要な場合は、Javaに統合された3DES暗号を使用します。 – Robert

+1

なぜ暗号化されたデータを 'String'として表現できると思いますか? –

+0

私の必要条件私はJavaでデータを暗号化/復号化する必要があります。私の友人は3des + ecb暗号化を行うために非常に多くのコードを参照してくれたので、最初にc.soで暗号化/復号化します。 data.so私は最終的にjniを使用することに決めました。 –

答えて

2

3DESのプレーンテキスト入力と暗号テキスト入力はバイナリです。したがって、文字ではなくバイトで動作するライブラリを作成することが重要です。文字列をエンコードするには、最初にをテキスト上で実行し、同等のバイナリ(バイト配列)を作成する必要があります。おそらくUTF-8が好まれるはずです。

"plaintext".toBytes(StandardCharsets.UTF_8); 

トリックを行う必要があります。

これは、Javaでこれを行うのがベストです、(とにかくあなたの側で)Cでこれを行う必要はありません。

ここで暗号文を文字列として送信する場合は、バイトにを実行する必要があります。再びJavaで、このためにベース64を使用することをお勧め:receival時

Base64.getEncoder().encode(ciphertext); 

をあなたはそれゆえ最初の暗号文を解読し、UTF-8文字をデコードして戻って文字列に変換し、その後、ベース64をデコードしたいです、すなわち上記プロセスを逆にする。


正しくエンコードしないと、転送中にデータが失われる可能性があります。たとえば、制御文字を暗号文から除外し、未知の文字を削除したり、置換文字に変換したりすることができます。

入力がASCIIであることが確実でない限り、文字列をバイトとして直接使用すると同じことが起こります。 126を超える文字を使用すると(127が予約されている)、問題が発生する可能性があります。

これは現在の問題です。

+0

返信いただきありがとうございます。返事を受け取れない場合は、私は再度確認します。 –

+0

あなたが言ったように私はネイティブからJavaへのバイトデータを送ろうとしました –

+0

私はあなたが言ったようにしようとしています。私はネイティブからJavaにcharデータを送ります。暗号化されたデータをポインタに格納しています。------> unsigned char * enc_data_return =(char *)malloc(100); ------> enc_data_return = tdes_encrypt(32、plain_text、encrypted_text); printf( "%2x"、*(enc_data_return + 31));私はすべての値を正確に16進数で、cで暗号化されたデータを印刷することができます。暗号化されたデータの最終値は16進数で8bです。 –

0

最後に私は他の人に役立つかもしれないので私の質問Im投稿の答えの答えを見つけました。char *からjstringまたはjbytearrayへの間違った答えが暗号化されたdata.Soのthousose valuesの16進値私はちょうどjintarrayに変換し、正しい答えを受信して​​いる暗号化されたデータのintarrayを渡したことを意味した。

関連する問題