Я чувствую, что прошло много времени с тех пор, как я в последний раз написал блог. Позвольте мне сначала пожаловаться. В этом месяце компания работает сверхурочно, публикует и запускает публикацию, и новые проекты слишком жесткие, поэтому я не буду много говорить о конкретных. Сегодня очень важно говорить об асимметричном шифровании. Асимметричное шифрование необходимо в нашей повседневной жизни.
концепция
Прежде чем говорить о RSA, давайте впервые поговорим о том, что такое асимметричное шифрование. Говоря о симметричном шифровании, когда -то было сказано, что алгоритмы симметричного шифрования используют один и тот же секретный ключ при шифровании и расшифровке, и обе стороны для шифрования и дешифрования должны использовать один и тот же ключ для нормального общения. Асимметричное шифрование не так. Алгоритм асимметричного шифрования требует двух ключей для шифрования и расшифровки, а именно для открытого ключа и личного ключа.
Отнесее отметить, что открытый ключ и закрытый ключ должны быть парой. Если данные зашифрованы с помощью открытого ключа, то можно расшифровать только соответствующий закрытый ключ, и наоборот. Поскольку шифрование и дешифрование используют два разных клавиша, этот алгоритм называется асимметричным алгоритмом шифрования.
Рабочий процесс
Как показано на рисунке ниже, данные передаются с использованием асимметричного шифрования.
Основные алгоритмы, используемые в асимметричном шифровании, включают в себя: RSA, Elgamal, алгоритм рюкзака, Rabin, DH, ECC (алгоритм шифрования эллиптической кривой) и т. Д. Сегодня мы в основном представим RSA. Что касается других алгоритмов, мы выберем несколько, чтобы представить их позже.
RSA
Фактически, RSA появился еще в 1978 году, и это был первый алгоритм, который можно использовать как для шифрования данных, так и для цифровых подписей. Это легко понять и работать, а также очень популярен. Принцип такой, как описано в вышеуказанном рабочем процессе.
Алгоритм RSA основан на очень простом факте теории чисел: легко умножить два больших первичных чисел, но чрезвычайно трудно факторизировать их продукты, поэтому продукт может быть раскрыт как ключ шифрования.
Реализация кода
Давайте посмотрим на конкретную реализацию кода ниже.
Импорт com.google.common.collect.maps; Import Sun.misc.base64decoder; Import sun.misc.base64encoder; Импорт javax.crypto.cipher; Импорт java.security.*; Импорт java.security.interfaces.rsaprivatekey; Импорт java.security.interfaces.rsapublickey; Импорт java.security.spec.pkcs8encodedkeyspec; Импорт java.security.spec.x509encodedkeyspec; импортировать java.util.map; /*** Создан Xiang.li 2015/3/3. * Класс инструмента шифрования и расшифровки RSA*/ public class rsa {/ *** определить метод шифрования*/ private final Static String key_rsa = "rsa"; / *** Определить алгоритм подписи*/ private final Static String key_rsa_signature = "md5withrsa"; / *** Определить алгоритм открытого ключа*/ private final Static String key_rsa_publickey = "rsapublickey"; / *** Определить алгоритм закрытых ключей*/ private final Static String key_rsa_privatekey = "rsaprivatekey"; / *** Ключ инициализации* @return*/ public Static Map <String, Object> init () {map <string, object> map = null; try {keypairgenerator Generator Generator = KeyPairGenerator.getInstance (key_rsa); Генератор. ИНИТИАЛИЗАЦИЯ (1024); Клавиатура клавиши = генератор.generateKeyPair (); // public Key rsapublickey publickey = (rsapublickey) keypair.getpublic (); // Частный ключ rsaprivatekey privatekey = (rsaprivatekey) keypair.getPrivate (); // инкапсулировать ключ как map map = maps.newhashmap (); map.put (key_rsa_publickey, publickey); map.put (key_rsa_privatekey, privatekey); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } return Map; } / *** Используйте закрытый ключ, чтобы сгенерировать цифровую подпись для информации* @param Data зашифрованные данные* @param private private key* @return* / public Static String Sign (byte [] data, string privatekey) {string str = ""; try {// расшифровывать закрытый ключ, закодированный байт [] bytes = decryptbase64 (privatekey); // Создание pkcs8encodedkeyspec object pkcs8encodkeyspec pkcs = new pkcs8codedkeyspec (байты); // указанный алгоритм шифрования keyFactory factory = keyFactory.getInstance (key_rsa); // Получить объект закрытого ключа privateKey Key = Factory.GeneratePrivate (PKCS); // Использование закрытого ключа для генерации цифровой подписи для подписи информации = signature.getInstance (key_rsa_signature); signature.initsign (ключ); signature.update (data); str = encryptbase64 (signature.sign ()); } catch (Exception e) {e.printstackTrace (); } return str; } / *** Проверьте цифровую подпись* @param Data зашифрованные данные* @param public Key Public Key* @param Sign Digital Signature* @return проверить успешное возвращение true true, возврат false* / public static boolean verify (byte [] data, string publickey, строковый знак) {boolean flag = false; try {// расшифровывать открытый ключ, закодированный байт [] bytes = decryptbase64 (publickey); // Создание объекта x509encodeDkeySpec x509encodeDkeySpec keyspec = new x509encodedkeyspec (байты); // указанный алгоритм шифрования keyFactory factory = keyFactory.getInstance (key_rsa); // Получить объект открытого ключа publicKey Key = factory.GeneratePublic (keySpec); // Проверьте цифровую подпись с помощью подписи открытого ключа = signature.getInstance (key_rsa_signature); signature.initverify (key); signature.update (data); flag = signature.Verify (decryptbase64 (знак)); } catch (Exception e) {e.printstackTrace (); } вернуть флаг; } / *** Приватный ключ Decrypt* @param Data зашифрованные данные* @param ключ частный ключ* @return* / public Static Byte [] decryptbyprivatekey (byte [] data, string key) {byte [] result = null; try {// расшифровывать частный ключ Byte [] bytes = decryptbase64 (key); // Получить закрытый ключ PKCS8encodeDkeySpec keyspec = new Pkcs8encodkeySpec (байты); KeyFactory Factory = keyFactory.GetInstance (key_rsa); PrivateKey PrivateKey = Factory.GeneratePrivate (KeySpec); // расшифрование цифр данных Cipher = cipher.getInstance (factory.getalgorithm ()); cipher.init (cipher.decrypt_mode, privatekey); result = cipher.dofinal (data); } catch (Exception e) {e.printstackTrace (); } return Result; } / *** Заключитель закрытого ключа* @param Data зашифрованные данные* @param public key* @return* / public static byte [] decryptbypublickey (byte [] data, string key) {byte [] result = null; try {// расшифровывать открытый ключ Byte [] bytes = decryptbase64 (key); // Получить открытый ключ x509encodedkeyspec keyspec = new x509encodkeyspec (байты); KeyFactory Factory = keyFactory.GetInstance (key_rsa); Publickey publickey = factory.generatepublic (keyspec); // расшифрование цифр данных Cipher = cipher.getInstance (factory.getalgorithm ()); cipher.init (cipher.decrypt_mode, publickey); result = cipher.dofinal (data); } catch (Exception e) {e.printstackTrace (); } return Result; } / *** Шифрование открытого ключа* @param Данные данных, чтобы быть зашифрованными* @param kee public key* @return* / public static byte [] encryptbypublickey (byte [] data, string key) {byte [] result = null; try {byte [] bytes = decryptbase64 (key); // Получить открытый ключ x509encodedkeyspec keyspec = new x509encodkeyspec (байты); KeyFactory Factory = keyFactory.GetInstance (key_rsa); Publickey publickey = factory.generatepublic (keyspec); // шифрование данных Cipher Cipher = cipher.getInstance (factory.getalgorithm ()); cipher.init (cipher.encrypt_mode, publickey); result = cipher.dofinal (data); } catch (Exception e) {e.printstackTrace (); } return Result; } / *** Шифрование закрытого ключа* @param Данные для зашифрования* @param ключ закрытый ключ* @return* / public static byte [] encryptbyprivatekey (byte [] data, string key) {byte [] result = null; try {byte [] bytes = decryptbase64 (key); // Получить закрытый ключ PKCS8encodeDkeySpec keyspec = new Pkcs8encodkeySpec (байты); KeyFactory Factory = keyFactory.GetInstance (key_rsa); PrivateKey PrivateKey = Factory.GeneratePrivate (KeySpec); // шифрование данных Cipher Cipher = cipher.getInstance (factory.getalgorithm ()); cipher.init (cipher.encrypt_mode, privatekey); result = cipher.dofinal (data); } catch (Exception e) {e.printstackTrace (); } return Result; } / ** * Получить открытый ключ * @param map * @return * / public static String getPublickey (map <string, object> map) {string str = ""; try {key key = (key) map.get (key_rsa_publickey); str = encryptbase64 (key.getencoded ()); } catch (Exception e) {e.printstackTrace (); } return str; } / ** * Получить закрытый ключ * @param map * @return * / public static String getPrivateKey (map <string, object> map) {string str = ""; try {key key = (key) map.get (key_rsa_privatekey); str = encryptbase64 (key.getencoded ()); } catch (Exception e) {e.printstackTrace (); } return str; } / *** BASE64 DECRYPT* @param КЛЮЧЕСКИЙ КЛЮЧЕВОЙ КЛЮЧЕЙ, который необходимо расшифровать* @return Byte Array* @Throws Exception* / public Static Byte [] Decryptbase64 (String Key) Throws Exception {return (new Base64decoder ()). Decodebuffer (key); } / *** Base64 шифрование* @param -массив клавиш, который необходимо зашифровать* @return String* @Throws Exception* / public Static String EncryptBase64 (byte [] key) Throws Exception {return (new Base64encoder ()). Encodebuffer (key); } / *** Метод испытания* @param args* / public static void main (string [] args) {string privatekey = ""; "; String publicKey = ""; // Сгенерировать открытый ключ карту ключа к ключу <строка, объект> map = init (); publickey = getPublickey (карта); privateKey = getPrivateKey (карта); System.out.println ("public Key: /n /r" + publickey); System.out.println ("Private Key: /n /r" + privatekey); System.out.println("Public key encryption------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- "; byte[] encWord = Encryptbypublickey (word.getbytes (), publickey); encryption---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- EncryptbyPrivateKey (english.getBytes (), privateKey); String decenglish = new String (decryptbypublickey (Engenglish, publickey)); System.out.println («До шифрования:» + английский + »/n/r» + »после дешифрования:« + разгрузка); System.out.println ("Подпись личности-подписного ключа подписи" // Сгенерировать подпись строки = знак (Engenglish, privateKey); System.out.println ("signature:/r" + sign); // Проверьте подпись логического статуса = проверка (Engenglish, publickey, Sign); System.out.println ("status:/r" + status); }} Результаты шифрования и расшифровки
Заключение
Фактически, кажущийся сложный процесс может быть описан в одном предложении: использование шифрования открытого ключа и дешифрования личного ключа, одна передача данных от партии B в сторону A завершена через шифрование личного ключа и расшифровку открытого ключа и в то же время, посредством частной сигнатуры ключей и сигнатуру общедоступной ключевой проверки, один передача данных и проверка от стороны на сторону B завершается, и два трансфера данных завершают полную сеть данных.
Появление алгоритмов асимметричного шифрования состоит в том, чтобы решить проблему шифрования и расшифровки только одного ключа. Пока этот ключ теряется или раскрывается, зашифрованные данные будут легко атаковать. В то же время это происходит именно из -за появления асимметричных алгоритмов шифрования, которые получаются последующие цифровые подписи, цифровые сертификаты и т. Д.
Хорошо, давайте остановимся здесь сегодня. Следующая статья продолжает асимметричное шифрование. Что касается того, я буду знать в то время. Держите это в секрете здесь первым