تشفير البيانات وفك التشفير باستخدام مفتاح RSA العام والخاص التي تم إنشاؤها بواسطة OpenSSL في Java
ما هو RSA: تم تطوير خوارزمية تشفير المفاتيح العامة RSA في عام 1977 من قبل رون ريفست ، عدي شاميره ولين أديمان في (معهد ماساتشوستس للتكنولوجيا). تسمية RSA تأتي من الأسماء التي تطور ثلاثة منهم. RSA هي خوارزمية تشفير المفاتيح العامة الأكثر نفوذا في الوقت الحاضر. إنها قادرة على مقاومة جميع هجمات التشفير المعروفة حتى الآن وقد أوصى بها ISO كمعيار تشفير بيانات المفتاح العام. في الوقت الحاضر ، تستخدم طريقة التشفير هذه على نطاق واسع في الخدمات المصرفية عبر الإنترنت والتوقيعات الرقمية والمناسبات الأخرى. تعتمد خوارزمية RSA على حقيقة نظرية الأرقام البسيطة للغاية: من السهل جدًا مضاعفة رقمين كبيرتين كبيرتين ، ولكن كان من الصعب للغاية تحديد المنتج في ذلك الوقت ، بحيث يمكن الكشف عن المنتج كمفتاح تشفير.
ما هو OpenSSL: العديد من خوارزميات التشفير ، ومعايير البنية التحتية للمفاتيح العامة ، وبروتوكولات SSL ، وربما هذه الميزات المثيرة للاهتمام ستمنحك فكرة تنفيذ كل هذه الخوارزميات والمعايير. إذا كان الأمر كذلك ، أثناء التعبير عن إعجابك ، ما زلت لا أستطيع إلا أن أذكرك: هذه عملية شاقة. لم يعد هذا العمل بسيطًا مثل قراءة عدد قليل من دراسات التشفير ومستندات البروتوكول ، بل فهم كل تفاصيل كل هذه الخوارزميات والمعايير ووثائق البروتوكول ، وتنفيذ هذه التعريفات والعمليات واحدة تلو الأخرى مع أحرف C التي قد تكون على دراية بها. لا نعرف مقدار الوقت الذي ستحتاج إليه للقيام بهذه المهمة الممتعة والرهيبة ، لكنها بالتأكيد ليست قضية أو عامين. OpenSSL هي مجموعة خوارزمية تجمع بين العديد من خوارزميات الأمن ، التي كتبها رجلان عظماء ، إريك أ. يونغ وتيم ج. هدسون ، منذ عام 1995. من خلال أوامر أو مكتبات تطوير ، يمكننا بسهولة تنفيذ تطبيقات الخوارزمية العامة القياسية.
واحدة من خلفية التطبيق الافتراضية:
مع شعبية الإنترنت عبر الهاتف المحمول ، تظهر التطبيقات التي تم تطويرها للأجهزة المحمولة واحدة تلو الأخرى. غالبًا ما تكون هذه التطبيقات مصحوبة بوظائف تسجيل المستخدم والتحقق من كلمة المرور. هناك مخاطر خفية في الأمان في "نقل الشبكة" و "الوصول إلى سجل التطبيق". كلمات المرور هي بيانات حساسة للمستخدمين ، ويحتاج المطورون إلى اتخاذ احتياطات أمان قبل بدء التطبيق. قد يتسبب التعامل مع غير لائق في حدوث مشاكل مثل الهجمات الخبيثة من قبل منافسي الأعمال والتقاضي من قبل شركاء الطرف الثالث.
على الرغم من أن خوارزميات RSA لديها العديد من الفوائد ، لا يوجد مثال كامل على الإنترنت لتوضيح كيفية تشغيلها. اسمحوا لي أن أقدمه أدناه:
1. استخدم OpenSSL لإنشاء مفاتيح خاصة وعامة
أنا أستخدم نظام Linux ولديها حزمة OpenSSL مثبتة. يرجى التحقق من أن OpenSSL مثبت على جهازك. يجب أن تظهر المعلومات التالية عند تشغيل الأمر:
[Root@chaijunkun ~]# OpenSsl إصدار -a openssl 1.0.0 -fips 29 مارس 2010 بنيت على: الأربعاء 25 يناير 02:17:15 GMT 2012 النظام الأساسي: Linux -X86_64 الخيارات: BN (64،64) MD2 (INT) RC4 (16x ، int) des (idx ، -dopenssl_pic -dzlib -dopenssl_threads -d_reentrant -ddso_dlfcn -dhave_dlfcn_h -dkrb5_mit -m64 -dl_endian -durmio -wall -o2 -g -pipe -wall -wp ، -d_fortive_source = 2 -fexpections-fexcections-fexcections-fectections. -param = ssp -buffer -size = 4 -m64 -mtune = generic -wa ، -noexecstack -dmd32_reg_t = int -dopenssl_ia32_sse2 -dopenssl_bn_mass_mont -dsha1_asm -dsha256_asm -dsha512_ -dwhirlpool_asm openssldir: "/etc/pki/tls" محركات: Aesni Dynamic
قم أولاً بإنشاء المفتاح الخاص:
[root@chaijunkun ~]# openssl genrsa -out RSA_PRIVAL_KEY.PEM 1024 إنشاء مفتاح RSA الخاص ، 1024 بت معامل طويل ...
يتيح هذا الأمر OpenSSL إنشاء مفتاح خاص بشكل عشوائي ، وطول التشفير هو 1024 بت. يشير الطول المشفر إلى الحد النظري للحد الأقصى المسموح به "المعلومات المشفرة" المسموح به ، أي الحد الأقصى لطول النص العادي. مع زيادة هذه المعلمة (على سبيل المثال ، 2048) ، سيزداد طول النص العادي المسموح به أيضًا ، ولكنه سيؤدي أيضًا إلى زيادة سريعة في تعقيد الحوسبة. الطول الموصى به هو 1024 بت (128 بايت).
لنلقي نظرة على محتوى المفتاح الخاص:
[ROOT@chaijunkun ~]# CAT RSA_PRIVAL_KEY.PEM ----- بدء RSA المفتاح الخاص ----- MIICWWIBAAKBGQCHDZCJW/RWGFWNXUNBKP7/4E8W/UMXX2JK6QEEN69T6N2R1I/L MCYDT1XR/T2AHGOIXNQ5V8W4ICAAEAWI7AJARHTVX1UOH/2U378FSCEESEG8XDQ LL0GCFB1/TJKI2AITVSZXOTRS8KEGGU78F7VMDNGXILK3GDHNZHHD aogaaekk76cssp7k90mwywp18ghlzru+earft9bpv67cglg1owfbntfyqspvstfm u2lwn5hd/icv+egaj4folxdm43kt4wyznoabszckxs6urciu8nqafnuy4x phu2te7vi4ldkw9df1fya+dscslnadaun3ohb5jqgl+ls5ecqdufuxn3uqgykk znrkj0j6pypy27hrfromehgxbjnnapcq71szjqam7r3wilkfh935oqc4jqc4jdjnapcq71szjqam77r3wilkfh935oqc4jqc4jqc4jqc4jqcc4jqc4 ihysll9lakeawgh4jxxeiaufmsgjoi3qpjqgvumkx0w96mcpcwv3fsew7w1/msi sutkjp5bvjfffwfmahyljdp7w+nebwkbwjaybz/eb5naza4pxvmvmcakd8cukkdp7w egplwsji/mkhrb484xz2vyuiciwywnmfxpa3ydgqwskqdgy3rrl9lv8/aqjacjli ifigur ++ njxa8c4xy0czssoBj76k710wde1mpgwgwgqf1t+p+bcpjvady /ybxbd16qvixjvnt6qjababli6zx9gyrwnu6akpdahd8qjwonnfnlqhue4wepevkm cysg+ibs2ggsxntrzlwjlfx7vhmpqnttc8ynmx1kfw ==-end-end rs
المحتويات كلها أحرف ASCII قياسية ، مع علامات واضحة في البداية والنهاية ، وبيانات المفاتيح الخاصة الحقيقية هي أحرف غير منتظمة في الوسط.
تكميلي في 24 مارس 2015: سيقوم الملف الرئيسي بتخزين البيانات في النهاية من خلال ترميز BASE64. يمكنك أن ترى أن طول كل سطر من محتوى ملف المفتاح أعلاه منتظم للغاية. ويرجع ذلك إلى الأحكام الواردة في RFC2045: يجب تمثيل دفق الإخراج المشفر في خطوط لا تزيد عن 76 حرفًا لكل منهما. بمعنى أن البيانات التي تم ترميزها بواسطة BASE64 لن تتجاوز 76 حرفًا لكل سطر ، ويجب تقسيمها على صف للبيانات الطويلة للغاية.
بعد ذلك ، قم بإنشاء المفتاح العام بناءً على المفتاح الخاص:
[root@chaijunkun ~]# openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout كتابة مفتاح RSA
دعونا نلقي نظرة على محتويات المفتاح العام:
[root@chaijunkun ~]# cat rsa_public_leley /UMXX2JK6QEEN69T6N2R1I/LMCYDT1XR/T2AHGOIXNQ5V8W4ICAEAWAWI7AJARHT VX1UOH/2U378FSCEESEGEG8XDQLL0GCFB1/TJKI2AITVSZXOTRS8KEGGU8F7V7V7D xilk3gdhnzh+uoeqywidaqab ---- نهاية المفتاح العمومي ----
في هذا الوقت ، لا يمكن استخدام المفتاح الخاص مباشرة ، لذلك يلزم ترميز PKCS#8:
[root@chaijunkun ~]# openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
يشير الأمر إلى أن ملف المفتاح الخاص الإدخال هو RSA_PRIVAL_KEY.PEM ، وأن ملف المفتاح الخاص الإخراج هو PKCS8_RSA_PRIVAL_KEY.PEM ، ولا يتم استخدام أي تشفير ثانوي (-NOCrypt)
دعونا نلقي نظرة على ما إذا كان ملف المفتاح الخاص المشفر يختلف عن ملف المفتاح الخاص السابق:
[Root@chaijunkun ~]# Cat PKCS8_RSA_PRIVAL_KEY.PEM
----- ابدأ المفتاح الخاص ------- miicdqibadanbgkqhkig9w0baqefaascal8wggjbageaaGbakePnypd+taaxcfg 6dsqnv/h7zd9szfhaotqoqsfr23o3zhwl8uzzinpxgv9pydaacy6jc1dlxxbixxbixbixbixbixxbixxbixxbixxbixbix 1rcltolpgg1xhw44f/ztfvx+xwqriqbxcoqwxyj8hx9omojzqk1vlnc61gzyria ztvx/twym2bciwteb2gfoh66666grdlagmbaacgybp4qtvojkynut3sbdjtmkytb2gfoh666666666666666666666666666 u768sf9p0glxrtwyudwjavue0vhbi9wxmwztavafkcp8hxx4qzqph84td0zjcq3j dloegafjkiorgzq5fyk7ydbou1tljfv459c8dtu+lgsotd11 MBQ3C4CHMOOYV4UZKQJBANR+7FC3E6OZGQTOESQPSPQLJBSDF9E4EDFUOCCKJ DVVLOOAZVAIUP+H3FK4HXRPALINBEINBEHIIDHIUX2UCQQDCCHIPHFD4GC58YYCM 6leqkmoa+6ypfrb3oxyklbxcwx7dtbx+ayky5oqmnkeg+mw8xb8wadiul0/tb6cqqbhvp94hk0dmdinfvhlwyj3xy4pongsa8vcymjjjo 2Z9EKDFIOBBAWQP2DLDGUX2VXZ8BAKBYMUIH+KBSV76CNEDWLHFLQJLKGENVQTVX TB0TUW8AVLABAXW34/5SI+NUB1HMBGYTK/T/IFCECXPWLGO+E3PAKAGWLPNH0ZH fae7oaqkmad3xcny6ec180tae57hz6ks+sylkwb4ggzyacxc22vmtyksxhtueam 1nmlzi2zfuox ----- نهاية المفتاح الخاص ----
في هذه المرحلة ، تم إنشاء أزواج المفاتيح المتاحة. يستخدم المفتاح الخاص PKCS8_RSA_PRIVAL_KEY.PEM ، ويستخدم المفتاح العمومي RSA_Public_Key.pem.
تمت إضافته في 20 مايو 2014: واجهت مؤخرًا الحاجة إلى تشفير RSA ، ويطلب الطرف الآخر أن يتمكن فقط من استخدام ملف المفتاح الخاص الذي لم يتم ترميزه بواسطة PKCS رقم 8 الذي تم إنشاؤه في الخطوة الأولى. في وقت لاحق ، راجعت المستندات ذات الصلة وعلمت أن ملف المفتاح الخاص الذي تم إنشاؤه في الخطوة الأولى هو تنسيق PKCS#1. هذا التنسيق مدعوم بالفعل من قبل Java ، لكنني أكتب فقط سطرين من الكود:
RSAPRivateKeyStructure ASN1PrivKey = RSAPRivateKeyStructure ((ASN1Sequence) ASN1Sequence.frombyTearray (Prikeydata)) ؛ rsapRivaleKeySpec rsaprivkeyspec = new rsapRivaleKeySpec (Asn1privKey.getModulus () ، asn1privkey.getPrivationexponent ()) ؛ keyfactory keyfactory = keyfactory.getInstance ("RSA") ؛ privatekey prikey = keyfactory.generateprivate (rsaprivkeyspec) ؛ اقرأ أولاً ملف المفتاح الخاص لـ PKCS#1 (لاحظ أنك تقوم بإزالة محتوى التعليق في بداية علامة ناقص) ، ثم استخدم BASE64 لفك تشفير سلسلة القراءة للحصول على prikeydata ، وهي المعلمة في السطر الأول من التعليمات البرمجية. السطر الأخير يحصل على المفتاح الخاص. لا يوجد فرق في الاستخدام التالي.
المراجع: https://community.oracle.com/thread/1529240؟start=0&tstart=0
2. اكتب رمز Java لاختباره
التكميلي 23 فبراير 2012: تم تحديد JDK المعياري فقط في JCE (JCE (JCE (Java Cryptography Extension) هي مجموعة من الحزم التي توفر أطر عمل وتطبيقات للتشفير ، وتوليد المفاتيح والتفاوض ، ومصادقة الرسائل (MAC). واجهات ، ولكن يجب أن يتم توفير التطبيقات الداخلية من قبل أو طرف ثالث. الإصدارات ، يمكنك العثور على الإصدار المقابل في صفحة التنزيل السابقة.
لنلقي نظرة على الرمز الذي قمت بتطبيقه:
حزمة net.csdn.blog.chaijunkun ؛ استيراد java.io.bufferedreader ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.inputstreamreader ؛ استيراد java.security.invalidkeyexception ؛ استيراد java.security.keyfactory ؛ استيراد java.security.keypair ؛ استيراد java.security.keypairgenerator ؛ استيراد java.security.nosuchalgorithmexception ؛ استيراد java.security.securerandom ؛ استيراد java.security.Interfaces.rsapRivateKey ؛ استيراد java.security.interfaces.rsapublickey ؛ استيراد java.security.spec.invalidkeyspecexception ؛ استيراد java.security.spec.pkcs8encodedkeyspec ؛ استيراد java.security.spec.x509encodedKeySpec ؛ استيراد javax.crypto.badpaddingexception ؛ استيراد javax.crypto.cipher ؛ استيراد javax.crypto.illegalblocksizeexception ؛ استيراد javax.crypto.nosuchpaddingexception ؛ استيراد org.bouncycastle.jce.provider.bouncycastleProvider ؛ استيراد sun.misc.base64decoder ؛ الفئة العامة rsaencrypt {private static Final String default_public_key = "migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqchdzcjw/rwgfwnxunbkp7/4e8w" + "/r" + "/umxx2jk6qeen69t6n2r1i/lmcydt1xr/t2ahgoixnq5v8w4icaaenawi7ajarht" + "/r" + " "/r" + "xilk3gdhnzh + uoeqywidaqab" + "/r" ؛ Static Final Final String default_private_key = "miicdqibadanbgkqhkig9w0baqefaascal8wggjbageaogbakepnypd + taaxcfg" + "/r" + + "6dsqnv/h7zd9szfhaotqoqsfr23o3zhwl8uzzinpxgv9pycy6jc1dlxxbiijpp4" + "/r" + "1rcltolpgg1xhw44f/ztfvx + xwqriqbxcoqwxyj8hx9omojzqk1vlnc61gzyria" + "/r" + "ZTVX/TWYM2BCIWTEB2GFOH66GRDLAGMBAAECGYBP4QTVOJKYNUT3SBDJY/XWAETM" + "/R" + "U768SF9P0GLXRTWYUDWJAVUE0VHBI9WXMWZTAVAFKP8HXX4QZQPH84TD0ZJC3J" + "/R" + "dloegafjkiorgzq5fyk7ydbou1tljfv459c8dtzmtu + lgsotd11/v/jr4njxiudo" + "/r" + "/r" + "dvvloooazvthfaiup + h3fk4hxrpalinbehiidhiux2ucqdcchiphfd4gc58yycm" + "/r" + "6leqkmoa+6ypfrb3oxyklbxcwx7dtbx+ayky5oqmnkeg+mw8xb8wadiul0/tb6cq"+"/r"+ "farvakbhvp94hk0dmdinfvhlwyj3xy4pongsa8vcymj + asgtvjzjfnzxk4gijbja "/r" + "tb0tuw8avlabaxw34/5si + nub1hmbgytk/t/ifcepxpbwlgo + e3pakagwlpnh0zh" + "/r" + "fae7oaqkmad3xcny6ec180tae57hz6ks +" + "/r" + "1nmlzi2zfuox" + "/r" ؛ / *** المفتاح الخاص*/ private rsaprivatekey privatekey ؛ / *** المفتاح العمومي*/ الخاص rsapublickey publickey ؛ / *** مجموعة خاصة إلى String*/ Private Static Final Char [] Hex_char = {'0' ، '1' ، '2' ، '3' ، '4' ، '5 ،' 6 '،' 7 '،' 8 '،' 9 '،' a '،' b '،' d '،' e '،' f '؛ / *** احصل على المفتاح الخاص* @RETURN كائن المفتاح الخاص الحالي*/ public rsapRivateKey getPrivinKey () {return privatekey ؛ } / *** احصل على المفتاح العمومي* @REGRURN الحالي المفتاح العام* / public rsapublickey getPublicKey () {return publickey ؛ } / *** زوج مفتاح تم إنشاؤه عشوائيًا* / public void genkeypair () {keypairgenerator keypairgen = null ؛ Try {Keypairgen = KeyPairGenerator.getInstance ("RSA") ؛ } catch (nosuchalgorithMexception e) {e.printstacktrace () ؛ } keypairgen.initialize (1024 ، new Securerandom ()) ؛ keypair keypair = keypairgen.generatekeypair () ؛ this.privateKey = (rsApRivateKey) keypair.getPrivate () ؛ this.publickey = (rsapublickey) keypair.getPublic () ؛ } / *** قم بتحميل المفتاح العام من دفق الإدخال في الملف* param في دفق إدخال المفاتيح العامة* استثناء استثناء تم إنشاؤه عند تحميل المفتاح العام* / public void loadpublickey (inputStream in) استثناء {try {bufferedReader br = جديد bufferreaderer (inpectstreamereerer (in)) ؛ سلسلة readline = null ؛ StringBuilder sb = new StringBuilder () ؛ بينما ((readline = br.readline ())! = null) {if (readline.charat (0) == '-') {extre } آخر {sb.append (readline) ؛ sb.append ('/r') ؛ }} loadpublickey (sb.toString ()) ؛ } catch (ioException e) {رمي استثناء جديد ("خطأ قراءة بيانات المفاتيح العامة") ؛ } catch (NullPointerException e) {رمي استثناء جديد ("دفق إدخال المفتاح العمومي فارغ") ؛ }} / *** قم بتحميل المفتاح العام من سلسلة* param publickeystr public string* athrows استثناء استثناء تم إنشاؤه عند تحميل المفتاح العام* / public void publickey (String publickeystr) استثناء {try {base64decoder base64decoder = new base64decoder () ؛ byte [] buffer = base64decoder.decodeBuffer (publickeystr) ؛ keyfactory keyfactory = keyfactory.getInstance ("RSA") ؛ X509EncodEdKeySpec Keyspec = جديد X509EncodEdKeySpec (Buffer) ؛ this.publickey = (rsapublickey) keyfactory.generatepublic (keyspec) ؛ } catch (nosuchalgorithmexception e) {رمي استثناء جديد ("لا شيء خوارزمية") ؛ } catch (invalidKeySpecexception e) {رمي استثناء جديد ("المفتاح العمومي غير القانوني") ؛ } catch (ioException e) {رمي استثناء جديد ("خطأ في قراءة محتوى بيانات المفتاح العمومي") ؛ } catch (NullPointerException e) {رمي استثناء جديد ("بيانات المفتاح العمومي فارغ") ؛ }} / *** قم بتحميل المفتاح الخاص من الملف* param keyfilename اسم ملف المفتاح الخاص* return ما إذا كان ناجحًا* athrows استثناء* / public void loadprivatekey (inputStream in) استثناء {try {bufferedReader br = new Bufferreader (new inputstreamreader (in)) ؛ سلسلة readline = null ؛ StringBuilder sb = new StringBuilder () ؛ بينما ((readline = br.readline ())! = null) {if (readline.charat (0) == '-') {extre } آخر {sb.append (readline) ؛ sb.append ('/r') ؛ }} loadPrivateKey (sb.toString ()) ؛ } catch (ioException e) {رمي استثناء جديد ("خطأ قراءة بيانات المفتاح الخاص") ؛ } catch (NullPointerException e) {رمي استثناء جديد ("دفق إدخال المفاتيح الخاص هو فارغ") ؛ }} public void loadprivatekey (String privateKyStr) يلقي الاستثناء {try {base64decoder base64decoder = new Base64Decoder () ؛ byte [] buffer = base64decoder.decodeBuffer (privateKyStr) ؛ PKCS8ENCODEDKEYSPEC KEYSPEC = جديد PKCS8ENCODEDEKYSPEC (العازلة) ؛ keyfactory keyfactory = keyfactory.getInstance ("RSA") ؛ this.privateKey = (rsapRivateKey) keyfactory.generateprivate (keyspec) ؛ } catch (nosuchalgorithmexception e) {رمي استثناء جديد ("لا شيء هذه الخوارزمية") ؛ } catch (invalidKeySpecexception e) {رمي استثناء جديد ("مفتاح خاص غير قانوني") ؛ } catch (ioException e) {رمي استثناء جديد ("خطأ قراءة محتوى بيانات المفتاح الخاص") ؛ } catch (NullPointerException e) {رمي استثناء جديد ("بيانات المفاتيح الخاصة هي فارغة") ؛ }} / *** عملية التشفير* param publickey المفتاح العمومي* param plaintextdata data النص* return* therws استثناء معلومات استثناء خلال عملية التشفير* / public byte [] encrypt (rsapublickey publickey ، byte [] plaintextdata) يلقي استثناء {if publickey == null) } cipher cipher = null ؛ Try {Cipher = Cipher.getInstance ("RSA" ، New BouncyCastleProvider ()) ؛ cipher.init (cipher.encrypt_mode ، publickey) ؛ byte [] الإخراج = cipher.dofinal (plaintextData) ؛ إرجاع الإرجاع ؛ } catch (nosuchalgorithmexception e) {رمي استثناء جديد ("خوارزمية تشفير Nothis") ؛ } catch (nosuchpaddingexception e) {E.PrintStackTrace () ؛ العودة لاغية. } catch (invalidKeyException e) {رمي استثناء جديد ("مفتاح التشفير العام غير قانوني ، يرجى التحقق") ؛ } catch (includalblocksizeexception e) {رمي استثناء جديد ("طول placktext غير قانوني") ؛ } catch (badpaddingexception e) {رمي استثناء جديد ("بيانات placktext تالفة") ؛ } ستر تعيين")؛ } cipher cipher = null ؛ Try {Cipher = Cipher.getInstance ("RSA" ، New BouncyCastleProvider ()) ؛ cipher.init (cipher.decrypt_mode ، privatekey) ؛ البايت [] الإخراج = cipher.dofinal (cipherdata) ؛ إرجاع الإرجاع ؛ } catch (nosuchalgorithmexception e) {رمي استثناء جديد ("لا شيء خوارزمية فك التشفير") ؛ } catch (nosuchpaddingexception e) {E.PrintStackTrace () ؛ العودة لاغية. } catch (invalidKeyException e) {رمي استثناء جديد ("decryption المفتاح الخاص غير قانوني ، يرجى التحقق") ؛ } catch (includalBlockSeizeException e) {رمي استثناء جديد ("طول cryptotext غير قانوني") ؛ } catch (badpaddingexception e) {رمي استثناء جديد ("بيانات cryptotext تالفة") ؛ }} / *** بيانات البايت إلى سلسلة إدخال البيانات السداسية* param* محتوى hexadecimal hexadecimal* / السلسلة الثابتة العامة bytearraytoString (byte [] data) {StringBuilder StringBuilder = new StringBuilder () ؛ لـ (int i = 0 ؛ i <data.length ؛ i ++) {// أخرج الأرقام الأربعة العالية من البايت كفهرس للحصول على معرف سداسي عشري المقابل أن التحول الأيمن غير الموقّع stringbuilder.append (hex_char [(data [i] & 0xf0) >>> 4]) ؛ // أخرج الأجزاء الأربعة السفلية من البايت كفهرس للحصول على معرف سداسي عشري المقابل StringBuilder.append (Hex_char [(Data [i] & 0x0f)]) ؛ if (i <data.length-1) {stringBuilder.append ('') ؛ }} return stringBuilder.toString () ؛ } public static void main (string [] args) {rsaencrypt rsaencrypt = new rsaencrypt () ؛ //rsaencrypt.genkeypair () ؛ // تحميل المفتاح العام Try {rsaencrypt.loadpublickey (rsaencrypt.default_public_key) ؛ System.out.println ("تحميل المفتاح العام بنجاح") ؛ } catch (استثناء e) {system.err.println (e.getMessage ()) ؛ System.err.println ("فشل تحميل المفتاح العام") ؛ }. System.out.println ("تحميل المفتاح الخاص بنجاح") ؛ } catch (استثناء e) {system.err.println (e.getMessage ()) ؛ System.err.println ("فشل تحميل المفتاح الخاص") ؛ } // سلسلة اختبار سلسلة incryptstr = "سلسلة اختبار chaijunkun" ؛ حاول {// encrypt byte [] cipher = rsaencrypt.encrypt (rsaencrypt.getPublicKey () ، encryptstr.getbytes ()) ؛ // decrypt byte [] plaintext = rsaencrypt.decrypt (rsaencrypt.getPrivinKey () ، cipher) ؛ System.out.println ("طول ciphertext:"+ cipher.length) ؛ system.out.println (rsaencrypt.bytearraytostring (cipher)) ؛ System.out.println ("طول النص العادي:"+ plaintext.length) ؛ System.out.println (rsaencrypt.bytearraytostring (plaintext)) ؛ System.out.println (سلسلة جديدة (نص عادي)) ؛ } catch (استثناء e) {system.err.println (e.getMessage ()) ؛ }}} في الكود ، أقدم طريقتين لتحميل مفاتيح عامة وخاصة.
اقرأ بواسطة Dream: مناسبة لطريقة الحصول على inputStream بواسطة موارد فهرسة المعرف في تطبيقات Android ؛
اقرأ بالسلسلة: كما هو موضح في الكود ، قم بتخزين محتويات المفاتيح حسب السطر في ثوابت ثابتة واستيراد المفتاح حسب نوع السلسلة.
قم بتشغيل الرمز أعلاه وسيتم عرض المعلومات التالية:
1 64 57 C8 E3 46 A7 CE 57 31 AC CD 21 89 89 89 9F FD 22 87 9E DE B1 F4 E8 B2 الطول العادي: 22 54 65 73 74 20 53 74 72 69 67 20 63 61 61 69
في الوظيفة الرئيسية ، علقت "rsaencrypt.genkeypair ()" ، والتي تستخدم لإنشاء أزواج مفاتيح بشكل عشوائي (فقط توليد ، الاستخدام ، وليس المتجر). عند عدم استخدام مفتاح الملف ، يمكنك التعليق على الرمز الذي يقوم بتحميل المفتاح ، أو تمكين هذه الطريقة ، أو تشغيل الرمز.
الفرق بين تحميل مفتاح عام وتحميل مفتاح خاص هو أنه عندما يتم تحميل المفتاح العام ، X509EncodEdKeySpec (تعليمات مفتاح X509 المشفرة) ، وعندما يتم تحميل المفتاح الخاص ، PKCS8ENCODEDEDKEYSPEC (PKCS#8 تعليم مفتاح مشفر).
تمت إضافة في 22 فبراير 2012: أثناء تطوير برنامج Android ، وجد أن الكود أعلاه لم يعمل بشكل صحيح. السبب الرئيسي هو أن فئة Sun.Misc.base64Decoder غير موجودة في حزمة تطوير Android. لذلك ، تحتاج إلى البحث عن الكود المصدري لـ RT.JAR على الإنترنت. بالنسبة للرمز المصدري في SRC.ZIP الخاص بـ JDK ، فهذا جزء فقط من رمز المصدر في JDK ، ولا توجد رموز الفئات المذكورة أعلاه. بعد البحث والإضافة ، يعمل الرمز أعلاه بشكل جيد في تطبيقات Android. هذا يحتوي على الكود المقابل لهذه الفئة. بالإضافة إلى ذلك ، يعتمد هذه الفئة أيضًا على فئات ceformatexception و cestreamexhaugh و characterdecoder و characterencoder وتعريفات الاستثناء.
تمت إضافة في 23 فبراير 2012: في البداية ، كتبت هذا المقال لتنفيذ تشفير RSA وفك التشفير دون الاعتماد على أي حزم طرف ثالث ، لكنني واجهت مشاكل لاحقًا. نظرًا لأنه يجب إنشاء كائن تشفير في كل من طريقة التشفير وتشفير طريقة فك التشفير ، يمكن لهذا الكائن الحصول على مثيلات فقط من خلال getInstance. هناك نوعان منه: الأول هو تحديد الخوارزمية وليس المزود ؛ والثاني هو تحديد كليهما. في البداية ، لا يزال بإمكان الرمز تشغيل ، لكن ستجد أن نتيجة كل تشفير مختلفة. في وقت لاحق ، اكتشف أنه تم إنشاء المفتاح العام والخاص الذي يستخدمه كائن الشفرات بشكل عشوائي ، وليس المفتاح العام والخاص المحدد في الكود. من الغريب أن هذا الرمز الذي لا يحدد مزودًا يمكنه تشغيله عبر تطبيقات Android ، ونتيجة كل تشفير هي نفسها. أعتقد أنه بالإضافة إلى بعض وظائف تطوير النظام في نظام Android SDK ، فإنه ينفذ أيضًا وظائف JDK. ربما قدمت مقدمي الخدمات المقابلة في JDK الخاصة بها ، مما يجعل التشفير نتيجة نفس الشيء في كل مرة. عندما أضفت مزود Bouncycastle مثل رمز العينة على الإنترنت ، تكون نتائج كل تشفير هي نفسها.
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!