RSAは公開鍵暗号システムであり、大きな数の素因数分解の計算複雑性に基づいて暗号化とデジタル署名を提供します。NIST Special Publication 800-56B Rev. 2(2023)によると、2048ビットの鍵長を持つRSAは、政府および商用システムのセキュリティ標準として残っています。このアルゴリズムはTLSプロトコル、デジタル署名、モバイルアプリケーションのデータ暗号化で広く使用されています。
重要なポイント
RSAは1977年にロン・リベスト、アディ・シャミア、レオナルド・エーデルマンによって開発された公開鍵暗号アルゴリズムです。名前は著者の姓の最初の文字から形成されています。このアルゴリズムは、暗号化鍵と復号鍵が異なる最初の実用的に適用可能な非対称暗号システムとなりました。
RSAアルゴリズムは1977年にScientific American誌で発表され、ホイットフィールド・ディフィーとマーティン・ヘルマンによる公開鍵暗号に関する初期の研究に基づいています。マサチューセッツ工科大学は1983年にRSAの特許を取得し、2000年まで有効でした。RSA Laboratoriesの報告書(2023)によると、このアルゴリズムは世界で最も広く普及している暗号標準の1つであり続けており、毎日何十億ものデバイスで使用されています。
同じ鍵を暗号化と復号の両方に使用する対称暗号とは異なり、RSAは数学的にリンクされた鍵のペアで動作します。公開鍵はシステムを危険にさらすリスクなく誰でも公開できます。秘密鍵は所有者のみが知り、ネットワーク上で送信されることはありません。IBM Security X-Force Threat Intelligence Index(2024)の調査によると、最新の安全なデータ送信プロトコルの96%で非対称暗号化が使用されています。
RSAのセキュリティは素因数分解問題に基づいています。つまり、2つの大きな素数の積を因数に分解することです。それぞれ1024ビットの素数pとqを選択すると、その積nは2048ビットになります。現代の手法でnのみを知ってpとqを計算することは事実上不可能です。CNRSの専門家評価(2024)によると、RSA-2048を解読するには従来のコンピューターで3000億年以上の計算が必要です。
鍵生成からメッセージの暗号化と復号までのRSAの完全なワークフローを考えてみましょう。これらの段階を理解することは、モバイルアプリケーションでアルゴリズムを正しく実装するために必要です。
プロセスは2つの大きな素数pとqの選択から始まります。鍵長を決定する法n = p x qが計算されます。次にオイラーのトーシェント関数phi(n) = (p-1)(q-1)が計算されます。phi(n)と互いに素な公開指数eが選択されます。秘密指数dはeの法phi(n)に関するモジュラ乗法逆数として計算されます。NIST SP 800-56B Rev. 2によると、適切な保護を確保するにはnの最小長は2048ビットでなければなりません。
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.SecureRandom;
public class RSAKeyGenerator {
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, new SecureRandom());
return generator.generateKeyPair();
}
}
メッセージmを暗号化するには、送信者はそれをnより小さい整数に変換し、暗号文c = m^e mod nを計算します。受信者は秘密鍵dを使用して元のメッセージを復元します:m = c^d mod n。RSAはパフォーマンスが低いため、大量のデータの暗号化を目的としていないことに注意することが重要です。最大メッセージサイズは鍵長からオーバーヘッドバイトを引いたもの(OAEPを使用したRSA-2048の場合約190バイト)に等しくなります。
import javax.crypto.Cipher;
import java.security.PublicKey;
import java.util.Base64;
public class RSAEncryptor {
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
}
RSAはデジタル署名の作成にも使用されます。これはデータの信頼性と完全性を検証するメカニズムです。所有者は自分の秘密鍵でメッセージハッシュに署名し、誰でも公開鍵を使用して署名を検証できます。Sectigo Certificate Transparency報告書(2025)によると、インターネット上のTLS証明書の85%以上がデジタル署名にRSAを使用しており、このアルゴリズムはウェブ通信の信頼の基盤となっています。
import java.security.Signature
fun signData(data: ByteArray, privateKey: java.security.PrivateKey): ByteArray {
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey)
signature.update(data)
return signature.sign()
}
fun verifySignature(
data: ByteArray, signedData: ByteArray, publicKey: java.security.PublicKey
): Boolean {
val signature = Signature.getInstance("SHA256withRSA")
signature.initVerify(publicKey)
signature.update(data)
return signature.verify(signedData)
}
鍵長はRSAの暗号強度に直接影響します。計算能力が向上するにつれて、最小許容鍵サイズは国際標準化機関によって定期的に見直されます。NISTやその他の規制機関からの現在の推奨事項を確認しましょう。
| 鍵長 | 対称暗号換算 | ステータス |
|---|---|---|
| 1024ビット | 80ビット | 2023年以降禁止 |
| 2048ビット | 112ビット | 最小標準 |
| 3072ビット | 128ビット | 新システムに推奨 |
| 4096ビット | 256ビット | 機密データ用 |
RSAの鍵長を増やすと、操作の実行時間に大きな影響を与えます。4096ビットの鍵を生成するには、2048ビットの鍵の約10倍の時間がかかります。より長い鍵を使用した暗号化および復号操作にはより多くの計算リソースが必要であり、電力消費が制限されているモバイルデバイスにとって重要です。
量子コンピューティングの発展に伴い、RSAはショアのアルゴリズムを使用して多項式時間で解読される可能性があります。1994年にピーター・ショアによって提案されたこのアルゴリズムは、O((log n)^3)の演算で大きな数を素因数分解できます。IBM Quantum Roadmap(2025)によると、RSA-2048の実用的な解読は2035年より前には期待されていませんが、NISTはすでに耐量子アルゴリズムCRYSTALS-KyberとCRYSTALS-Dilithiumへの段階的な移行を推奨しています。
RSAは、安全なデータ送信、サーバー認証、デジタルトランザクションの保護を確保するためにモバイルアプリケーションで積極的に使用されています。統合は両方の主要プラットフォームの標準暗号APIを通じて行われます。
AndroidプラットフォームはAndroid Keystoreを提供します。これはTrusted Execution Environmentハードウェアレベルで保護されたシステム暗号鍵ストレージです。KeyStoreで生成されたRSA鍵は、アプリケーションが侵害されてもデバイスから抽出できません。これにより、ルートアクセスを持つマルウェアを含む幅広い攻撃から保護されます。
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyPairGenerator
fun generateKeyInAndroidKeystore() {
val generator = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA,
"AndroidKeyStore"
)
val spec = KeyGenParameterSpec.Builder(
"rsa_key_pair",
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setKeySize(2048)
.setBlockModes(KeyProperties.BLOCK_MODE_ECB)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.build()
generator.initialize(spec)
val keyPair = generator.generateKeyPair()
}
iOSでは、RSAはA7チップ以降のデバイスでSecure EnclaveにアクセスするSecurity Frameworkを通じて処理されます。Secure Enclaveはメインプロセッサから分離された専用コプロセッサであり、暗号操作を実行し、鍵をハードウェアボールトに保存します。RSA鍵はSecure Enclave内とソフトウェアKeychainの両方で、さまざまなアクセスレベルで生成できます。
実際のモバイルアプリケーションでは、大きなデータの直接暗号化にRSAが使用されることはほとんどありません。標準的な方法はハイブリッドスキームです。アプリケーションがAESセッション鍵を生成し、サーバーのRSA公開鍵で暗号化してサーバーに送信します。以降のすべてのトラフィックはAESで暗号化され、RSAを介した直接データ送信よりも100〜1000倍高速です。
他の暗号アルゴリズムと同様に、RSAには安全なシステムを設計する際に考慮しなければならない長所と短所があります。客観的な評価は、特定のタスクに適したツールを選択するのに役立ちます。
RSAの主な利点は、根本的な鍵配布問題を解決することです。公開鍵はシステム全体を危険にさらすリスクなく自由に公開できます。アルゴリズムの汎用性は、単一の鍵ペアで暗号化とデジタル署名の両方をサポートすることに現れています。さらに、RSAには広範なサポートエコシステムがあり、すべての言語とプラットフォームでライブラリが利用可能です。
RSAの主な欠点は、対称アルゴリズムと比較してパフォーマンスが低いことです。最新のモバイルプロセッサでのRSA-2048の復号には約5〜15ミリ秒かかりますが、AES-256は同じ時間でギガバイトのデータを処理します。また、RSAはショアのアルゴリズムを介した量子攻撃に対して脆弱であり、長期的なデータ保護が必要なシステムでの使用が制限されます。
モバイルプロジェクトの場合、NISTの専門家は次のように推奨しています。RSAは鍵の暗号化とデジタル署名にのみ使用し、新しいプロジェクトでは少なくとも3072ビットの鍵長を選択し、RSAをAESとハイブリッドスキームで組み合わせ、長期的な計画移行のために耐量子標準の開発を監視します。
よくある質問
RSAは、少量のデータとデジタル署名の暗号化に使用される鍵ペアを持つ非対称アルゴリズムです。AESは単一の共有鍵を持つ対称アルゴリズムで、RSAよりも100〜1000倍高速に動作します。最新のシステムではこれらが組み合わされ、RSAがAESセッション鍵の送信を保護し、AESがメイントラフィックを暗号化します。
2023年以降の最小安全サイズはNIST SP 800-131A Rev. 2に従ってRSA-2048です。1024ビットの鍵は米国政府システムでは公式に禁止されています。新しいプロジェクトでは3072ビットが推奨されており、セキュリティマージンと128ビット対称暗号化と同等の強度を提供します。
はい、RSAはモバイルアプリケーションで広く使用されています。AndroidはRSA鍵のハードウェア生成と安全な保存のためにAndroid KeyStoreを提供しています。iOSはSecure Enclaveサポート付きのSecurity Frameworkを提供しています。大きなデータの暗号化には、RSAがセッション鍵のみを暗号化するハイブリッドRSA + AESスキームが推奨されます。
従来のコンピューターでは、RSA-2048の解読は事実上不可能です。現在の推定によると、継続的な計算で3000億年以上かかります。しかし、十分な量子ビットを持つ量子コンピューターは、ショアのアルゴリズムを使用してRSA-2048を数分で解読できます。IBMの推定によると、そのようなコンピューターは2035年より前には登場しません。
非対称アルゴリズムの中では、ECC(楕円曲線暗号)が人気で、より短い鍵長で同等のセキュリティを提供します。256ビットECCはRSA-3072に相当します。耐量子時代に向けて、NISTは2024年に暗号化用にCRYSTALS-Kyber、デジタル署名用にCRYSTALS-Dilithiumを選択しました。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。