Шифрование и дешифрование данных с использованием RSA Public и Private Key, созданный OpenSSL в Java
Что такое RSA: алгоритм шифрования Public Key RSA был разработан в 1977 году Рон Ривест, Ади Шамирхом и Лен Адлман (Массачусетский технологический институт). Наименование RSA происходит от имен, которые развивают их трое. RSA является наиболее влиятельным алгоритмом шифрования открытых ключей в настоящее время. Он способен противостоять всем криптографическим атакам, известным до сих пор, и был рекомендован ISO в качестве стандарта шифрования данных открытого ключа. В настоящее время этот метод шифрования широко используется в онлайн -банке, цифровых подписях и других случаях. Алгоритм RSA основан на очень простом факте теории чисел: очень легко умножить два больших основных числа, но в то время было чрезвычайно трудно факторизировать продукт, поэтому продукт может быть раскрыт как ключ шифрования.
Что является OpenSSL: многочисленные криптографические алгоритмы, стандарты инфраструктуры открытых ключей и протоколы SSL, и, возможно, эти интересные функции дадут вам идею реализации всех этих алгоритмов и стандартов. Если это так, выражая ваше восхищение, я все еще не могу не напомнить вам: это сложный процесс. Эта работа больше не так проста, как чтение нескольких криптографических монографий и протокольных документов, а скорее понимание каждой детали всех этих алгоритмов, стандартов и документов протоколов, а также реализация этих определений и процессов один за другим с символами C, с которыми вы можете быть знакомы. Мы не знаем, сколько времени вам понадобится, чтобы сделать эту забавную и ужасную работу, но это, конечно, не год или два. OpenSSL - это коллекция алгоритмов, которая сочетает в себе многие алгоритмы безопасности, написанные двумя великими мужчинами, Эриком А. Янгом и Тим Дж. Хадсоном, с 1995 года. Благодаря командам или библиотекам развития мы можем легко реализовать стандартные приложения общественного алгоритма.
Один из моих гипотетических фона применения:
С популярностью мобильного Интернета приложения, разработанные для мобильных устройств, появляются один за другим. Эти приложения часто сопровождаются функциями регистрации пользователей и проверки пароля. Существуют скрытые опасности в безопасности в «передаче сети» и «доступе к журналу приложений». Пароли являются конфиденциальными данными для пользователей, и разработчики должны принимать меры предосторожности до запуска приложения. Неправильная обработка может вызвать такие проблемы, как злонамеренные атаки со стороны бизнес-конкурентов и судебные разбирательства сторонних партнеров.
Хотя алгоритмы RSA имеют так много преимуществ, в Интернете нет полного примера, чтобы проиллюстрировать, как их управлять. Позвольте мне представить его ниже:
1. Используйте OpenSSL, чтобы генерировать частные и общественные ключи
Я использую систему Linux и установил пакет OpenSSL. Пожалуйста, убедитесь, что OpenSSL установлен на вашей машине. Следующая информация должна отображаться при выполнении команды:
[root@chaijunkun ~]# openssl version -a openssl 1.0.0.0 -fips 29 марта 2010 г. Построен в: ср. -Dopenssl_pic -dzlib -dopenssl_threads -d_reentrant -ddso_dlfcn -dhave_dlfcn_h -dkrb5_mit -m64 -dl_endian -dtermio -wall -O2 -g -pipe -wall -wp -Wp, -d_fortif -Парам = ssp -buffer -size = 4 -m64 -mtune = generic -wa, -noexecstack -dmd32_reg_t = int -dopenssl_ia32_sse2 -dopenssl_bn_asm_mont -dsha1_asm -dsha256_asma512_asmont_asm_asm_asm_asm_asm_asm_asm_asm_asm_asm_asm -Dwhirlpool_asm openssldir: "/etc/pki/tls" Двигатели: динамика aesni
Сначала генерируйте закрытый ключ:
[root@chaijunkun ~]# openssl genrsa -out rsa_private_key.pem 1024 Генерация приватного ключа RSA, 1024 -битный модуль длиной .................. +++++ .. +++++++ E -65537 (0x10001)
Эта команда позволяет openssl случайным образом генерировать закрытый ключ, а длина шифрования составляет 1024 бит. Зашифрованная длина относится к теоретическому пределу максимально допустимой длины «зашифрованной информации», то есть предела длины простого текста. По мере увеличения этого параметра (например, 2048) допустимая длина открытого текста также увеличится, но также приведет к быстрому увеличению сложности вычислений. Рекомендуемая длина составляет 1024 бита (128 байтов).
Давайте посмотрим на содержание частного ключа:
[root@chaijunkun ~]# cat rsa_private_key.pem ----- begin rsa private-ключ ----- miicwwibaakbgqchdzcjw/rwgfwnxunbkp7/4e8w/umxx2jk6qeen69t6n2r1i/l mcydt1xr/t2ahgoixnq5v8w4icaaenawi7ajarhtvx1uoh/2u378fsceeseg8xdq ll0gcfb1/tjki2aitvszxotrs8kguggu78f7vmdngxilk3gdhnzhtrs8kgu78f7vmdngxilk3gdhnzhtrs8fgugugu78f7vmdngxilk3gdhnzhtrs8 Aogaaekk76cssp7k90mwywp18ghlzru+efhft9bpv67cglg1owfbntfyqspvstfm u2lwn5hd/icv+egaj4fxdm43kt4wyznoabszckkxs6urciu8nqafnuy4xVeOfx Phu2te7vi4ldkw9df1fya+dscslnadaun3ohb5jqgl+ls5ecqqdufuxxn3uqgykk znrkj0j6py27hrfromehgxbjnnapcq71szjqam77r3wilkfh935oiv0aqck4 iHySll9lakeAwgh4jxxxeiaufmsgjoi3qpjqgvumkx0w96mcpcwv3fsew7w1/msi sutkjp5bbvjfvfwfmahyljdp7w+nebwkbwjaybz/eb5naza4pxvr5vmcd8cukaj4 Egplwsji/mkhrb484xz2vyuiciwywnmfxpa3ydgqwskqdgy3rrl9lv8/aqjacjli ifigur ++ njxa8c4xy0czsobj76k710wde1mpgr5wgqf1t+p+bcpdyzmv -wadyzmv -wadyzmv -wadyzmv -vdyzmv /ybxbd16qvixjvnt6qjabli6zx9gyrwnu6akpdahd8qjwonnnfnlqhue4wepevkm cysg+ibs2ggsxntrzlwjlfx7vhmpqnttc8x1kfw == -----
Все содержимое представляют собой стандартные символы ASCII, с очевидными оценками в начале и конечных линиях, а реальные данные личного ключа являются нерегулярными символами в середине.
Дополнительный 24 марта 2015 года: ключевой файл в конечном итоге будет хранить данные через кодирование Base64. Вы можете видеть, что длина каждой строки содержимого файла вышеупомянутого ключа очень регулярно. Это связано с положениями в RFC2045: кодированный выходной поток должен быть представлен в строках не более 76 символов. То есть данные, кодируемые Base64, не будут превышать 76 символов на строку, и их необходимо разделить на ряд для сверхпрочных данных.
Далее генерируйте открытый ключ на основе закрытого ключа:
[root@chaijunkun ~]# openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout writing rsa -ключ
Давайте посмотрим на содержимое открытого ключа:
[root@chaijunkun ~]# cat rsa_public_ley.pem ----- начинается открытый ключ ----- migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqchdzcjw/rwgfwnxunbkp7/4e8w /Umxx2jk6qeen69t6n2r1i/lmcydt1xr/t2ahgoixnq5v8w4icaeanawi7ajarht vx1uoh/2u378fsceeseg8xdqll0gcfb1/tjki2aitvszcotrs8kguggugugugugugugugugugugugugugugugugugugral0gcfb1/tjki2aitvszszcotrs8kgugugugugugugugugugugugugugugugugugral0gcfb1 Xilk3gdhnzh+uoeqywidaqab ---- конечный открытый ключ ----
В настоящее время закрытый ключ не может быть использован напрямую, поэтому требуется кодирование PKCS#8:
[root@chaijunkun ~]# openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt
Команда указывает, что файл ввода частного ключа-это RSA_PRIVATE_KEY.PEM, а выходной файл закрытого ключа-PKCS8_RSA_PRIVATE_KEY.PEM, и не используется вторичное шифрование (-nocrypt)
Давайте посмотрим, отличается ли кодированный файл частного ключа от предыдущего файла закрытого ключа:
[root@chaijunkun ~]# cat pkcs8_rsa_private_key.pem
----- Begin Private Key ----- miicdqibadanbgkqhkig9w0baqefaascal8wggjageaaogbakepnypd+taaxcfg 6dsqnv/h7zd9szfhaotqoqsfr23o3zhwl8UzzInpxgv9paicy6jc1dlxxbijpp4 1rcltolpgg1xhw44f/ztfvx+xwqriqbxcoqwxqyj8hx9omojzqk1vlnc61gzyria ztvx/twym2bciwteb2gfoh66grdlagmbaaecgybp4qtvojkynut3sbdjy/xwaetm. U768SF9P0GLXRTWYUDWJAVUE0VHBI9WXMWZTAVAFKCP8HXX4QZPH84TD0ZJCQ3J DLOEGAFJKOIORGZQ5FYK7YDBOU1TLJFV459C8DTZMTU+LGSOTD11/v/jxIUD4 MBQ3C4CHMOOYV4UZKQJBANR+7FC3E6OSGQTOESQPSPQLJBSDF9E4X4EDFUOECCKJ DVVLOOOAZVTHFAIUP+H3FK4HXRPALINBEHIIDHIUX2UCQDCCHIPHFD4GC58YYCM. 6LEQKMOA+6YPFRB3OXYKLBXCWX7DTBX+AYKY5OQMNKEG+MW8XB8WADIUL0/TB6CQ FARVAKBHVP94HK0DMDINFVHLWYJ3XY4PONGSA8VCYMJ+ASGTVJZJFXK4 2z9ekdfiobbawqp2dldgux2vxz8bakbymuih+kbsv76cnedwlhflqjlkgenvqtvx tb0tuw8avlabaxw34/5si+nub1hmbgytk/t/ifcepxpbwlgo+e3pakagwlpnh0zhtk/t/ifcepxpbwlgo+e3pakagwlpnh0zh FAE7OAQKMAD3XCNY6EC180TAE57HZ6KS+SYLKWB4GGZYACXC22VMTYKSXHTUEAMO 1NMLZI2ZFUOX ----- END Private Key -------
На этом этапе были сгенерированы доступные пары ключей. Частный ключ использует pkcs8_rsa_private_key.pem, а открытый ключ использует rsa_public_key.pem.
Добавлено 20 мая 2014 года: недавно я столкнулся с необходимостью шифрования RSA, а другая сторона требовала, чтобы они могли использовать только файл закрытого ключа, который не был закодирован PKCS#8, сгенерированным на первом шаге. Позже я проверил соответствующие документы и узнал, что файл закрытого ключа, сгенерированный на первом шаге, является форматом PKCS#1. Этот формат фактически поддерживается Java, но я просто пишу еще две строки кода:
Rsaprivatekeystructure asn1privkey = new rsaprivatekeystructure (((последовательность ASN1) ASN1 -последовательность. FromByTearray (prikeyData)); Rsaprivatekeyspec rsaprivkeyspec = new rsaprivatekeyspec (asn1privkey.getmodulus (), asn1privkey.getPrivateExponent ()); 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). Интерфейсы, но внутренние реализации должны быть предоставлены самим собой или третьим лицом, мы используем внедрение с открытым исходным кодом. Версии JDK, вы можете найти соответствующую версию на предыдущей странице загрузки.
Давайте посмотрим на код, который я реализовал:
пакет 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.illegalblocksizexexception; импортировать javax.crypto.nosuchpaddingexception; Импорт org.bouncycastle.jce.provider.bouncycastleprovider; Import Sun.misc.base64decoder; Открытый класс RSAencrypt {Private Static Final String default_public_key = "migfma0gcsqgsib3dqebaquaa4gnadcbiqkbgqchdzcjw/rwgfwnxunbkp7/4e8w"/r " "/UmXx2jk6qEEn69t6N2R1i/LmcyDT1xr/T2AHGOiXNQ5V8W4iCaaeNawi7aJaRht" + "/r" + "Vx1uOH/2U378fscEESEG8XDqll0GCfB1/TjKI2aitVSzXOtRs8kYgGU78f7VmDNg" + "/r" + "xilk3gdhnzh + uoeqywidaqab" + "/r"; Приватная статическая конечная строка default_private_key = "miicdqibadanbgkqhkig9w0baqeacaScal8wggjbageaaogbakepnypd + taaxcfg" + "/r" + "6DSQNV/H7ZD9SZFHAOTQOQSFR23O3ZHWL8UZUSINPXGV9PAICY6JC1DLXXBIIJPP4" + "/R" + "1rcltolpgg1xhw44f/ztfvx + xwqriqbxcoqwxqyj8hx9omojzqk1vlnc61gzyria" + "/r" + "ZTVX/TWYM2BCIWTEB2GFOH66GRDLAGMBAAECGYBP4QTVOJKYNUT3SBDJY/XWAETM" + "/R" + "U768SF9P0GLXRTWYUDWJAVUE0VHBI9WXMWZTAVAFKCP8HXX4QZPH84TD0ZJCQ3J" + "/R" + "Dloegafjkiorgzq5fyk7ydbou1tljfv459c8dtzmtu + lgsotd11/v/jr4njxiudo" + "/r" + "MBQ3c4cHmOoYv4uzkQJBANR+7Fc3e6oZgqTOesqPSPqljbsdF9E4x4eDFuOecCkJ" + "/r" + "DvVLOOoAzvtHfAiUp+H3fk4hXRpALiNBEHiIdhIuX2UCQQDCCHiPHFd4gC58yyCM" + "/r" +"6LEQKMOA +6YPFRB3OXYKLBXCWX7DTBX +AYKY5OQMNKEG +MW8XB8WADIUUL0/TB6CQ" +"/R" + "Farvakbhvp94hk0dmdinfvhlwyj3xy4pongsa8vcymj + asgtvjzjfnzxk4gijbja" + "/r" + "2z9ekdfiobbawqp2dldgux2vxz8bemuih + kbsv76cneblhflhlqlikjlqlikhlqlikjl "/r" + "tb0tuw8avlabaxw34/5si + nub1hmbgytk/t/ifcepxpbwlgo + e3pakagwlpnh0zh" + "/r" + "fae7oaqkmad3xcny6ec180tae57hz6ks +" fae7oaqkmAd3xcny6ec180tae57hz6ks + "fae7oaqkmad3xcny6ec180tae57hz6ks +" + "/r" + "1nmlzi2zfuox" + "/r"; / *** Частный ключ*/ Частный rsaprivatekey privatekey; / *** Public Key*/ Private Rsapublickey publicKey; / *** Private Set to String*/ Private Static Final char [] hex_char = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; / *** Получите закрытый ключ* @return Текущий объект закрытого ключа*/ public rsaprivateKey getPrivateKey () {return privateKey; } / *** Получить открытый ключ* @return Текущий объект открытого ключа* / 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 ()); Клавиатура клавиши = KeyPairGen.GenerateKeyPair (); this.privatekey = (rsaprivatekey) keypair.getPrivate (); this.publickey = (rsapublickey) keypair.getPublic (); } / *** Загрузите открытый ключ из входного потока в файле* @param в общедоступном потоке ввода клавиши* @throhs исключение, сгенерированное при загрузке открытого ключа* / public void loadpublickey (inputstream in), бросает исключение {try {BufferedReader br = new BufferedReader (новый inputStreamReader (in)); String readline = null; StringBuilder SB = new StringBuilder (); while (((readline = br.readline ())! = null) {if (readline.charat (0) == '-') {продолжить; } else {sb.append (readline); sb.append ('/r'); }} LoadPublicKey (sb.toString ()); } catch (ioException e) {бросить новое исключение («Ошибка чтения данных по потоку данных открытого ключа»); } catch (nullPointerException e) {бросить новое исключение («Поток ввода открытого ключа пуст»); }} / *** Загрузите открытый ключ из строки* @param publickeystr публичный ключ строка данных* @throhs исключение, сгенерированное при загрузке открытого ключа* / public void loadpublickey (string publickeystr), бросает исключение {try {base64decoder base64decoder = new base64decoder ();); byte [] buffer = base64decoder.decodebuffer (publickeystr); KeyFactory KeyFactory = keyFactory.getInstance ("rsa"); X509encodedkeyspec keyspec = new x509encodedkeyspec (buffer); this.publickey = (rsapublickey) keyfactory.generatepublic (keyspec); } catch (nosuchalgorithmexception e) {бросить новое исключение ("ничего алгоритма"); } catch (InvalidkeySpecexception e) {бросить новое исключение ("открытый ключ незаконно"); } catch (ioException e) {бросить новое исключение («Ошибка чтения данных общедоступного ключа»); } catch (nullPointerException e) {бросить новое исключение («Данные открытого ключа пусты»); }} / *** Загрузите закрытый ключ из файла* @param keyfilename private name file file* @return, будет ли он успешным* @Throws Exception* / public void LoadPrivateKey (InputStream In), бросает исключение {try {bufferedReader br = new BufferedReader (new InputStreamReader (in)); String readline = null; StringBuilder SB = new StringBuilder (); while (((readline = br.readline ())! = null) {if (readline.charat (0) == '-') {продолжить; } else {sb.append (readline); sb.append ('/r'); }} LoadPrivateKey (sb.toString ()); } catch (ioException e) {бросить новое исключение ("Ошибка чтения данных частного ключа"); } catch (nullPointerException e) {бросить новое исключение ("Поток ввода закрытого ключа пуст"); }} public void LoadPrivateKey (String privateKeyStr) Throws Exception {try {base64decoder base64decoder = new Base64decoder (); byte [] buffer = base64decoder.decodebuffer (privatekeystr); Pkcs8encodedkeyspec keyspec = new pkcs8encodkeyspec (буфер); KeyFactory KeyFactory = keyFactory.getInstance ("rsa"); this.privatekey = (rsaprivatekey) keyfactory.generateprivate (keyspec); } catch (nosuchalgorithmexception e) {бросить новое исключение («Ничего этого алгоритма»); } catch (InvalidkeySpecexception e) {бросить новое исключение ("закрытый ключ незаконно"); } catch (ioException e) {бросить новое исключение ("Ошибка чтения данных COMPTACT COME CONTED"); } catch (nullPointerException e) {бросить новое исключение ("Данные закрытого ключа пусты"); } } /** * Encryption process* @param publicKey public key* @param plainTextData plaintext data* @return * @throws Exception Exception information during encryption process*/ public byte[] encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception{ if(publicKey== null){ throw new Exception("Encryption public key is empty, Please set "); } Шифр Cipher = null; try {cipher = cipher.getInstance ("rsa", new BouncyCastleProvider ()); cipher.init (cipher.encrypt_mode, publickey); byte [] output = cipher.dofinal (plantextData); вернуть выход; } catch (nosuchalgorithmexception e) {бросить новое исключение ("nothis alcryption algorithm"); } catch (nosuchpaddingexception e) {e.printstacktrace (); вернуть ноль; } catch (InvalidKeyException e) {бросить новое исключение ("Общедоступный ключ шифрования является незаконным, пожалуйста, проверьте"); } catch (незаконноблокоочистика e) {бросить новое исключение («длина плак -текста незаконна»); } catch (badPaddingException e) {бросить новое исключение ("Data PlackText Data Correted"); }} / *** Процесс расшифровки* @param private private private* @param cipherdata ciphertext data* @return plantext* @Throws Исключение Информация об исключении во время дешифрования* / public byte [] Decrypt (rsaprivateKey private, byte [] cipherdata) thros {if (private) {byte private except {throftept private {tropept private {tropept private {toptept private) набор"); } Шифр Cipher = null; try {cipher = cipher.getInstance ("rsa", new BouncyCastleProvider ()); cipher.init (cipher.decrypt_mode, privatekey); byte [] output = cipher.dofinal (cipherdata); вернуть выход; } catch (nosuchalgorithmexception e) {бросить новое исключение ("ничто из алгоритма расшифровки"); } catch (nosuchpaddingexception e) {e.printstacktrace (); вернуть ноль; } catch (InvalidKeyException e) {бросить новое исключение ("Дешифруемый частный ключ незаконен, пожалуйста, проверьте"); } catch (незаконноблокоочистика e) {бросить новое исключение («Длина CryptOtext - незаконна»); } catch (badPaddingException e) {бросить новое исключение ("CryptOtext Data Correted"); }} / *** Байтовые данные в шестнадцатеричную строку* @param входные данные* @return шестнадцатеричный содержимое* / public Static String 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 (Exception e) {System.err.println (e.getMessage ()); System.err.println («Загрузка публичного ключа не удалась»); } // Загрузка закрытого ключа try {rsaencrypt.loadprivatekey (rsaencrypt.default_private_key); System.out.println ("успешно загружать закрытый ключ"); } catch (Exception e) {System.err.println (e.getMessage ()); System.err.println («Загрузка частного ключа не удалась»); } // тестовая строка строки incryptstr = "test string chaijunkun"; try {// incrypt byte [] cipher = rsaencrypt.encrypt (rsaencrypt.getpublickey (), encryptstr.getbytes ()); // расшифровывает byte [] plunext = rsaencrypt.decrypt (rsaencrypt.getPrivateKey (), Cipher); System.out.println ("Длина зашифрованного текста:"+ cipher.length); System.out.println (rsaencrypt.bytearraytoString (шифр)); System.out.println ("Длина открытого текста:"+ plantext.length); System.out.println (rsaencrypt.bytearraytostring (plaintext)); System.out.println (new String (plantext)); } catch (Exception e) {System.err.println (e.getMessage ()); }}} В коде я предоставляю два способа загрузки публичных и частных ключей.
Читать по потоку: подходит для метода получения InputStream с помощью ресурсов индексации ID в приложениях Android;
Читать по строке: как показано в коде, храните содержимое ключа по линии в статические константы и импортируйте ключ по типу строки.
Запустите приведенный выше код, и будет отображаться следующая информация:
1 64 57 C8 E3 46 A7 CE 57 31 AC CD 21 89 89 8F C1 24 C1 22 0C CB 70 6A 0D FA C9 38 80 BA 2E E1 29 02 ED 45 9E 88 E9 23 09 87 AF AB AC CB 61 03 3C A1 81 56 A5 DE C4 79 AA 3E 48 EA 30 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3B 3 FD 22 87 9e de b1 f4 e8 b2 Длина простых текстов: 22 54 65 73 74 20 53 74 72 69 67 67 20 63 68 61 69 6a 75 6e 6b 75 6e Тестовая строка chaijunkun
В основной функции я прокомментировал «rsaencrypt.genkeypair ()», который используется для случайного генерации паров ключей (только генерировать, использовать, а не хранить). Когда ключ файла не используется, вы можете прокомментировать код, который загружает ключ, включает этот метод или запустить код.
Разница между загрузкой открытого ключа и загрузкой закрытого ключа заключается в том, что при загрузке открытого ключа x509encodkeyspec (инструкция x509-кодированного ключа), и когда загружается закрытый ключ, pkcs8encodkeyspec (инструкция PKCS#8-кодированное ключ).
Добавлено 22 февраля 2012 года. Во время разработки программного обеспечения Android было обнаружено, что вышеупомянутый код не работает должным образом. Основная причина заключается в том, что класс sun.misc.base64decoder не существует в пакете разработки Android. Поэтому вам нужно найти исходный код RT.JAR в Интернете. Что касается исходного кода в SRC.ZIP JDK, это является лишь частью исходного кода в JDK, и коды вышеуказанных классов не существует. После поиска и добавления приведенный выше код хорошо работает в приложениях Android. Это содержит соответствующий код для этого класса. Кроме того, этот класс также зависит от целефортксакса, cestreamexhaust, классов характеристики и характера и определений исключений.
В дополнение к 23 февраля 2012 года: сначала я написал эту статью для реализации шифрования и дешифрования RSA, не полагаясь на любые сторонние пакеты, но позже я столкнулся с проблемами. Поскольку объект шифра должен быть создан как в методе шифрования, так и в методе расшифровки, этот объект может получить экземпляры только через GetInstance. Есть два типа этого: первым является указание только алгоритм, а не поставщика; Второе - указать оба. Сначала код все еще может работать, но вы обнаружите, что результат каждого шифрования отличается. Позже было обнаружено, что общественный и частный ключ, используемый объектом Cipher, был случайным образом сгенерирован внутри, а не публичный и частный ключ, указанный в коде. Как ни странно, этот код, в котором не указывается поставщик, может работать через приложения Android, и результат каждого шифрования одинаков. Я думаю, что в дополнение к некоторым функциям разработки системы в Android SDK, это также реализует функции JDK. Возможно, он предоставил соответствующих поставщиков в своем собственном JDK, что делает результат шифрования каждый раз. Когда я добавил провайдера Bouncycastle, например, пример кода в Интернете, результаты каждого шифрования одинаковы.
Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!