2016-05-10 24 views
-1

Java DesktopアプリケーションとAndroidアプリからWebサービスに接続する必要があります。 RIJNDAELで暗号化されたログイン情報を送信する必要がありますが、問題が発生しています。 JavaでJavaから暗号化してPHPで解読する(RIJNDAEL)

コード:

public static String getEncryptedLogin(String loginID, String encryptionKey) { 
    byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 
    SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "RIJNDAEL"); 

    AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); 
    byte[] result = cipher.doFinal(loginID.getBytes("UTF-8")); 
    return Base64.getEncoder().encodeToString(result); 
} 

そして、このように呼ばれます。 WS_ENCKEYで

String dataToSend = "login="+Testencrypted.getEncryptedLogin(LOGIN,WS_ENCKEY)+"&language=en"; 

暗号化のための鍵(32chars)の文字列です。私は他の人に読んだ後、このウェブサイトに投稿して、私は、例外エラー「不正なキーサイズ」を取得するJavaコードを実行すると

は、RIJNDAELは、128ビットのキーを必要とするので、私は、私は

に暗号化メソッドを呼び出す方法を変更しますサーバーで

<?php 
class Encrypter { 
    public static function encrypt($text,$key) { 
     $textenc = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB); 
     return base64_encode($textenc); 
    } 
    public static function decrypt($text,$key) { 
     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, base64_decode($text), MCRYPT_MODE_ECB)); 
    } 
} 

は、私は、正しいデータを受信し、私はログインを解読しようとすると、出力が同じではありません。

String dataToSend = "login="+Testencrypted.getEncryptedLogin(LOGIN,WS_ENCKEY.substring(0,16))+"&language=en"; 

は、サーバー側では、私はこのPHPコードを解読しなければなりません。

私はサーバー側のコードを変更できません。お手伝いできますか?

+0

PHP mcryptはPKCS5パディングをサポートしていません。 mcryptを使用しないことをお勧めします。これはabandonwareです。何年も更新されておらず、標準のPKCS#7(néePKCS#5)パディングもサポートしていません。バイナリデータでも使用できない非標準のヌルパディング。代わりに[defuse](https://github.com/defuse/php-encryption)の使用を検討してください。これは維持されており、正しいものです。 – zaph

答えて

0

PHP mcryptは、PKCS5パディングをサポートしておらず、ヌルパディングのみをサポートしています。 Javaではパディングなしを選択し、暗号化に関する入力データはブロックサイズの倍数にヌルパディングし、Javaでは解読時にヌルを除去する必要があります。

PHP mcryptサーバーコードは安全ではないECBモードを使用しています。互換性のあるJavaでは、CBCモードではなくECBモードも指定する必要があります。 ECBモードはIVを使用しません。

関連する問題