2012-11-21 13 views
12

私はPKIを実装しようとしています。私は弾力のある城を使用せずにJavaでRSAを使用して大きな文字列を暗号化したい。問題が発生しています。データは117バイトを超えてはいけません。私は失敗したソリューションのためにセイティングを試みました。私はこの暗号化の初心者です。一例として大きな文字列を与えて説明し、説明してください。RSAを使用してjavaの大きな文字列を暗号化および復号化する

+2

セキュリティ、特に暗号化は、** hard **です。未処理の暗号APIの代わりに既存の高水準パッケージを使用するか、動作する方法の詳細を知る必要があります。それ以外の場合は、安全でないコードを書く可能性があります。 – SLaks

+1

上位パッケージとは? –

+1

コードを投稿してください。そこから作業することができます。 – Frank

答えて

25

一度に約128バイトを超えるRSA暗号化復号化を使用することはできません。あなたは、データを分割して、ループの中でバイトをString/Arrayに書き込む必要があります。あなたの唯一の問題がデータのサイズであるならば、おそらくそれ以上のものはありません。ちょうどデータを分割する。あなたは一般的にはRSAの暗号化の詳細な説明が必要な場合はhttp://coding.westreicher.org/?p=23

:128バイトを超える文字列を扱う

おそらくより完全なあなたのための素晴らしい例、

次のコードは、どのように示していJavaでRSAキーペアを生成するためにするKeyPairGeneratorを使用します。

// 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つのキーを保持しているキーペアオブジェクト、提供します:プライベートと公開No. IC。これらのキーを使用するには、SealedObjectと組み合わせて使用​​してネットワーク経由で終了するデータを暗号化するCipherオブジェクトを作成する必要があります。これを行う方法は次のとおりです。

// 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()); 

今、暗号を解読する準備ができていることを、私たちが開催されたデータを復号化するためにする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メソッドを使用しているとき、それは、オブジェクトのインスタンスを返すので、(それが実際に文字列のインスタンスであっても)、注意してください、そしてない、それは暗号化の前にあったことを、クラスのインスタンスので、あなた」それを以前の形にキャストする必要があります。 http://andreas.louca.org/2008/03/20/java-rsa-encryption-an-example/

6

RSAは、バルクデータの暗号化のためのものではありません。

上からです。代わりに、AESのような対称暗号を使用して、「大きな文字列」を暗号化します。次に、AESに使用されている対称鍵をRSA鍵で暗号化します。

BouncyCastleは、S/MIMEとPGPという2つのプロトコルをサポートしています。すべての実用的なプライバシープロトコルは、このように鍵輸送または鍵交換のために非対称アルゴリズムを使用する。

RSAで暗号化できるメッセージサイズはキーの係数に依存し、メッセージを安全に埋め込むために必要なバイト数は少なくなります。

+0

このようなハイブリッド暗号化は、やり方です。 – CodesInChaos

+14

関連するAPIへのコード例やリンクは害を与えません。 – CodesInChaos

関連する問題