0

PHPによって生成された公開鍵を使用してJavaで暗号化しようとしています:

PHP コード

    $rsa = new Crypt_RSA();
    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
    $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);


    $keys = $rsa->createKey(1024);
    extract($keys);

    echo (base64_encode($publickey));

テスト目的で、上記の形式のキーペア (base64) を取っておきました。

Java で公開鍵を取得し、base64 でデコードします。

    String publicKeyDecoded = new String(Base64.decode(publicKey));
    PEMParser pr = new PEMParser(new StringReader(publicKeyDecoded));
    Object obj = pr.readObject();
    pr.close();
    SubjectPublicKeyInfo spki = (SubjectPublicKeyInfo) obj;
    AsymmetricKeyParameter askp = PublicKeyFactory.createKey(spki);

    AsymmetricBlockCipher e = new RSAEngine();
    e = new org.bouncycastle.crypto.encodings.PKCS1Encoding(e);
    e.init(true, askp);

    byte[] messageBytes = plainText.getBytes();
    byte[] encryptedData = e.processBlock(messageBytes, 0, messageBytes.length);
    byte[] encryptedDataBase = Base64.encode(encryptedData);

Base64 で暗号化された平文を PHP に送り返し、以下を使用して復号化します。

    $rsa->loadKey($privatekey) or die ("Cant load");
    echo $rsa->decrypt($cipher);        

エンコードされたメッセージを解読できず、次のエラーがスローされます。

    Decryption error in <b>/opt/lampp/htdocs/Crypt/RSA.php</b> on line <b>2120</b>

誰かが私を正しい方向に向けることができますか? これを理解しようとしてから何時間も経ちました。

ハードコードされたキーペアを使用しているので、キーが間違っていることに疑いの余地はないと思います...

4

1 に答える 1

1

私自身の質問に答えるには:

最終的な復号化 PHP 以外はすべて正しかった。

そのはず:

    $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
    $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
    $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);

    $rsa->loadKey(base64_decode($_SESSION['private'])) or die ("Cant load");
    echo $rsa->decrypt(base64_decode($cipher));

Java から送信された暗号化テキストの base64 を解除し、暗号化モードを設定するのを忘れていました。

ありがとうノイバート。

于 2013-07-06T06:31:20.627 に答える