2

JAVA を使用してメッセージを復号化するプログラムを作成する必要があります。メッセージは、PHP に実装された Triple DES / ECB を使用して暗号化されます。アルゴリズム、モード、およびパディング スキーマでいくつかの異なる設定を試しました。正しい結果が得られません。何が欠けている?

メッセージを暗号化する PHP プログラムは次のとおりです。

$config_mcrypt_ecb_key = "12345678901234567890";
$data = "hello";
echo "Data Before Encrypt: " . $data . "\n";
$td = mcrypt_module_open('tripledes', '', 'ecb', '');
$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_ENCRYPT);
mcrypt_generic_init($td, $config_mcrypt_ecb_key, $iv);
$data_encrypt = bin2hex(mcrypt_generic($td, $data));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo "Data After Encrypt: " . $data_encrypt . "\n";

以下は、メッセージを復号化する Java プログラムです: (私は BouncyCastleProvider を使用しています)

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import java.security.*;

public class DecryptionTest {
    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException {
        String password = "12345678901234567890";
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        SecretKeySpec key = new SecretKeySpec(password.getBytes(), "ECB");
        Cipher m_decrypter = Cipher.getInstance("DESede/ECB/ZeroBytePadding");
        m_decrypter.init(Cipher.DECRYPT_MODE, key);
        byte[] decryptedText = m_decrypter.doFinal("bdf0baf948bff7e7".getBytes());
        System.out.println(new String(decryptedText));
    }
}
4

1 に答える 1

0

復号化を実行するときに IV (初期化ベクトル) を使用していないようです。私の理解ではmcrypt_create_iv()、ランダムな IV が生成されるため、復号化時に使用できるように暗号化されたデータと共に保存する必要があります。

または (より弱い暗号化を使用しても問題ない場合)、PHP 側から IV を省略します。

于 2010-10-23T16:28:16.970 に答える