2010-12-04 11 views
3

私は128ビットキーを含むSecretkeySpecオブジェクトを作成しました。 私はこのキーをStringに入れたいのですが(この文字列を元のキーに戻す必要があります)、Base64エンコーディングを使用します。JAVA:128ビットのキーとストリングの問題

これは私のキーは文字にバイト配列からRAW形式でどのように見えるかです:

*P??? ?ukL|?~ 

だから私はバイトを取ると、このようにそれをコードします。

byte[] okay = Base64.encode(eF.getSpec().getEncoded()); 

は、今私は文字に翻訳するとき、私は得る:

S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo= 

今、私は私のキーが戻って、それはbase64でエンコードされた配列から元の形式だに復元したいです。私は結果を確認するとき

String dkey = "S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo="; 

byte[] key = null; 
key = dKey.getBytes(); 
key = Base64.decode(key); 

は、今私が得る:

DKlDkp+kJ9nUFa0wZHyFfg== 

の代わりに:

*P??? ?ukL|?~ 

あなたは、これは私が見ることを望んだ結果ではない見ることができるように。 私は確かに初心者の間違いをして、それを私を許しても、私はプログラミングに新しいrelativalyです。 誰かが私に128ビットの鍵を読み取り可能な形式に変換するという実例を教えてもらえればと思っています。

私はスペルミスをお詫びします。英語は母国語ではありません。あなたは、コードに多少の誤差があった事前

+0

どのような 'Base64'クラスを使用していますか?それはApache Codecライブラリからですか? –

+0

'eF.getSpec()。getEncoded()'は何をしますか?私はデコード部分で同様の呼び出しを見ません。 – casablanca

+0

@casablanca:* SecretKeySpecクラスのgetEncoded()メソッドです(http://download.oracle.com/javase/1.4.2/docs/api/javax/crypto/spec)。 /SecretKeySpec.html#getEncoded%28%29)。その場合、キーを表す生のバイトを単に返す必要があります。 –

答えて

2
S2xEa3Ara0o5blVGYTB3WkRIeUZmZz09DQo= 

KlDkp+kJ9nUFa0wZDHyFfg==. 

にデコードし、コピー&ペーストのエラー先頭に余分なDですか?

KlDkp+kJ9nUFa0wZDHyFfg== 

は、いくつかのバイナリデータをデコードする有効なbase64文字列です。だから、あなたは二度エンコーディングをしているようです。今

私は

がどのように正確にあなたがそれをやっている得る文字に翻訳?そのステップには別のbase64エンコーディングが含まれていますか?

+0

私はそれをforループでチェックします:String stringkey = ""; (バイトforbyte:鍵)の \t \t \t \t \t \t \t { \t \t \t \t \t \t \t \tチャーforchar =(CHAR)forbyte。 \t \t \t \t \t \t \t \t \t stringkey + = forchar。 \t \t \t \t \t \t \t \t} \t \t \t \t \t \t \tのSystem.out.println(stringkey)。私は自分のコードを2回チェックし、Base64.encodeへの呼び出しは1回だけで、Base64.decodeへの呼び出しは1回だけです。実際にはタイプミスのようです。 – Rohan

+0

@Rohan:おそらく、* all *関連コードを含むように質問を編集する必要があります。 –

+0

実際に彼のK1Dkなどは(* P)で始まる元のキーのように見えるものにデコードします。 Rohanは 'eF.getSpec()。getEncoded()'から出てくるものを確認できますか? – lijie

0

おかげで(あなたの頭の上からそれを書いたと仮定しています)。これは動作するバージョンのように見えます。これらの内部クラスを使用することはそれほど巧妙ではないことに注意してください(ここでは、Apache Commons Codecsライブラリ(例えば、org.apache.commons.codec.binary.Base64クラス)を使用することをお勧めします)。

package edu.sasik.test.encoding; 

import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; 

public class TestBase64 { 

    public static void main(String[] args) { 
    String base64Str = Base64.encode("Hello World!".getBytes()); 
    System.out.println(base64Str); 
    byte[] bytes = Base64.decode(base64Str); 
    System.out.println(new String(bytes)); 
    } 

} 

出力:

 
SGVsbG8gV29ybGQh 
Hello World! 

この情報がお役に立てば幸いです。

+0

こんにちはジリ、返事をありがとう、私の場合は、リトルビットは、私は128ビットのキーが読める形式に変換する必要がありますので、それとは異なる。実際には私は上記のようにエンコードしています(byte [] okay = Base64.encode(eF.getSpec()。getEncoded());)eF.getSpec()。getEncoded()は実際にはキーです。その部分。しかし、私はそれをデコードすると結果は私の入力と同じではありません。 – Rohan

関連する問題