2016-11-13 23 views
1

最近データを暗号化するために、JavaでAES CBC 128アルゴリズムを使用しました。今私はPHPでそのアルゴリズムを再構築する必要がありますが、私はどのように考えていない、インターネット上のPHPアルゴリズムは異なる結果を返すため。多分あなたは私を助けることができます。JavaとPHPを使用したAES CBC 128ビット暗号化

これは、暗号化するためのJavaコードです:

private SecretKeySpec secretKey; 
private IvParameterSpec ivSpec; 

public void setKey(String myKey) { 
    MessageDigest sha = null; 
    try { 
     byte[] key = myKey.getBytes("UTF-8"); 
     sha = MessageDigest.getInstance("SHA-1"); 
     key = sha.digest(key); 
     key = Arrays.copyOf(key, 16); 
     secretKey = new SecretKeySpec(key, "AES"); 

     byte[] iv = new String("1010101010101010").getBytes("UTF-8"); 
     ivSpec = new IvParameterSpec(iv); 

    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 
} 

public String encrypt(String strToEncrypt) { 
    try { 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); 
     return Base64.encode(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

public String decrypt(String strToDecrypt) { 
    try { 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); 
     return new String(cipher.doFinal(Base64.decode(strToDecrypt))); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

public static void main(String[] args) { 

    AESText aes = new AESText(); 
    final String secretKey = "com.secure.test.projectjasdS/FjkGkGhkGjhG786Vjfg=tjGFGH"; 
    aes.setKey(secretKey); 

    String originalString = "test set se ts et set s et se"; 
    String encryptedString = aes.encrypt(originalString); 
    String decryptedString = aes.decrypt(encryptedString); 

    System.out.println("origin: " + originalString); 
    System.out.println("encrypted: " + encryptedString); 
    System.out.println("decrypted: " + decryptedString); 
} 

これは私のPHPコードです:

protected $key; 
    protected $method = 'AES-128-CBC'; 
    protected $iv = '1010101010101010'; 
    protected $option = OPENSSL_CIPHER_AES_128_CBC; 

    function __construct($key) 
    { 
     $this->key = $key; 
    } 

    public function encrypt($data) { 
     if (is_null($data)) { 
      return "Error " . INVALID_PARAMS_ENCRYPTIONS . ": Data is null "; 
     } 
     $enc = openssl_encrypt($data, $this->method, $this->key, $this->option, $this->iv); 
     return base64_encode($enc); 
    } 

    public function decrypt($data) { 
     if (is_null($data)) { 
      return "Error " . INVALID_PARAMS_ENCRYPTIONS . ": Data is null "; 
     } 
     $data = base64_decode($data); 
     $dec = openssl_decrypt($data, $this->method, $this->key, $this->option, $this->iv); 
     return $dec; 
    } 

私はJavaの暗号化データを暗号化すると、この結果はPHPの暗号解読に解読することはできません。

Java暗号化で同じ結果を返すPHPスクリプトを作成するのにお役に立てれますか?一見

答えて

0

私はここに3つの問題を参照してください。

まずを:あなたは、同じモードを使用していない:あなたのPHPがAES-128-CBCを使用するのに対し、JavaであなたはAES/ECB/PKCS5Paddingを持っています。

第二

あなたが持っている:あなたは、おそらく同じIVのJavaとPHPコード内に(IVさんは、ECBは無関係ですが、あなたはCBCにしてJavaを切り替える一度あなたがそれを必要とします)を使用していません$iv = '1010101010101010'(これはopensslに渡されます)があなたのPHPにはありますが、あなたのjavaのようなものはありません。

非常に少なくとも、あなたはおそらく同様にあなたのJava部分でそのようなものが必要になります。

cipher.init(Cipher.DECRYPT_MODE/ENCRYPT_MODE, secretKey, new IvParameterSpec(iv)) 

ivがあなたIVのバイトを含むbyte[]ていると。

第3の:上記の問題が解決されると、次の壊滅的なことがパディングになる可能性があります。java暗号仕様にはPKCS5Paddingが記載されています。両方のカウンターパートが同じものを使用していることを確認する必要があります。

編集:第4の:もう1つの問題は、使用するキービットを導出する方法です。 javaではsha1-hashの最初の16バイトを取得し、PHPでは$keyをopensslに渡します。 opensslが別の方法で暗号鍵を派生している可能性があります。


ブロック暗号を使用して暗号化関連ツールを構築する場合、それはフードの下で何が起こっているかの感覚を得るために、ウィキペディアにBlock cipher mode of operationPaddingような古典を再検討することは常に良いことです。

+0

ありがとう@Shastick。私は暗号化の初心者です。私は私のJavaコードを編集しました。 Javaで 'PKCS5Padding'を使用すると、動作しますが、' NoPadding'を使用すると、 'javax.crypto.IllegalBlockSizeException:16バイトの倍数ではない入力長です.'エラーが発生します。しかし、 'IV'を追加し、' CCS'を 'PKCS5Padding'で' ECB'に変更すると、javaとphpの間の暗号化は一致しません。私のコードを編集する手助けはできますか? –

+0

入力の長さが16の倍数ではない場合は、例外として、exceptnendのように、埋め込みが完全に行われます。それを正しくするには、もう少しプレイしてチュートリアルを参照する必要があります。 – Shastick

関連する問題