3

RSA 公開鍵と秘密鍵を使用して文字列オブジェクトを暗号化および復号化する方法を知っている人はいますか?

KeyPairジェネレーターを使用して以下の秘密鍵と公開鍵を作成しましたが、公開鍵を使用してデータを暗号化し、秘密鍵を使用して復号化したいと考えています。

public class Keys {

    private static KeyPairGenerator generator;

    private static KeyPair keyPair;

    private static PrivateKey mPrivateKey;

    private static PublicKey mPublicKey;

    private static SecureRandom secureRandom;

    private static final String SHA1PRNG = "SHA1PRNG";

    public static final String RSA = "RSA";

    private Keys() throws NoSuchAlgorithmException {
        generator = KeyPairGenerator.getInstance("RSA");
    }

    /**
     * Generate private and public key pairs
     * 
     * @throws NoSuchAlgorithmException
     */
    private static void generateKeyPair() throws NoSuchAlgorithmException {
        // create SecureRandom object used to generate key pairs

        secureRandom = SecureRandom.getInstance(SHA1PRNG);

        // initialise generator
        generator = KeyPairGenerator.getInstance(RSA);
        generator.initialize(1024, secureRandom);

        // generate keypair using generator
        keyPair = generator.generateKeyPair();

        // asssign private and public keys
        setPrivateKey(keyPair.getPrivate());
        setPublicKey(keyPair.getPublic());

    }

    /**
     * Get private key from key generated
     * @return
     * @throws NoSuchAlgorithmException
     */
    public static PrivateKey getPrivateKey() throws NoSuchAlgorithmException {

        if (mPrivateKey == null) {
            generateKeyPair();
        }
        return mPrivateKey;
    }

    private static void setPrivateKey(PrivateKey privateKey) {
        mPrivateKey = privateKey;
    }

    /**
     * Get public key from key pair generated
     * 
     * @return
     * @throws NoSuchAlgorithmException
     */
    public PublicKey getPublicKey() throws NoSuchAlgorithmException {
        if (mPublicKey == null) {
            generateKeyPair();
        }
        return mPublicKey;
    }

    private static void setPublicKey(PublicKey publicKey) {
        mPublicKey = publicKey;
    }

これは可能ですか、それとも暗号化で同じキーを共有して使用する必要がありますか?

主な目的はこれです。

暗号化されたデータを相互に送受信できる 2 つのクライアントを用意します。

クライアント A が暗号化されたデータを受信するには:

クライアント B がクライアント A の公開鍵を要求します。クライアント B は文字列を暗号化してクライアント A に送信します。クライアント A はこの暗号化された文字列を受信し、独自の秘密鍵を使用して復号化します。

クライアント B が暗号化されたデータを受信したい場合は、その逆です。

4

1 に答える 1

5

RSA 暗号化は、キーのモジュラスよりも小さいデータの暗号化にのみ使用できます。つまり、2048 ビットの RSA 公開鍵は 256 バイトのデータしか暗号化できません。このデータの一部はパディング バイトに必要なため、通常は、操作するスペースがさらに少なくなります。

通常、これはハイブリッド暗号化方式で解決されます。つまり、データ自体は一時的な対称セッション キーで暗号化され、セッション キーは受信者の公開キーで暗号化されます。暗号化されたデータと暗号化されたセッション キーの両方が受信者に送信されます。

この動作 (およびそれ以上) を実装する OpenPGP のようなものを検討することをお勧めします。BouncyCastle は、Java 用の OpenPGP 実装を提供します。

于 2013-05-20T13:49:40.353 に答える