1. RSA алгоритм генерации пары ключей
/ ** * Генерация пары ключей RSA случайные (государственные и частные) * @Return * / общественная статическая Map <String, String> createKeyPair () бросает исключение { Карта <String, String> = keyPairMap новый новый HashMap <> (); // ключ генератор, основанный на алгоритме RSA KeyPairGenerator KeyPairGenerator = KeyPairGenerator.getInstance ( "RSA" ); // инициализировать генератор ключей, размер ключа равен 96 -1024 бит keyPairGenerator.initialize (1024, SecureRandom.getInstance ( "SHA1PRNG" )); // генерирует пару ключей, которые хранятся в KeyPair KeyPair KeyPair = keyPairGenerator.generateKeyPair (); // получает открытый ключ и байты открытого ключа массив ОткрытыйКлюч PublicKey = keyPair.getPublic (); байт [] = publicKeyBytes publicKey.getEncoded (); //Получение секретного ключа и секретного ключа массива байтов PrivateKey PrivateKey = keyPair.getPrivate (); байт [] = privateKeyBytes privateKey.getEncoded (); // преобразуется в шестнадцатеричных символов , хранящихся в карте keyPairMap.put (PUBLIC_KEY, byte2Hex (publicKeyBytes )); keyPairMap.put (private_key, byte2Hex (privateKeyBytes)); вернуться keyPairMap; }
2. С помощью закрытого ключа подписи
/ ** * С помощью секретного ключа (RSA алгоритм для генерации) данных (как правило, цифровой абстрактный) знак * @Param содержание * @Param privateKeyString * @return * / общественности статической строки Знак (Содержание String, String privateKeyString) бросает исключение { IF (содержание! = Null && privateKeyString! = Null &&! "" Равных (Содержание) &&! "" .equals (privateKeyString)) { // Получить секретный ключ PrivateKey PrivateKey = KeyFactory.getInstance ( "RSA") generatePrivate (. новый новый PKCS8EncodedKeySpec с (hex2Byte (privateKeyString))); // создаем экземпляр хешированное с SHA алгоритм шифруется с помощью RSA Подпись Подпись Подпись Signature.getInstance = ( "SHA1withRSA" ); //Загрузите шифрования хэш - код с закрытым ключом signature.initSign (PrivateKey); // хешированную генерации хэш - код шифруется и возвращается Signature.update (contents.getBytes ( «UTF - 8.» )); // подписан байт [] = signBytes signature.sign (); возвращение byte2Hex (signBytes); } возвращать нуль ; }
3. Подписи Подтвердите с помощью открытого ключа
/ ** * Использование открытого ключа для проверки данных сигнатур * @Param содержание * @Param signString * @Param publicKeyString * @Return * / общественное статическое логическое checkSign (содержимое String, String signString, String publicKeyString) бросает исключение { если (содержание == NULL || signString == NULL || publicKeyString == NULL ) { возвращение ложным ; } // получить открытый ключ PublicKey ОткрытыйКлюч = KeyFactory.getInstance ( "RSA") generatePublic (. Новый новый (hex2Byte (publicKeyString)) X509EncodedKeySpec); // создаем экземпляр Хешированное с SHA алгоритм шифруется с помощью RSA Подпись Подпись Подпись Signature.getInstance = ( "SHA1withRSA" ); // загрузить публичный signature.initVerify (ОткрытыйКлюче); // обновляют исходные данные Signature.update (contents.getBytes ( "UTF-8" )); // возвращает подпись правилен возврат signature.verify (hex2Byte (signString)); }
--------------------------------------
Методы Инструменты
/ ** * Байт [] массив в 16 шестнадцатеричных символов. Генерация два байтовый символ а, имеет длину, соответствующую 1: 2 * @Param байт, массив входных байт [] * @Return 16 шестнадцатеричных символов * / публичный статический Строка byte2Hex ( байт [] байт) { IF (байт == NULL ) { возвращение нуль ; } Builder в StringBuilder = новый новый в StringBuilder (); // итерации байт [] массив, каждый байт преобразуется в цифровые символы шестнадцатеричных, затем сращены вместе в строку для ( INT I = 0; I <bytes.length; I ++ ) { // при преобразовании каждого байта в 16 шестнадцатеричных символов, байт [I] & 0xff , если старшие биты равны 0, то выходной сигнал будет удален, так + 0x100 два символа (плюс 1 бит выше), повторное приняты builder.append ( Integer.toString ((байт [I] , & 0xFF) + 0x100, 16) .substring (1. )); } вернуть builder.toString (); } / ** * Преобразование шестнадцатеричных символов в массив байт []. В отличие от функции byte2Hex. * @Param Строка 16 шестнадцатеричная строка * @Return байт []数组 * / публичный статический байт [] hex2Byte (String строка) { если (строка == NULL || String.length () <1 ) { возвращение нуль ; } // Из - за генерации два байт - символ A, длину , соответствующую 1: 2, байт [] длина массива составляет половину длины строки байт [] байт = новый новый байт [String.length () / 2 ]; // траверс байт [] массив, число траверс половины длины строки для ( INT I = 0; я <String.length () / 2; я ++ ) { // принимать не раньше , чем двухсимвольный, который преобразуется INT, INT High = Integer .parseInt (String.substring (I * 2, * 2 + I. 1), 16 ); // после двух символов не принято, которая преобразуется ИНТ ИНТ Low = Integer.parseInt (String.substring (I . 2 + 1 *, I * 2 + 2), 16 ); // высокие значения , соответствующие символы * 16 + Int Int низкого значения, значение байт могут быть преобразованы в сильный @Как дд, с низким высоким 13 * 16 + 13 = 221 (сильных байтами двоичного 11011101 преобразуется в соответствующем десятичной -35) байты [I] = ( байты ) (* 16 + Высокий Низкий); } возвращать байт; }