RSA (より正確には、Java での RSA の実装) ではキーの長さよりも多くのデータを暗号化できないため、RSA を使用してファイルを暗号化することはできません。1024 ビットのキーの場合、1024 ビット、つまり 128 バイトしか暗号化できません (実際には、パディングの理由から少し少なくなります)。
どのような場合でも、公開鍵アルゴリズム(非対称暗号化) を使用して大量のデータを暗号化することは、主に 2 つの理由からお勧めできません。
これは、 RSA を使用して大量のデータを暗号化するための実用的で適切かつ安全な暗号化モード/パディングではありません (つまり、それを行うのは実際には安全ではありません)。
公開キー アルゴリズムでは、安全性を確保するために大きなキー (1024 ビット、2048 ビット) が必要なため、対称キー アルゴリズム (安全性を確保するために必要なのは 128 ~ 256 ビットのキーのみ) よりもはるかに低速です。
RSA のみを使用して大量のデータを暗号化してはならない理由について詳しく知りたい場合は、次の 2 つの素晴らしい stacktexchange の投稿を参照してください。
大量のデータを暗号化する場合の標準的な方法は、セッション キー (一度使用される暗号的に安全な乱数) を生成することです。公開鍵でセッション鍵を暗号化します。次に、暗号化されていないセッション キーを使用して、対称アルゴリズム (AES など) でファイル (大量のデータ) を暗号化します。次に、暗号化されたセッション キーと暗号化されたデータをまとめて最終ファイルに保存します。これが、PGP (または GnuPG) が暗号化されたメールを送信するときの処理方法です。SSL/TLS も同様に機能します。
最後に、暗号化を適切に使用することは複雑です (暗号化モード、パディングなど、ほとんどすべてがセキュリティ上の欠陥を引き起こす可能性があります)。暗号の問題。
一般的なプロセスを示すコードは次のとおりです。
// 1. Generate a session key
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128)
SecretKey sessionKey = keyGen.generateKey();
// 2. Encrypt the session key with the RSA public key
Cipher rsaCipher = Cipher.getInstance("RSA");
rsaCipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey)
byte[] encryptedSessionKey = rsaCipher.doFinal(sessionKey.getEncoded());
// 3. Encrypt the data using the session key (unencrypted)
Cipher aesCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
aesCipher.init(Cipher.ENCRYPT_MODE, sessionKey); <-- sessionKey is the unencrypted
// session key.
// ... use aesCipher to encrypt your data
// 4. Save the encrypted data along with the encrypted
// session key (encryptedSessionKey).
// PLEASE NOTE THAT BECAUSE OF THE ENCRYPTION MODE (CBC),
// YOU ALSO NEED TO ALSO SAVE THE IV (INITIALIZATION VECTOR).
// aesCipher.aesCipher.getParameters().
// getParametersSpec(IvParameters.class).getIV();