3

iOS プロジェクトを Android に拡張しています。私の既存のアプリケーションは、AES 暗号化システムを使用して PHP 経由でサーバーと通信します。

PHP側で使用している関数は次のとおりです。

暗号化する

function cryptAESEncrypt($string,$key) {
    $key = md5($key);
    $iv = "1234567890123436"; //IV isn't needed if MCRYPT_MODE is ECB (What we are using)
    $data = $data = base64_encode($string);
    $algorythm = MCRYPT_RIJNDAEL_128;
    $mode = MCRYPT_MODE_ECB;

    $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_MODE_ECB,$iv);

    return base64_encode($encrypted);
}

復号化

function cryptAESDecrypt($string,$key) {
    $key = md5($key);
    $iv = "1234567890123436"; //IV isn't needed if MCRYPT_MODE is ECB (What we are using)
    $data = base64_decode($string);
    $algorythm = MCRYPT_RIJNDAEL_128;
    $mode = MCRYPT_MODE_ECB;

    $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,$data,MCRYPT_MODE_ECB,$iv);

    return base64_decode($decrypted);
}

プロセスの一般的な流れは次のとおりです。

  • md5 ハッシュ$key(関係なく 16 文字にします)
  • Base64 エンコード$string
  • ECB モード (IV なし) で 128Bit AES/RIJNDAEL を使用して Base64'ed を暗号化します。
  • 暗号化されたデータを Base64 し、文字列として返します。

復号化は同じように機能しますが、逆になります。

今、私はサンプルで遊んでいますが、あまり運がないようです. "test"その関数を使用してPHPで文字列を暗号化しました("test"キーもMD5に変換されました098f6bcd4621d373cade4e832627b4f6"ijzLe/2WgbaP+n3YScQSgQ==".

キーの長さが正しくないというエラーが発生したため、Java で試したことは機能しませんでしたが、前のスニペットの方がうまくいきました。とにかく私が持っていたものは次のとおりです。

String key = "test";
String in = "ijzLe/2WgbaP+n3YScQSgQ==";

SecretKeySpec skeySpec = new SecretKeySpec(md5(key).getBytes(), "AES");

Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, skeySpec);

byte[] encryptedByteArray = Base64.decode(in.getBytes(),0);
byte[] decryptedByteArray = cipher.doFinal(encryptedByteArray);
String decryptedData = new String(Base64.decode(decryptedByteArray, 0));

Log.v("NOTE","Data: "+decryptedData);

私が言ったように、それはうまくいきません。私の質問は、私のJavaコードを提供されたPHPコードで動作させるのを手伝ってくれる人はいますか?

4

1 に答える 1

0

コメントの Duncan のおかげで、問題は私の MD5 ハッシュ関数にあることがわかりました..

参照用の作業バージョンが見つかりました:

public String md5(String s) {
    if (s != null)
    {
        try { // Create MD5 Hash
            MessageDigest digest = java.security.MessageDigest .getInstance("MD5");
            digest.update(s.getBytes());
            byte messageDigest[] = digest.digest();

            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < messageDigest.length; i++) {
                String h = Integer.toHexString(0xFF & messageDigest[i]);
                while (h.length() < 2)
                    h = "0" + h;
                hexString.append(h);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
    return "";
}
于 2012-11-23T09:22:52.130 に答える