web-dev-qa-db-ja.com

RSAを使用してJavaの大きな文字列を暗号化および復号化する

PKIを実装しようとしています。 Javaバウンシーキャッスルを使用せずに、RSAを使用して大きな文字列を暗号化します。データが117バイトを超えてはいけません。この暗号化では、例として大きな文字列を指定して説明してください。

16
Mahesh Vemuri

一度に約128バイトを超えるRSA暗号化復号化を使用することはできません。データを分割し、ループ内でそれを行う必要があります。ほとんどの場合、文字列/配列にバイトを書き込みます。唯一の問題がデータのサイズである場合、おそらくこれ以上のことはありません。データを分割するだけです。

128バイトよりも大きい文字列を扱う素晴らしい例、おそらくより完全な例: http://coding.westreicher.org/?p=2

一般的な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オブジェクトを作成する必要があります。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()); 

暗号を初期化したら、データを暗号化する準備が整いました。暗号化されたデータは、「裸」に見えても意味をなさないため、別のオブジェクトにカプセル化する必要があります。 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メソッドを使用するときは、暗号化前のクラスのインスタンスではなく、オブジェクトのインスタンス(実際にはStringのインスタンスであっても)を返すため、注意してください。事前フォーム。

上記は: http://andreas.louca.org/2008/03/20/Java-rsa-encryption-an-example/

30
msj121

RSAは、バルクデータの暗号化を目的としていません。代わりに、AESなどの対称暗号を使用して「大きな文字列」を暗号化します。次に、AESに使用される対称キーをRSAキーで暗号化します。

BouncyCastleは、これを行うための2つのプロトコル、S/MIMEとPGPをサポートしています。賢明なプライバシープロトコルはすべて、この方法でキー転送またはキー交換に非対称アルゴリズムを使用します。

RSAで暗号化できるメッセージサイズは、キーのモジュラスに依存し、メッセージを安全にパディングするために必要なバイト数は減ります。

9
erickson