Подпись и подпись подтверждение RSA алгоритм

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 + Высокий Низкий);
        }
        возвращать байт;
    }

рекомендация

отwww.cnblogs.com/hello4world/p/12219325.html