Общие алгоритмы шифрования
Основной алгоритм одностороннего шифрования:
Base64 Строго говоря, он принадлежит к формату кодирования, а не к алгоритму шифрования
MD5 (MessageDigestalgorithm5, Алгоритм информационного дайджеста)
SHA (SecureHashalgorithm, защитный алгоритм хэш)
HMAC (HashmessageauthenticationCode, код аутентификации хеш -сообщений)
Сложное симметричное шифрование (DES, PBE), асимметричные алгоритмы шифрования:
DES (DataEncryptionStandard, Алгоритм шифрования данных)
PBE (на основе пароля на основе проверки пароля)
RSA (имя алгоритма названа в честь изобретателя: Ронривест, Ади Шамир и Леонард Адлеман)
DH (алгоритм Diffie-Hellman, протокол ключевой консистенции)
DSA (алгоритм DigitalSignature, цифровая подпись)
ECC (криптография Elliptic Curves)
Цифровая подпись
Краткое описание алгоритма
Алгоритм цифровой подписи можно рассматривать как алгоритм дигеста сообщения с ключом, и этот ключ содержит как публичный, так и закрытый ключ. То есть алгоритм цифровой подписи представляет собой комбинацию асимметричного алгоритма шифрования и алгоритма дигеста сообщений.
Функции
Алгоритмы цифровой подписи требуют возможности проверять целостность данных, аутентифицировать источники данных и играть роль в противодействии отрицанию.
принцип
Алгоритм цифровой подписи включает две операции: подпись и проверка, которые следует методам подписи частного ключа и проверки открытого ключа.
При подписании следует использовать закрытый ключ и данные, которые должны быть подписаны. При проверке, должен использоваться открытый ключ, значение подписи и данные, которые должны быть подписаны. Основной алгоритм - это в основном алгоритм дигеста сообщений.
1. Сводка сообщения
String beforedegist = "asdf"; System.out.println("Before"Summary:"+beforeDegist); //Initial information should be converted into a byte stream byte[] plainText = beforeDegist.getBytes("UTF8"); //Use getInstance("Algorithm") to obtain the message digest. Here, SHA-1's 160-bit algorithm or MD5 algorithm geDigest messageDigest = MessageGest.getInstance ("SHA-1"); String (messagegest.digest (), "utf8");2. Шифрование частного ключа
/**. Частный ключ зашифрован, что является симметричным шифрованием* с использованием симметричного алгоритма. Например: A использует ключ для шифрования файла, а B нуждается в том же ключе, что и A, и обе стороны разделяют * личный ключ (и в веб -среде, закрытый ключ легко прослушивается при прохождении) * * Приложение: основные симметричные алгоритмы: DES (фактический ключ использует только 56 бит) * AES (поддерживает три ключа: 128, 192, 256 Bits), Обычно 128, 128, Обычно 128, 128, 128, 128. <span style = "Белое пространство: pre;"> </span> string перед = "asdf"; byte [] plaintext = до.getbytes ("utf8"); // Шаг 1. System.out.println («Start Generate AES-ключ.»); // Получить экземпляр Keygenerator с использованием AES-алгоритма Keygenerator Keygen = Keygenerator.getInstance («AES»); // Определить ключевую длину 128-битный keygen.init (128); // генерировать ключ через ключевой диагноз (ключевой algorith-algoritm. keygen.generatekey (); System.out.println ("Отдел генерирования aes key ="+key);// Шаг 2.
// Получить закрытый класс шифрования класса ключа, определяя основную информацию шифра: ECB - это метод шифрования, а PKCS5Padding - это метод заполнения Cipher Cipher = Cipher.getInstance ("AES/ECB/PKCS5Padding"); //System.out.println("/n " + cipher.getprovider (). GetInfo ());// Шаг 3.
// Используйте закрытый ключ для Encrypt System.out.println ("/n Encrypt с закрытым ключом ..."); // Использование ключа, сгенерированного как параметр, и инициализируйте класс шифрования, используя закрытый ключ, полученный только сейчас. Cipher.encrypt_mode означает шифрование cipher.init (cipher.encrypt_mode, key); // Шифр шифрования закрытого ключа зашифруется, а после шифрования возвращается поток байта [] string string string string string intf3 str string13 String (ciphertext, "utf8"); System.out.println ("Complete с шифрованием личного ключа:"+after1);// Шаг 4.
[java] Посмотреть простая копия // Используйте закрытый ключ, чтобы расшифровать информацию, зашифрованную только сейчас, чтобы увидеть, согласован ли она. Cipher.decrypt_mode означает систему расшифровки ключей. cipher.dofinal (ciphertext); string after2 = new String (newplaintext, "utf8"); System.out.println ("расшифровано с закрытым ключом:"+after2);3. Шифрование открытого ключа
String перед = "asdf"; byte [] plantext = до.getbytes ("utf8"); // генерировать ключевой генератор RSA -ключа (как следует из названия: пара ключевых генераторов) KeyPairgenerator Keygener = KeyPairgenerator.GetNstance ("RSA");// define Keygener wypairgenerator.getNstance ("RSA"); // define wypairgenerator. Ключ через KeyPairgenerator, примечание: ключом здесь является пара ключей! ! KeyPair Key = keyGen.GenerateKeyPair (); // Получить класс цифр RSA, зашифрованный с использованием открытого ключа шифра Cipher = cipher.getInstance ("RSA/ECB/PKCS1Padding"); // System.out.println ("/n" + cipher.getprovider () getInfo (); System.out.println ("/n зашифровано с открытым ключом ..."); // cipher.encrypt_mode означает шифрование, получите открытый ключ из пары Keys.getPublic () cipher.init (cipher.encrypt_mode, key.getpublic ()); // incrypt с открытым ключом и возврат byte -поток byte byte streamte [] cipher streame u -byte streamte [] cipher streamte [] cipher stream. cipher.dofinal (plantext); // конвертировать Byte Stream в строку в utf8 Format String After1 = New String (CipherText, "UTF8"); System.out.println («Используйте шифрование открытого ключа:«+ather1); // decrypt system.out.println ("/ndecrypt с закрытым ключом ..."); // cipher.decrypt_mode означает режим расшифровки, получить закрытый ключ из пары Keys.getPrivate () cipher.init (cipher.decry.decry_mode, cipher. key.getPrivate ()); // расшифровывать с закрытым ключом и вернуть байт -потоковой байт [] newplaintext = cipher.dofinal (ciphertext); string после 2 = новая строка (newplaintext, "utf8"); System.out.println ("расшифровка с подключенным ключом:"+after2);4. Цифровая подпись
/*** Этот пример является примером цифровой подписи. Используйте RSA Private Key, чтобы подписать Digest Message Digest (здесь относится к исходным данным), а затем используйте открытый ключ для проверки подписи * * А зашифрует данные с открытым ключом B и отправляет его B. B Использует личный ключ B, чтобы расшифровать их для получения необходимых данных (данные, зашифрованные B, могут быть Decrypted B -Key Ci -Cliept, но CID -hippt, но не может быть, Ci -Ci -Cliept, но не может быть, Ci -Ci -Cliept, но не может быть привалено C, но CID -expret -hib -hippte -hipptept, но не может быть приважен C, не может быть. Общедоступный ключ B, чтобы зашифровать копию данных и отправить его в B. Таким образом, вопрос: является ли данные, полученные B? B, и необходимость подготовить две части: 1 и 2 * 1: A использует открытый ключ B, чтобы зашифровать исходную информацию, чтобы служить конфиденциальностью (только личный ключ B может быть развернут, но другие не могут развернуть другие ключи, конечно, это конфиденциально) * 2: использует личный ключ для подписи оригинальной информации в качестве подводной информации о том, что он был присвоен (для того, чтобы он был присвоен, в качестве подсчета - это подводящий в качестве подводного. Данные *, а затем передайте его B. В то же время C использует закрытый ключ C, чтобы подписать любую информацию B. То, что B хочет принимать данные A, (например, запрос на передачу), поэтому B * расшифровывает две информацию, полученные через открытый ключ A, и то, что неверно, является (A (A A aSd) может только развернуть зашифрованные данные) */строка). перед.getbytes ("utf8"); // сформировать открытый клавиш открытых ключей RSA KeyPairgenerator KeyGen = KeyPairGenerator.getInstance ("RSA"); keygen.initialize (1024); KeyPair Key = keyGen.GenerateKeyPair (); // Подпись с закрытым ключом ******************************************* sig.initSign(key.getPrivate());//sig object obtains the private key//Signed object obtains the original data sig.update(plainText);//sig object obtains the original data (in reality, the digest of the original data is used, and the digest is one-way, that is, it cannot be decrypted after the digest algorithm) byte[] signature = sig.sign (); // sig объект использует закрытый ключ, чтобы подписать исходные данные, и получает подпись после подписи подписи em.out.println (sig.getProvider (). getInfo ()); String After1 = New String (Signature, "Utf8"); System.out.println ("/nsign с закрытым ключом:"+aTher1); // Использовать открытый ключ для проверки sig.InitVerify (key.getPublic ()); // sig объект получает общедоступный ключ // sign obste election information update (plaintraTrate); // Символ. (sig.verify (signature)) {// объект Sig Decrypts подпись с открытым ключом для получения исходных данных (т.е., Summary), если True System.out.println («Проверка подписи верна !!» +Новая строка (PloundText, «UTF8»));} else {System.out.println («Проверка подписи»); {System.out.println ("Проверка подписи не удалась !!");}5. Цифровой сертификат
/*** Этот пример является операцией в файле «Цифровой сертификат». Команда KeyTool представлена в соответствии с CMD для создания библиотеки сертификатов * * Перед запуском этого примера: * Создайте сертификат в каталоге C Disk, укажите библиотеку сертификатов BocsoftKeyLib и создайте сертификат с тестовой консервацией псевдонима. В нем указывается, что он генерируется с использованием алгоритма * RSA, а длина ключа равен 1024, а сертификат действителен в течение 1 года * Файл сертификата экспорта - TC.Cer, который уже хранится на локальном диске C:/ * Пароль - QazzAQ */try {// Подготовка: Экспорт сертификат Сертификат Сертификат. Информация из файла сертификата tc.cer serticatefactory cf = setratefactory.getinstance ("x.509"); fileInputStream in = new FileInputStream ("c: /tc.cer"); // Читать файл в сертификат класса сертификата в форме сертификата по потоку файла c = cf.generatecertificate (in); "+c.tostring ());*// или не используйте приведенный выше метод кода, прочитайте информацию о сертификате непосредственно из библиотеки сертификатов, которая точно такая же, как и вышеуказанный string pass =" qazzaq "; fileInputStream in2 = new FileInputStream (" c:/bocSoftKeyLib "); ks = keystore.getInstance ("jks"); ksload (in2, pass.tachararray ()); string alias = "testcertification"; // псевдоним - это сертификат псевдонима c = ks.getCertificate (псевдоним); System.err.println ("Сертификат после конвертации:"+c.toString (); // // ////или получить объект. Это подкласс класса сертификатов для получения сертификата, и реализует больше методов x509Certificate t = (x509Certificate) c; // Извлечение необходимой информации из информационной системы.out.println («Номер версии:»+t.getVersion ()); System.out.println ("Serial число: «+t.getSerialNumber (). ToString (16)); System.out.println (« Имя субъекта »:«+t.getSubjectdn ()); System.out.println («Эмизист:»+t.getIssuerdn ()); System.Println («Период валентности: период: период валентности: период: период валентности: "+t.getNotBefore ()); System.out.println (" Алгоритм подписи: "+t.getSigalgname ()); byte [] sig = t.getSignature (); // Значение подписи publickey pk = t.getPublickey (); byte [] pkence = pk.getencoded (); i = 0; i <pkenc.length; i ++) {System.out.print (pkenc [i]+",");} system.err.println (); // Проверка достоверности даты сертификата, выпущенные сертификаты имеют допустимую дату даты даты Дата! »); // Проверьте обоснованность подписи сертификата и выпуска CA -сертификат клиенту через организацию Центра сертификации цифрового сертификата (CA), например: caroot.crt file // У меня нет сертификата, выданного мне CA, поэтому следующий код не может быть выполнен/*PileInputStream in3 = новый файл -поток (" caroot.crt ") ;//caft cac artectate v3 = aT -сертификат CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC = CAC. CF.GenerateCertificate (IN3); System.out.println («Проверка достоверности даты сертификата: срок действия»); } catch (проверка достоверности даты сертификата: срок действия ");} catch (проверка даты даты сертификата: срок действия"); } catch (проверка достоверности даты сертификата: истек ");} catch (filenotFoundException ce) {ce.printStackTrace ();} catch (filenotFoundexception fe) {fe.printstacktrace ();} /*catch (ioexception ioe) {} catchStoreExcept e) {e.printstacktrace ();}}Суммировать
Выше приведено все о полных примерах кода шифрования и дешифрования Java и цифровых подписей. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!