0

次のシーケンスを実行するには、phpスクリプトを作成する必要があります。

  • 1)ユーザーが秘密鍵を入力します。これを$user_keyと呼びましょう。
  • 2)デフォルトのファイルコンテンツを読み取ります(file_get_contentsは$ dataに保存されます)
  • 3)3つのランダムキー($ dataに保存)を使用してAES128の$dataを暗号化します
  • 4)$dataの最後にこれらの3つのキーを連結します
  • 5)データを埋める
  • 6)ユーザーの秘密鍵を使用して$dataを暗号化します
  • 7)$dataを一意のファイルに書き込みます

パート1、2、4、5、6、および7のみを実行すると、機能します(Java復号化)。ランダムキーを使用してファイルを暗号化すると、まったく機能しません(Java復号化は機能しません)。

PHPで何か間違ったことをしましたか(パディングの欠落など)?

これが私が使用するコードです。スクリプトがうまく機能しないようにするものを1行目から3行目にマークしました。

$data = file_get_contents('default_file.jar');

// Generate 3 AES keys
$ramdom_key_1 = randomAESKey();
$ramdom_key_2 = randomAESKey();
$ramdom_key_3 = randomAESKey();

// Encrypt three times the raw data with the user key
$data = AESEncrypt(pad($data, 16), $ramdom_key_1);      // LINE 1
$data = AESEncrypt($data, $ramdom_key_2);               // LINE 2
$data = AESEncrypt($data, $ramdom_key_3);               // LINE 3

// Add the 3 keys to the data raw
$data .= $ramdom_key_3 . $ramdom_key_2 . $ramdom_key_1;

// Final encryption with the user's key
$data = AESEncrypt(pad($data, 16), $user_key);

// Write the raw data to an unique file
file_put_contents('new_file.jar', $data);

ファイルを復号化するためのJavaコードは次のとおりです。

byte[] content = download(url);
content = Crypto.decrypt(content, user_key);

String content = new String(data);
String keys = content.substring(content.length() - 48, content.length());
String[] keys = new String[] { keys.substring(0, 16), keys.substring(16, 32), keys.substring(32, 48) };

byte[] cleared_content = new byte[content.length - 48];
System.arraycopy(content, 0, cleared_content, 0, content.length - 48);

// For each keys, decrypt the file data
for (String key : keys)
{
    cleared_content = Crypto.decrypt(cleared_content, key.getBytes());
}

return cleared_content;

私の暗号クラスは次のようになります(そのほんの一部です):

public static byte[] decrypt(byte[] input)
{
    try
    {
        SecretKeySpec skey = new SecretKeySpec(KEY.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skey);
        return cipher.doFinal(input);
    }
    catch (Exception e) {}
    return input;
}

キーはdesc順に保存されているので、そのように復号化を実行するだけです。

phpで私のパッド機能を表示するためのクイック編集:

function pad($data, $blocksize)
{ 
    $pad = $blocksize - (strlen($data) % $blocksize); 
    return $data . str_repeat(chr($pad), $pad); 
}
4

1 に答える 1

0

問題が解決しました。owlsteadに感謝します。

私が変更され

$data = AESEncrypt(pad($data, 16), $ramdom_key_1);      // LINE 1
$data = AESEncrypt($data, $ramdom_key_2);               // LINE 2
$data = AESEncrypt($data, $ramdom_key_3);               // LINE 3

$data = AESEncrypt(pad($data, 16), $ramdom_key_1);      // LINE 1
$data = AESEncrypt(pad($data, 16), $ramdom_key_2);      // LINE 2
$data = AESEncrypt(pad($data, 16), $ramdom_key_3);      // LINE 3
于 2012-06-25T16:08:08.487 に答える