4

Android プロジェクトで復号化の問題が発生しました。

秘密鍵で署名された文字列を取得しており、公開鍵で検証 (復号化) する必要があります。PHP 関数 - openssl_public_decrypt ( http://php.net/manual/pl/function.openssl-public-decrypt.php )を使用している場合とまったく同じ結果を得たいと思います。

Java プロジェクトでこれを行う必要があるため、Java ライブラリを使用できます (たとえば、BouncyCastle など、何か推奨事項はありますか?)

これを解決する方法はありますか?

わかりました、これが私のコードです。私はこのように公開鍵を取得しています

PEMReader reader = new PEMReader(new InputStreamReader(ctx
                .getAssets().open("pubkey.pem")));
        Object obj;
        while ((obj = reader.readObject()) != null) {
             if (obj instanceof RSAPublicKey) {
                pubKey = (RSAPublicKey) obj;
                return pubKey;
            }
        }

そして、私はいつも問題なく公開鍵を取得しています。

Cipher c = Cipher.getInstance("RSA/NONE/NoPadding", "SC");
c.init(Cipher.DECRYPT_MODE, pubKey);
byte[] result = c.doFinal(data_to_decrypt.getBytes());

そして結果として(バイトを文字列に変換した後)私は得る022c06571c6a263b389fcd93159cb311abb880bddf51b7c916dd1ae...

php 関数が返す場所で sd8dsa348acvcx87|00454|OK|15000|CDE、これは正しい出力です。

4

1 に答える 1

7

Java には Java 暗号化拡張フレームワークがあります。これは、これらの目的のために設計されたものです。

BouncyCastle は、このフレームワークの暗号化プロバイダーです。これは、Java 暗号化拡張機能に暗号化アルゴリズムの実装を提供することを意味します。

このための基本的なクラスは、パッケージjava.securityjavax.crypto

公開鍵でメッセージを復号化するには、次のことを試すことができます。

// Use RSA/NONE/NoPadding as algorithm and BouncyCastle as crypto provider
Cipher asymmetricCipher = Cipher.getInstance("RSA/NONE/NoPadding", "BC");

// asume, that publicKeyBytes contains a byte array representing
// your public key
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes);

KeyFactory keyFactory;
keyFactory = KeyFactory.getInstance(publicKeySpec.getFormat());
Key key = keyFactory.generatePublic(publicKeySpec);

// initialize your cipher
asymmetricCipher.init(Cipher.DECRYPT_MODE, key);
// asuming, cipherText is a byte array containing your encrypted message
byte[] plainText = asymmetricCipher.doFinal(cipherText);

この例は非常に基本的なものであり、いくつかの try catch ブロックが欠けていることに注意してください。また、リプレイ攻撃に対して脆弱になるため、パディングなしで非対称暗号を使用しないでください。キーの長さに関する問題が発生する場合もあります。一部の Java パッケージでは、許可されるキーの最大長が制限されています。これは、無制限強度ポリシー ファイルを使用することで解決される場合があります。

これが、Java 暗号化を始めるのに役立つことを願っています。

于 2012-04-26T11:40:40.323 に答える