RSA — یک سامانه رمزنگاری با کلید عمومی است که رمزنگاری و امضای دیجیتال را بر اساس پیچیدگی محاسباتی فاکتورگیری اعداد بزرگ فراهم میکند. بر اساس NIST Special Publication 800-56B Rev. 2 (2023)، RSA با طول کلید 2048 بیت استاندارد امنیت برای سیستمهای دولتی و تجاری باقی مانده است. این الگوریتم به طور گسترده در پروتکلهای TLS، امضاهای دیجیتال و رمزنگاری دادهها در برنامههای موبایل استفاده میشود.
نکات اصلی
RSA — یک الگوریتم رمزنگاری با کلید عمومی است که در سال 1977 توسط رونالد ریوست، آدی شامیر و لئونارد آدلمن توسعه یافت. نام از حروف اول نامهای خانوادگی نویسندگان تشکیل شده است. این الگوریتم اولین سامانه رمزنگاری نامتقارن عملاً قابل استفاده بود که در آن کلیدهای رمزنگاری و رمزگشایی متفاوت هستند.
الگوریتم RSA در سال 1977 در مجله Scientific American منتشر شد و بر اساس کارهای قبلی ویتفیلد دیفی و مارتین هلمن در زمینه رمزنگاری با کلید عمومی بود. مؤسسه فناوری ماساچوست در سال 1983 حق ثبت اختراع RSA را دریافت کرد که تا سال 2000 اعتبار داشت. طبق گزارش RSA Laboratories (2023)، این الگوریتم یکی از پرکاربردترین استانداردهای رمزنگاری در جهان باقی مانده است — روزانه در میلیاردها دستگاه استفاده میشود.
بر خلاف رمزهای متقارن که در آن یک کلید هم برای رمزنگاری و هم برای رمزگشایی استفاده میشود، RSA با یک جفت کلید مرتبط ریاضی عمل میکند. کلید عمومی میتواند بدون خطر به خطر افتادن سیستم برای همه منتشر شود. کلید خصوصی فقط برای مالک شناخته شده است و هرگز از طریق شبکه منتقل نمیشود. طبق مطالعه IBM Security X-Force Threat Intelligence Index (2024)، رمزنگاری نامتقارن در 96% پروتکلهای مدرن انتقال امن داده استفاده میشود.
امنیت RSA بر اساس مسئله فاکتورگیری — تجزیه حاصلضرب دو عدد اول بزرگ به عوامل — است. اگر اعداد اول p و q با طول 1024 بیت انتخاب شوند، حاصلضرب n آنها 2048 بیت خواهد بود. محاسبه p و q با دانستن تنها n با روشهای مدرن عملاً غیرممکن است: طبق ارزیابی کارشناسان CNRS (2024)، شکستن RSA-2048 به بیش از 300 میلیارد سال محاسبه بر روی رایانه کلاسیک نیاز دارد.
بیایید چرخه کامل کار RSA را از تولید کلید تا رمزنگاری و رمزگشایی پیام بررسی کنیم. درک این مراحل برای پیادهسازی صحیح الگوریتم در برنامههای موبایل ضروری است.
فرآیند با انتخاب دو عدد اول بزرگ p و q آغاز میشود. مدول n = p x q محاسبه میشود که طول کلید را تعیین میکند. سپس تابع اویلر phi(n) = (p-1)(q-1) محاسبه میشود. یک نماینده عمومی e انتخاب میشود که با phi(n) نسبت اول دارد. نماینده خصوصی 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 برای رمزنگاری حجمهای زیاد داده به دلیل عملکرد پایین طراحی نشده است — حداکثر اندازه پیام برابر با طول کلید منهای بایتهای سربار است (حدود 190 بایت برای RSA-2048 با OAEP).
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)، بیش از 85% گواهیهای TLS در اینترنت از 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 بیت حدود 10 برابر بیشتر از 2048 بیت زمان میبرد. عملیات رمزنگاری و رمزگشایی با کلید بلند به منابع محاسباتی بیشتری نیاز دارد که برای دستگاههای موبایل با مصرف انرژی محدود حیاتی است.
با توسعه محاسبات کوانتومی، RSA میتواند با استفاده از الگوریتم شور در زمان چندجملهای شکسته شود. این الگوریتم که توسط پیتر شور در سال 1994 ارائه شد، امکان فاکتورگیری اعداد بزرگ را در زمان O((log n)^3) عملیات فراهم میکند. طبق IBM Quantum Roadmap (2025)، شکست عملی RSA-2048 پیش از سال 2035 انتظار نمیرود، با این حال NIST در حال حاضر انتقال تدریجی به الگوریتمهای پساکوانتومی CRYSTALS-Kyber و CRYSTALS-Dilithium را توصیه میکند.
RSA به طور فعال در برنامههای موبایل برای تأمین انتقال امن دادهها، تأیید اصالت سرورها و حفاظت از تراکنشهای دیجیتال استفاده میشود. یکپارچهسازی از طریق APIهای رمزنگاری استاندارد هر دو پلتفرم اصلی انجام میشود.
پلتفرم اندروید Android Keystore — انبار سیستم کلیدهای رمزنگاری محافظت شده در سطح سختافزاری Trusted Execution Environment را فراهم میکند. کلیدهای RSA تولید شده در KeyStore حتی در صورت به خطر افتادن برنامه از دستگاه قابل استخراج نیستند. این امر محافظت در برابر طیف وسیعی از حملات از جمله بدافزار با دسترسی root را فراهم میکند.
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 از Security Framework با دسترسی به Secure Enclave در دستگاههای دارای تراشه A7 و جدیدتر استفاده میشود. Secure Enclave یک پردازنده کمکی اختصاصی جدا شده از پردازنده اصلی است که عملیات رمزنگاری را انجام میدهد و کلیدها را در محفظه سختافزاری ذخیره میکند. کلیدهای RSA میتوانند هم در داخل Secure Enclave و هم در Keychain نرمافزاری با سطوح مختلف دسترسی تولید شوند.
در برنامههای موبایل واقعی، RSA به ندرت برای رمزنگاری مستقیم دادههای بزرگ استفاده میشود. روش استاندارد یک طرح ترکیبی است: برنامه یک کلید جلسه AES تولید میکند، آن را با کلید عمومی RSA سرور رمزنگاری میکند و به سرور ارسال میکند. تمام ترافیک بعدی با AES رمزنگاری میشود که 100–1000 برابر سریعتر از انتقال مستقیم داده از طریق RSA است.
مانند هر الگوریتم رمزنگاری، RSA نقاط قوت و ضعفی دارد که باید در طراحی سیستمهای امن در نظر گرفته شوند. ارزیابی عینی به انتخاب ابزار مناسب برای یک کار خاص کمک میکند.
مزیت اصلی RSA حل مسئله بنیادی توزیع کلید است — کلید عمومی را میتوان بدون خطر به خطر افتادن کل سیستم آزادانه منتشر کرد. جهانی بودن الگوریتم در پشتیبانی از هر دو رمزنگاری و امضای دیجیتال با یک جفت کلید آشکار میشود. علاوه بر این، RSA دارای اکوسیستم پشتیبانی گستردهای است: کتابخانهها برای همه زبانها و پلتفرمها در دسترس هستند.
عیب اصلی RSA عملکرد پایین در مقایسه با الگوریتمهای متقارن است. رمزگشایی RSA-2048 بر روی یک پردازنده موبایل مدرن حدود 5–15 میلیثانیه طول میکشد، در حالی که AES-256 گیگابایت داده را در همان زمان پردازش میکند. همچنین RSA در برابر حملات کوانتومی از طریق الگوریتم شور آسیبپذیر است که کاربرد آن را در سیستمهای با دوره حفاظت طولانیمدت داده محدود میکند.
برای پروژههای موبایل، کارشناسان NIST توصیه میکنند: RSA را فقط برای رمزنگاری کلیدها و امضاهای دیجیتال استفاده کنید، طول کلید حداقل 3072 بیت را برای پروژههای جدید انتخاب کنید، RSA را با AES در یک طرح ترکیبی ترکیب کنید و توسعه استانداردهای پساکوانتومی را برای مهاجرت برنامهریزی شده در چشمانداز بلندمدت دنبال کنید.
سوالات متداول
RSA — الگوریتم نامتقارن با جفت کلید که برای رمزنگاری حجمهای کوچک داده و امضاهای دیجیتال استفاده میشود. AES — الگوریتم متقارن با یک کلید مشترک که 100–1000 برابر سریعتر از RSA کار میکند. در سیستمهای مدرن آنها ترکیب میشوند: RSA از انتقال کلید جلسه AES محافظت میکند و AES ترافیک اصلی را رمزنگاری میکند.
حداقل اندازه امن از سال 2023 طبق NIST SP 800-131A Rev. 2 RSA-2048 است. کلیدهای 1024 بیت به طور رسمی برای سیستمهای دولتی ایالات متحده ممنوع شدهاند. برای پروژههای جدید 3072 بیت توصیه میشود که حاشیه امنیت و مقاومت معادل 128-بیتی رمزنگاری متقارن را فراهم میکند.
بله، RSA به طور گسترده در برنامههای موبایل استفاده میشود. اندروید Android KeyStore را برای تولید سختافزاری و ذخیره امن کلیدهای RSA فراهم میکند. iOS — Security Framework با پشتیبانی Secure Enclave. برای رمزنگاری دادههای بزرگ، طرح ترکیبی RSA + AES توصیه میشود که در آن RSA فقط کلید جلسه را رمزنگاری میکند.
در رایانههای کلاسیک، شکستن RSA-2048 عملاً غیرممکن است — طبق برآوردهای فعلی به بیش از 300 میلیارد سال محاسبه مداوم نیاز دارد. با این حال، یک رایانه کوانتومی با تعداد کافی کیوبیت میتواند RSA-2048 را در چند دقیقه با استفاده از الگوریتم شور بشکند. طبق برآورد IBM، چنین رایانهای پیش از 2035 ظاهر نخواهد شد.
در میان الگوریتمهای نامتقارن، ECC (Elliptic Curve Cryptography) محبوب است که امنیت معادل را با طول کلید کمتر فراهم میکند — ECC 256 بیتی معادل RSA-3072 است. برای عصر پساکوانتومی، NIST در سال 2024 CRYSTALS-Kyber را برای رمزنگاری و CRYSTALS-Dilithium را برای امضاهای دیجیتال انتخاب کرد.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید