2016-05-25 32 views
0

私はAES ECB、 を使用してキーのMD5ハッシュを暗号化し、その後それを解読しようとすると、私は切り抜いた結果を得る:前AESの暗号化と復号化、データの損失

を:>•LY†lrœËGQ2¶ª€

:0|t < D)¥§> BがW

iは暗号化と復号化に使用するコードは、次のとおり

public class AES { 
    private String a= "AES/ECB/NoPadding"; 
    private byte[] key; 
    Cipher c; 
    public AES(byte [] key) throws NoSuchAlgorithmException, NoSuchPaddingException{ 
      this.key = key; 
      c = Cipher.getInstance(a); 
     } 
public String encrypt(byte[] Data) throws Exception{ 
     Key k = new SecretKeySpec(key, "AES"); 
     c.init(Cipher.ENCRYPT_MODE, k); 
     byte[] encoded = c.doFinal(Data); 
     String encrypted= new String(encoded); 
     return encrypted; 

    } 
public String decrypt(byte[] v) throws Exception{ 
     Key k = new SecretKeySpec(key, "AES"); 
     if(v.length%16!=0) 
      return null; 
     c.init(Cipher.DECRYPT_MODE, k); 
     byte[] decv = c.doFinal(v); 
     String decrypted = new String(decv); 
     return decrypted; 
    } 
} 
+3

この操作は情報を失います: '暗号化された文字列=新しい文字列(符号化された);'。そのようなテキストとして任意のバイナリデータをエンコードしようとしないでください。 base64または16進数を使用します。 –

+0

ありがとうございます!それは損失をもたらす行だった –

答えて

1

これは動作しません:encoded

String encrypted= new String(encoded); 

暗号文のバイトは、擬似ランダムちんぷんかんぷんです。プラットフォームのデフォルトにかかわらず、有効なテキストエンコーディングを形成する可能性は非常に低いです。あなたはテキスト表現を必要とする場合

、ベース-64エンコーディングを使用します。

String encrypted = Base64.getEncoder().encodeToString(encoded); 

それはさまざまな方法で現れるが、これは、一般的な間違いなので、「質問」は重複として識別するために変化し、難しいです。詳細はHere's another answerです。

-1

暗号化の実装で文字列を16進数または2進数と組み合わせると、変換が失敗する可能性があります。