2017-03-15 17 views
0

JAVAとLinuxでaes-128-cbc暗号化を行いたいのですが、私は別の結果を得ています。 たとえば、文字列 "my.txt"をデコードしたいとします。 Linuxでは、私はこの方法でそれを実行します。JavaとLinuxではAES-128-CBCが異なります

echo -n my.txt | openssl aes-128-cbc -K 6f838655d1bd6312b224d3d1c8de4fe1 -iv 9027ce06e06dbc8b -a 

私はまた、BASE64にそれをエンコードし、それが私にこの結果を与えている:Javaでは86M5fwdUpQ3tbFrz0ddHJw ==

を、私は、このメソッドを使用します。

public static String encrypt(String key, String initVector, String value) { 
    try { 
     IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); 
     SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); 

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING"); 
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); 

     byte[] encrypted = cipher.doFinal(value.getBytes()); 
     System.out.println("encrypted string: " 
       + Base64.encodeToString(encrypted, Base64.DEFAULT)); 

     return Base64.encodeToString(encrypted, Base64.DEFAULT); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    return null; 
} 

同じデータでそれは私に完全に異なる結果与える:vgk6yxCrQ5iLFvHxMtQO7wの==を

また、32シンボル長のaes-256-cbcを使用しようとしました。 Linuxでは私はaes-256-cbcを使い、AndroidではSpongy Castleライブラリーをこの目的のために使用していますが、これも異なる結果をもたらします。

どうしたのですか?または、異なるクロスプラットフォームアルゴリズムを暗号化するように提案することもできます。

+1

AESは、明確に定義された、よく知られている標準であるので、アルゴリズムは実際には同じです。問題は、私が確信しているのは入力です。さまざまな入力(キー、iv、データ)の実際のバイトはすべて同じですか?バイトと文字は同じものではないことに注意してください。文字セットまたはエンコーディングは、それらの間の関係です。また、両方で同じパディングを使用していることを確認してください。 – dsh

+1

[OpenSSL AES CBC暗号化のJava同等物](http://stackoverflow.com/q/32508961/608639)[Java AES 128のopensslとは異なる暗号化](http://stackoverflow.com/q/21086103/608639) )、[Javaを使用してopenssl aes-128-cbcでエンコードされた文字列を解読するには?](http://stackoverflow.com/q/31947256/608639)[Javaを使用して、提供されたキーを使用してopenssl aes-256-cbcを復号化する – jww

答えて

2

-Kおよび-ivのパラメータには、16進数でエンコードされた文字列が必要です。キーの長さは32文字なので、16バイトまたは128ビットです。 IVの長さは16文字なので、8バイトまたは64ビットです。 AES/CBCのIVは正確に128ビットでなければならない。そうでなければ、何とか詰め込まなければなりません。あなたのIVは、おそらく128ビットに達するために0x00バイトで埋め込まれます。あなたはJavaで同じことをする必要があります。

もう1つの問題は、16進数でエンコードされたキーとIVをテキストとして扱うことです。つまり、Javaで256ビットのキーと128ビットのIVとして扱われます。おそらくあなたが望むものではありません。使用する前に、16進数の文字列をデコードする必要があります。

のはbyte[] fromHex(String hexStr)の架空の実装を使用してみましょう:

byte[] ivBytes = new byte[16]; 
byte[] ivBytesShort = fromHex(initVector); 
System.arraycopy(ivBytesShort, 0, ivBytes, 0, ivBytesShort.length); 
IvParameterSpec iv = new IvParameterSpec(ivBytes); 
SecretKeySpec skeySpec = new SecretKeySpec(fromHex(key), "AES"); 
+0

はい、私の最初のivは32文字でしたが、それは私にivの長さについてエラーを与えました、そして、今、私はなぜそれを理解しますか?はい、fromHex()は動作しており、適切な結果が得られます。ありがとうございました! –

関連する問題