PKIを実装しようとしています。バウンシーキャッスルを使用せずに、JavaでRSAを使用して大きな文字列を暗号化したい。私が得ている問題は、データは117バイトを超えてはならないということです。失敗した解決策を探してみました。私はこの暗号化の初心者です。例として大きな文字列を挙げて説明してください。
2 に答える
一度に約 128 バイトを超えて RSA 暗号化復号化を使用することはできません。データを分割してループで実行し、バイトを文字列/配列に書き込む必要があります。唯一の問題がデータのサイズである場合は、おそらくそれ以上のことはありません。データを分割するだけです。
128 バイトを超える文字列を処理する、おそらくより完全な例: http://www.stellarbuild.com/blog/article/encrypting-and-decrypting-large-data-using-Java-and-rsa
一般的な RSA 暗号化についてさらに説明が必要な場合:
次のコードは、KeyPairGenerator を使用して Java で RSA キーペアを生成する方法を示しています。
// Get an instance of the RSA key generator
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
// Generate the keys — might take sometime on slow computers
KeyPair myPair = kpg.generateKeyPair();
これにより、秘密鍵と公開鍵の 2 つの鍵を保持する KeyPair オブジェクトが得られます。これらの鍵を利用するには、Cipher オブジェクトを作成する必要があります。これは、SealedObject と組み合わせて使用され、ネットワーク経由で終了するデータを暗号化します。その方法は次のとおりです。
// Get an instance of the Cipher for RSA encryption/decryption
Cipher c = Cipher.getInstance("RSA");
// Initiate the Cipher, telling it that it is going to Encrypt, giving it the public key
c.init(Cipher.ENCRYPT_MODE, myPair.getPublic());
Cipher を初期化したら、データを暗号化する準備が整いました。暗号化後、結果として得られるデータが「裸」であると意味をなさないため、それらを別のオブジェクトにカプセル化する必要があります。Java は、SealedObject クラスによってこれを提供します。SealedObjects は暗号化されたオブジェクトのコンテナーであり、Cipher オブジェクトを使用してコンテンツを暗号化および復号化します。
次の例は、SealedObject のコンテンツを作成して暗号化する方法を示しています。
// Create a secret message
String myMessage = new String("Secret Message");
// Encrypt that message using a new SealedObject and the Cipher we created before
SealedObject myEncryptedMessage= new SealedObject( myMessage, c);
結果のオブジェクトは暗号化されているため、心配することなくネットワーク経由で送信できます。データを解読して取得できるのは、秘密鍵を保持している人物だけです。通常、これはサーバーです。メッセージを復号化するには、Cipher オブジェクトを再初期化する必要がありますが、今回は別のモードで復号化し、公開鍵の代わりに秘密鍵を使用します。
Java でこれを行う方法は次のとおりです。
// Get an instance of the Cipher for RSA encryption/decryption
Cipher dec = Cipher.getInstance("RSA");
// Initiate the Cipher, telling it that it is going to Decrypt, giving it the private key
dec.init(Cipher.DECRYPT_MODE, myPair.getPrivate());
Cipher を復号化する準備ができたので、SealedObject に保持されているデータを復号化するように指示する必要があります。
// Tell the SealedObject we created before to decrypt the data and return it
String message = (String) myEncryptedMessage.getObject(dec);
System.out.println("foo = "+message);
getObject メソッドを使用するときは注意してください。これは、暗号化前のクラスのインスタンスではなく、オブジェクトのインスタンス (実際には文字列のインスタンスであっても) を返すため、そのメソッドにキャストする必要があります。前のフォーム。
RSA は、一括データ暗号化を目的としていません。代わりに、AES などの対称暗号を使用して、「大きな文字列」を暗号化します。次に、AES に使用される対称キーを RSA キーで暗号化します。
BouncyCastle は、これを行うために S/MIME と PGP の 2 つのプロトコルをサポートしています。すべての適切なプライバシー プロトコルは、この方法でキー転送またはキー交換に非対称アルゴリズムを使用します。
RSA で暗号化できるメッセージ サイズは、キーのモジュラスによって異なりますが、メッセージを安全にパディングするために必要なバイト数は少なくなります。