2017-11-20 29 views
0

私は現在、常に同じキーを使用してソリューションを作成するためにCipherでプレイしています。私はこれが最も安全な解決策ではないことを知っていますが、私に求められていることです。私はAES256とEBCを使用するはずですが、正しく暗号化できません。問題は未知の文字があることです。暗号化Javaが正しく暗号化されない

private static String encrypt(String text) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException 
{ 
    String keyString = AESEncryption.convertToUTF8("8DJE7K01U8B51807B3E17D21"); 
    text = AESEncryption.convertToUTF8(text); 

    byte[]keyValue = Base64.getEncoder().encode(keyString.getBytes(StandardCharsets.UTF_8)); 
    Key key = new SecretKeySpec(keyValue, "AES"); 
    Cipher c1 = Cipher.getInstance("AES/ECB/PKCS5Padding"); 

    c1.init(Cipher.ENCRYPT_MODE, key); 

    byte[] encodedText =Base64.getEncoder().encode(text.getBytes(StandardCharsets.UTF_8)); 
    System.out.println("Encoded text: "+new String(encodedText,StandardCharsets.UTF_8)); 

    byte[] encVal = c1.doFinal(encodedText); 
    System.out.println("Encoded val: "+new String(encVal,StandardCharsets.UTF_8)); 

    return new String(encVal); 
} 

編集:申し訳ありませんが、初めて尋ねます。私はあなたにすべての範囲を与えます。その後、私は次のコードで解読しようとします(私は繰り返しコードがあることを知っています、私はそれをきれいにするでしょう)。しかし、暗号化メソッドで得られた出力を解読すると、次のエラーが発生します。私は、暗号化と復号化しようとしているメッセージは、「はいはい」である

public static String desEncrypt(String text) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException 
{ 
    String keyString = AESEncryption.convertToUTF8("8DJE7K01U8B51807B3E17D21"); 

    byte[] keyValue = Base64.getEncoder().encode(keyString.getBytes(StandardCharsets.UTF_8)); 
    Key key = new SecretKeySpec(keyValue, "AES"); 
    Cipher c1 = Cipher.getInstance("AES/ECB/PKCS5Padding"); 

    c1.init(Cipher.DECRYPT_MODE, key); 
    byte[] encodedText = Base64.getDecoder().decode(text.getBytes(StandardCharsets.UTF_8)); 
    byte[] encVal = c1.doFinal(encodedText); 

    System.out.println(new String(encodedText)); 
    return new String(encVal,StandardCharsets.UTF_8); 

} 

とエラー:

Encoded text: aG9sYWNraXNqbWRlaXJncw== 
Encoded val: ???D>??|??i9???Fd?\Zz?A?- 
Exception in thread "main" java.lang.IllegalArgumentException: Illegal base64 character -3d 
     at java.util.Base64$Decoder.decode0(Unknown Source) 
     at java.util.Base64$Decoder.decode(Unknown Source) 
     at AESEncryption.desEncrypt(AESEncryption.java:63) 
     at AESEncryption.main(AESEncryption.java:79) 

はどうもありがとうございました、そして

+2

ようこそスタックオーバーフロー!もし私が聞くことができるなら、あなたの質問は何ですか?次のhttps:// stackoverflowをお読みください。com/help/how-to-askと他の人に役立つ情報を追加しようとします。あなたの問題は些細なように思えますが、リンクごとに情報を追加することは非常に便利です。 – amn

+3

はい、そうです。すべてのバイトシーケンスは、有効なUTF8エンコードされた文字シーケンスを表していません。そして、すべての文字はあなたには知られていません。なぜならそれらの文字はかなり多いからです。 「よく知られている」英字だけを使用して印刷可能な文字列を使用する場合は、Base64エンコーディングを使用してバイト配列を変換します。 –

+0

ありがとう、私は問題の完全な範囲を含めました。今はすべてがより明確になることを願っています。 –

答えて

1

あなたが必要なすべての情報を提供していないために許しコードは意味をなさない:StringをUTF8に変換し、Stringを返すことは意味をなさない。Stringは文字を含む。バイトではありません。

base64へのキーのエンコーディングはあまり意味がありません。プレーンテキストをbase64にエンコードすることも無用です。

ランダムなバイナリバイトがあり、印刷可能な英字に変換する場合は、base64エンコーディングが必要です。それだけです。

ので、プロセスは次のようになります。

  1. はバイト(String.getBytes(UTF_8)を使用)へのあなたの鍵を変換します。 Stringキーが実際にbase64でエンコードされたバイト配列でない場合は、base64にする必要がありますデコードです。
  2. プレーンテキストをバイトに変換します(String.getBytes(UTF_8)を使用)。
  3. は、手順1で取得したキーを使用して、手順2で取得したバイトを暗号化します。完全に「ランダム」なバイトを取得します。これらのバイトは、プラットフォームのデフォルトの文字セットでエンコードされた文字を表していません。したがって、new String(bytes)を使用してそれらを文字列に変換することは意味をなさないので、不可解な変換です。
  4. 結果をバイト配列として返すか、印刷可能な文字が本当に必要な場合は、バイトをbase64でエンコードし、このbase64エンコーディングから取得した文字列を返します。あなたが返すように選択した場合、キー
  5. は、上記(STEP4から得られたバイトを取る取得するステップ上記1と同じものを使用し

    1. :復号化するために

    は、逆のプロセスを使用します元のランダムバイナリバイトを取得するには

  6. 手順2で取得したバイトを復号化するには、手順1で取得したキーを使用します。UTF8でエンコードされた文字を表すバイト配列を取得します。元のプレーンテキスト。
  7. new String(decryptedBytes, UTF_8)を使用して、このバイト配列をStringに変換します。
+1

恐ろしい!本当にありがとう、私は失われたので、私は可能な限りすべてを試みました。今私は暗号とBase64のより良い理解があります。どうもありがとうございます!! –