Шифрование состоит в том, чтобы изменить исходные информационные данные, используя специальный алгоритм, так что даже если несанкционированный пользователь получает зашифрованную информацию, он все еще не может понять содержание информации, потому что он не знает метода расшифровки. Обычно он делится на двустороннее шифрование и одностороннее шифрование, в то время как биологическое шифрование делится на симметричное шифрование и асимметричное шифрование (некоторые материалы непосредственно делят шифрование на симметричное шифрование и асимметрическое шифрование).
Общее значение двунаправленного шифрования состоит в том, чтобы сформировать зашифрованный текст после шифрования с открытым текстом, который можно восстановить в открытом виде посредством алгоритмов. Одностороннее шифрование только выполняет расчет дигеста в информации и не может генерировать простой текст с помощью алгоритмов. Строго говоря, одностороннее шифрование не может рассматриваться как тип шифрования, но следует считать алгоритмом дайджеста.
Конкретно:
Система должна быть доступна и не может быть декодирована нематематически.
Система не должна быть конфиденциальной и может легко попасть в руки врага.
Ключ должен обмениваться и запоминать без письма, и обе стороны могут изменить ключ.
Система может использоваться для телекоммуникаций.
Система может переносить позиции, и ее функции должны быть достигнуты, не проходя через несколько человек.
Система проста в использовании и не требует, чтобы пользователь был переутомлен или имел много правил.
1. Основной провайдер кода метода шифрования
JDK: Код находится в пакете JRE/LIB/JCE.JAR в каталоге установки Java;
CC: org.apache.commons.codec предоставлен Apache
Главная страница: http://commons.apache.org/proper/commons-codec/
BC: org.bouncecastle
Главная страница: http://www.bouncycastle.org/java.html
В основном обычно используется JDK.
2. Алгоритм BASE64
1. Судя по сложности алгоритма шифрования, Base64 смущена, чтобы сказать, что он зашифрован, но этого достаточно для людей, которые вообще не понимают компьютеров. Кодирование BASE64 нечитаемо, то есть кодированные данные не будут напрямую видны людьми невооруженным глазом.
Кодирование Base64 обычно используется для обработки URL -адреса, или что -либо, что вы не хотите, чтобы обычные люди знали с первого взгляда, можно обработать с помощью кодирования Base64, а затем размещено в Интернете.
пакет com.amuro.trategy.base64; import java.util.base64; import com.amuro.strategy.istrategy;/** * Base64 Algorithm основан на 64 основных символах, и только эти 64 символа включены в зашифрованную строку * @author amuro */public base64strategy intrategy isrategy isrategy instrategy rtrategy rtrategy rtrategy. byte [] encodebytes = base64.getencoder (). Encode (src.getbytes ()); вернуть новую строку (encodebytes); } public String Decode (String src) {byte [] decodebytes = base64.getDecoder (). decode (src.getbytes ()); вернуть новую строку (decodebytes); }}2. Base64 таблица соответствия
3. Алгоритм расщепления сообщений (Digest)
Объединение сообщений также называется Digital Digest. Это уникальное значение, соответствующее фиксированной длине сообщения или текста, и он генерируется функцией одностороннего хэш-шифрования, которая действует на сообщение. Сопротивление конфликта функции хэш позволяет слегка изменять простой текст, даже если изменяется только одна буква абзаца, после алгоритма хэширования генерируются разные значения. Однонаправленность алгоритма хэша делает невозможным найти два разных входных сообщения с одинаковыми хэш -значениями вычислительно. Следовательно, значение хэша данных, то есть, дадест сообщения, может проверить целостность данных.
Простыми словами, любая часть данных должна быть уникальной, как человек. Какой уникальный идентификатор? Для людей это в настоящее время отпечатки пальцев, а каков отпечаток данных? Правильно, это эта строка, сгенерированная алгоритмом дигеста сообщения. Например, когда мы зарегистрируем веб -сайт, клиент передает пароль, который мы ввели на сервер, который должен быть контентом после обработки дигеста сообщения. Даже если сервер сломан, Hack не сможет узнать, каков реальный пароль пользователя. Тем не менее, говорят, что MD5 и SHA были скомпрометированы, так что вы можете Google.
1. MD5
пакет com.amuro.strategy.message_digest; import java.security.messagedigest; импорт java.security.nosuchalgorithmexception; импорт org.apache.commons.codec.binary.hex; импорт com.amuro.strategy.istrategy; Md5strategy реализует IStrategy {public String Encode (String src) {try {MessageDigest md = messagedigest.getInstance ("md5"); byte [] encodebytes = md.digest (src.getbytes ()); вернуть hex.encodehexstring (encodebytes); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } return null; } public String Decode (String src) {бросить новое runtimeexception ("md5 no decode"); }}2. Ша
пакет com.amuro.strategy.message_digest; import java.security.messagedigest; импорт java.security.nosuchalgorithmexcept реализует istrategy {public String Encode (String src) {try {messagedigest md = messagedigest.getinstance ("sha"); md.update (src.getbytes ()); вернуть hex.encodehexstring (md.digest ()); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } return null; } public String Decode (String src) {бросить новое runtimeexception ("sha no decode"); }} 4. Симметричное шифрование <br /> Использование метода шифрования одной криптографической системы с одной ключом, один и тот же ключ можно использовать в качестве шифрования и дешифрования информации одновременно. Этот метод шифрования называется симметричным шифрованием, также известным как одноклетное шифрование. Поскольку как шифрование, так и дешифрование используют один и тот же ключ, как безопасно передавать ключ к дешиптору становится проблемой, которая должна быть решена. Конечно, преимуществами низкой безопасности являются небольшой объем расчетов, быстрая скорость шифрования и высокая эффективность шифрования.
Тем не менее, современные компьютеры давно перестали заботиться об этом уровне вычислений, и безопасность является наиболее важной вещью.
1. Дс
DES, полное имя - это «стандарт шифрования данных», а его китайское имя - «Стандарт шифрования данных» - это алгоритм блока, который использует шифрование ключей. Алгоритм DES является симметричной криптографической системой в криптографической системе, также известной как Американский стандарт шифрования данных. Это симметричный алгоритм шифрования шифрования криптографической системы, разработанный IBM в Соединенных Штатах в 1972 году. Плосовый текст сгруппируется на 64 бита, а ключ на самом деле-56-битный метод шифрования, который участвует в операции DES (8-е, 16, 24, 32, 40, 48, 56, биты, которые являются битами, так что каждый ключ-нечетные номера), а у каждых ключи-нечетные, и нечетные, и нечетные номера), и у каждого ключа 1S). замена или обмен на сформирование метода шифрования группы шифрового текста.
Пакет com.amuro.strategy.des; import javax.crypto.cipher; импорт javax.crypto.keygenerator; import javax.crypto.secretkey; импорт javax.crypto.secretkeyfactory; импорт javax.crypto.spec.deskeyspec; import ourge.comons.codec.codex com.amuro.strategy.istrategy;/** * * @author amuro * */public class desstrategy реализует istrategy {private cipher cipher; Частный секретный клавиш GenerateKey; public String Encode (String src) {try {keygenerator keygenerator = keygenerator.getInstance ("des"); keygenerator.init (56); // size secretkey secretkey = keygenerator.generatekey (); byte [] keybytes = secretkey.getencoded (); Deskeyspec deskeyspec = new deskeyspec (keybytes); SecretKeyFactory secretKeyFactory = secretKeyFactory.getInstance ("des"); GenerateKey = secretKeyFactory.GenerateCret (deskeySpec); cipher = cipher.getInstance ("des/ecb/pkcs5padding"); cipher.init (cipher.encrypt_mode, GenerateKey); byte [] resultbytes = cipher.dofinal (src.getbytes ()); вернуть hex.encodehexstring (resultbytes); } catch (Exception e) {e.printstackTrace (); } return null; } public String decode (String src) {try {cipher.init (cipher.decrypt_mode, GenerateKey); byte [] result = hex.decodehex (src.tochararray ()); вернуть новую строку (cipher.dofinal (result)); } catch (Exception e) {e.printstackTrace (); } return null; }}2. 3des3des, также известный как «тройной DES», называется «Алгоритм шифрования тройного шифрования данных», что эквивалентно применению алгоритма шифрования DES в три раза к каждому блоку данных. Благодаря расширенной компьютерной вычислительной мощности, длина клавиши исходного пароля DES стала легко продуманной; 3DES предназначен для предоставления относительно простого метода, чтобы избежать аналогичных атак, увеличивая ключевую длину DES, а не для разработки совершенно нового алгоритма шифров блока.
пакет com.amuro.strategy.des; import javax.crypto.cipher; import javax.crypto.keygenerator; import javax.crypto.secretkey; импорт javax.crypto.secretKeyFactory; import javax.crypto.spec.deseDexpec; importChear.commons.cdec.cdec.cdec.cdec.cdec.cdec.codec.cdec.cdec.cdec.cdec.cdec.codec.cdec.cdec.codec.cdec.cdec.cdec. com.amuro.strategy.istrategy; public class _3desstrategy реализует Istrategy {private Cipher Cipher; Частный секретный клавиш GenerateKey; public String Encode (String src) {try {keygenerator keygenerator = keygenerator.getInstance ("desede"); keygenerator.init (168); // size secretkey secretkey = keygenerator.generatekey (); byte [] keybytes = secretkey.getencoded (); Desedekeyspec deskeyspec = new desedekeyspec (keybytes); Secretkeyfactory secretkeyfactory = secretkeyfactory.getinstance ("desede"); GenerateKey = secretKeyFactory.GenerateCret (deskeySpec); cipher = cipher.getInstance ("desede/ecb/pkcs5padding"); cipher.init (cipher.encrypt_mode, GenerateKey); byte [] resultbytes = cipher.dofinal (src.getbytes ()); вернуть hex.encodehexstring (resultbytes); } catch (Exception e) {e.printstackTrace (); } return null; } public String decode (String src) {try {cipher.init (cipher.decrypt_mode, GenerateKey); byte [] result = hex.decodehex (src.tochararray ()); вернуть новую строку (cipher.dofinal (result)); } catch (Exception e) {e.printstackTrace (); } return null; }}3. aesaes, полное имя - «Advanced Encryption Standard», китайское название «Advanced Encryption Standard». Он также известен как метод шифрования Rijndael в криптографии. Это стандарт шифрования блока, принятый федеральным правительством США. В качестве нового поколения стандартов шифрования данных, алгоритм шифрования AES объединяет преимущества сильной безопасности, высокой производительности, высокой эффективности, простоты использования и гибкости. Дизайн AES имеет три ключевых длине: 128, 192, 256 бит. Относительно говоря, 128 ключ из AES в 1021 раза сильнее, чем 56 клавиш DES.
Пакет com.amuro.strategy.des; импорт javax.crypto.cipher; импорт javax.crypto.keygenerator; import javax.crypto.secretkey; импорт javax.crypto.spec.secretkeyspec; импорт org.apache.commons.codec.binary.hexmistre.shipare.murate. Aesstrategy реализует Istrategy {Private Cipher Cipher; Частный секретный клавиш GenerateKey; public String Encode (String src) {try {keygenerator keygenerator = keygenerator.getInstance ("aes"); keygenerator.init (128); // size secretkey secretkey = keygenerator.generatekey (); byte [] keybytes = secretkey.getencoded (); GenerateKey = new SecretKeySpec (KeyBytes, "AES"); cipher = cipher.getInstance ("AES/ECB/PKCS5Padding"); cipher.init (cipher.encrypt_mode, GenerateKey); byte [] resultbytes = cipher.dofinal (src.getbytes ()); вернуть hex.encodehexstring (resultbytes); } catch (Exception e) {e.printstackTrace (); } return null; } public String decode (String src) {try {cipher.init (cipher.decrypt_mode, GenerateKey); byte [] result = hex.decodehex (src.tochararray ()); вернуть новую строку (cipher.dofinal (result)); } catch (Exception e) {e.printstackTrace (); } return null; }} 4. PBE
PBE, полное имя «базовое шифрование пароля», представляет собой алгоритм шифрования на основе пароля. Его характеристика заключается в том, что вместо ключей используются пароли, а пароль управляется самим пользователем. Случайное число хэшировало множественное шифрование и другие методы для обеспечения безопасности данных.
Алгоритм PBE не имеет концепции ключа и рассматривает пароль как ключ. Поскольку длина ключа влияет на безопасность алгоритма и не удобна для памяти, для нас очень отличается непосредственно использовать пароль, который мы используем здесь, что удобно для нашей памяти. Тем не менее, простые пароли легко исчерпаны с помощью словарных методов, поэтому мы добавили немного «соли» в пароль здесь. Эта комбинация соли и паролей трудно взломать. В то же время мы много раз объединяем соль и пароль и итерации с алгоритмом дигеста сообщений, чтобы создать основной материал вектора ключа инициализации, что делает расшифровку еще более сложным.
пакет com.amuro.strategy.pbe; import java.security.securerandom; import javax.crypto.cipher; import javax.crypto.secretkey; import javax.crypto.secretkey; import javax.crypto.secretkeyfactory; import.crypto.specpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpecpec. javax.crypto.spec.pbeparameterspec; import org.apache.commons.codec.binary.hex; import com.amuro.strategy.istrategy;/** * Шифрование на основе пароля (пароль), симметрия + Digest * @author amuro *//public clus Частный секретный клавиш GenerateKey; Частный Pbeparameterspec pbeparameterspec; public String Encode (String src) {try {securerandom securerandom = new Securerandom (); byte [] salt = securerandom.generateseed (8); String password = "amuro"; Pbekeyspec pbekeyspec = new pbekeyspec (password.thararray ()); SecretKeyFactory secretKeyFactory = secretKeyFactory.getInstance ("pbewithmd5anddes"); GenerateKey = secretKeyFactory.GenerateCret (pbeKeySpec); pbeparameterspec = new pbepparameterspec (соль, 100); cipher = cipher.getInstance ("pbewithmd5anddes"); cipher.init (cipher.encrypt_mode, generatekey, pbeparameterspec); byte [] resultbytes = cipher.dofinal (src.getbytes ()); вернуть hex.encodehexstring (resultbytes); } catch (Exception e) {e.printstackTrace (); } return null; } public String decode (String src) {try {cipher.init (cipher.decrypt_mode, GenerateKey, PbeParameterSpec); byte [] result = hex.decodehex (src.tochararray ()); вернуть новую строку (cipher.dofinal (result)); } catch (Exception e) {e.printstackTrace (); } return null; }} 5. Асимметричное шифрование <br /> Алгоритм асимметричного шифрования требует двух ключей для шифрования и расшифровки, а именно общего ключа и личного ключа. Отнесее отметить, что открытый ключ и закрытый ключ должны быть парой. Если данные зашифрованы с помощью открытого ключа, то можно расшифровать только соответствующий закрытый ключ, и наоборот. Поскольку шифрование и дешифрование используют два разных клавиша, этот алгоритм называется асимметричным алгоритмом шифрования.
1. RSA
Фактически, RSA появился еще в 1978 году, и это был первый алгоритм, который можно использовать как для шифрования данных, так и для цифровых подписей. Это легко понять и работать, а также очень популярен. Принцип такой, как описано в вышеуказанном рабочем процессе. Алгоритм RSA основан на очень простом факте теории чисел: легко умножить два больших первичных чисел, но чрезвычайно трудно факторизировать их продукты, поэтому продукт может быть раскрыт как ключ шифрования.
Package com.amuro.strategy.asymmetric; импорт java.security.keyfactory; импорт java.security.keypair; import java.security.keypairgenerator; импорт java.security.privatekey; import java.security.publickey; import java.security.Interfaces.rsapRivatekey. java.security.interfaces.rsapublickey; import java.security.spec.pkcs8encodedkeyspec; import java.security.spec.x509encodedkeyspec; импорт javax.crypto.cipher; импорт org.pache.commons.codec. RSastrategy реализует Istrategy {private rsapublickey rsapublickey; Частный rsaprivatekey rsaprivatekey; public String Encode (String src) {try {// инициализировать ключ KeyPairgenerator KeyPairgenerator = KeyPairGenerator.getInstance ("rsa"); keypairgenerator.initialize (512); Клавиша клавиши = KeyPairGenerator.GenerateKeyPair (); rsapublickey = (rsapublickey) keypair.getPublic (); rsaprivatekey = (rsaprivatekey) keypair.getPrivate (); // Шифрование закрытого ключа открытого ключа Decryption PKCS8encodeDkeySpec pkcs8encodeDkeySpec = new Pkcs8encodkeySpec (rsaprivatekey.getEncoded ()); KeyFactory KeyFactory = keyFactory.getInstance ("rsa"); PrivateKey PrivateKey = keyFactory.GeneratePrivate (PKCS8encodeDkeySpec); Шифр Cipher = cipher.getInstance ("rsa"); cipher.init (cipher.encrypt_mode, privatekey); byte [] resultbytes = cipher.dofinal (src.getbytes ()); // закрытый ключ расшифровка общедоступного ключа // x509encodedkeyspec x509encodedkeyspec = // new x509encodkeyspec (rsapublickey.getencoded ()); // keyfactory keyfactory = keyfactory.getinstance ("rsa"); keyFactory.GeneratePublic (x509encodeDkeySpec); // cipher cipher = cipher.getinstance ("rsa"); // cipher.init (cipher.encrypt_mode, publickey); // byte [] resultbytes = cipher.dofinal (src.getbytes ()); вернуть hex.encodehexstring (resultbytes); } catch (Exception e) {e.printstackTrace (); } return null; } public String Decode (String src) {try {// закрытый ключ шифрование открытого ключа Decryption x509encodedkeyspec x509encodedkeyspec = new x509encodkeyspec (rsapublickey.getencoded ()); KeyFactory KeyFactory = keyFactory.getInstance ("rsa"); Publickey publickey = keyfactory.generatepublic (x509encodedkeyspec); Шифр Cipher = cipher.getInstance ("rsa"); cipher.init (cipher.decrypt_mode, publickey); byte [] resultbytes = cipher.dofinal (hex.decodehex (src.tochararray ())); // закрытый ключ расшифрованное шифрование // pkcs8encodedkeyspec pkcs8encodkeyspec // = new pkcs8encodkeyspec (rsaprivatekey.getencoded ()); // keyFactory KeyFactory = keyFactory.getStance ("rsa"); keyFactory.GeneratePrivate (pkcs8encodeDkeySpec); // cipher cipher = cipher.getinstance ("rsa"); // cipher.init (cipher.decrypt_mode, privatekey); // byte [] resultbytes = cipher.dofinal (hex.decodehex (sr.to); вернуть новую строку (ResultBytes); } catch (Exception e) {e.printstackTrace (); } return null; }} 2. DH Algorithm
DH, полное имя «Diffie-Hellman», является методом, обеспечивающего безопасное общее ключ, которые безопасно пересекают небезопасные сети, которые часто называют ключевым консенсусным протоколом. Идея, предложенная Diffie и Hellman, основателями системы криптографии открытого ключа. Проще говоря, это позволить двум пользователям обмениваться информацией о общественных медиа, чтобы генерировать «последовательные» и общие ключи. То есть Party A создает пару ключей (открытый ключ, частный ключ), а партия B генерирует пару ключей партии B (открытый ключ, закрытый ключ) на основе открытого ключа партии A.
Принимая это в качестве базовой линии в качестве основы для конфиденциальности передачи данных, обе стороны используют один и тот же алгоритм симметричного шифрования, чтобы построить локальный ключ (SecretKey) для шифрования данных. Таким образом, после того, как алгоритм локального ключа (SecretKey) совместимо, партия A и сторона B раскрывают свои публичные ключи, зашифруя данные, используя открытый ключ другой стороны и только что личный ключ, и в то же время они могут использовать общедоступный ключ другой стороны и свой собственный личный ключ для расшифровки данных. Не только две стороны A и B, их можно расширить до многопартийной общей связи данных, которая завершает безопасную связь сетевых интерактивных данных!
пакет com.amuro.strategy.asymmetric; import java.security.keyfactory; импорт java.security.keypair; import java.security.keypairgenerator; импорт java.security.privatekey; импорт java.security. java.util.objects; импорт javax.crypto.cipher; импорт javax.crypto.keyagreement; импорт javax.crypto.secretkey; импорт javax.crypto.interfaces.dhpublickey; импорт javax.crypto.spec.dhparameterspec; org.apache.commons.codec.binary.hex; import com.amuro.strategy.istrategy; открытый класс DHStrategy реализует iStrategy {частный шифр; Частный секретный клавиш receiversecretkey; public String Encode (String src) {try {// инициализировать клавишу клавиши отправителя SenderKeyPairgenerator = keyPairGenerator.getInstance ("dh"); SenderKeyPairgenerator.initialize (512); Cowypair SenderKeyPair = SenderKeyPairgenerator.GenerateKeyPair (); PrivateKey SenderPrivateKey = senderKeyPair.getPrivate (); byte [] senderpublickeybytes = senderkeypair.getPublic (). getEncoded (); // Открытый ключ отправителя // инициализируйте ключ получателя, используйте открытый ключ отправителя keeiverKeyFactory = keyFactory.getInstance («dh»); X509encodedkeyspec x509encodedkeyspec = new x509encodkeyspec (senderpublickeybytes); Publickey receiverpublickey = receiverkeyfactory.generatepublic (x509encodkeyspec); Dhparameterspec dhparameterspec = ((dhpublickey) receiverpublickey) .getParams (); KeyPairGenerator ReceiverKeyPairgenerator = KeyPairGenerator.getInstance ("DH"); receiverkeypairgenerator.initialize (dhparameterspec); Клавиатура receiverkeypair = receiverkeypairgenerator.generatekeypair (); PrivateKey ReceiverPrivateKey = receiverKeyPair.getPrivate (); byte [] receiverpublickeybytes = receiverkeypair.getPublic (). getEncoded (); Geoagreement receiverKeyAgreement = KeyAgreement.getInstance ("DH"); receiverKeyAgreement.init (receiverPrivateKey); receiverKeyAgreement.dophase (ReceiverPublickey, True); receiversecretkey = receiverkeyagreement.generatesecret ("des"); // отправитель может зашифровать его, получив открытый ключ получателя. KeyFactory senderKeyFactory = keyFactory.getInstance ("dh"); x509encodkeyspec = new x509encodedkeyspec (receiverpublickeybytes); Publickey senderpublickey = senderkeyfactory.generatepublic (x509encodkeyspec); Geoagreement senderKeyAgreement = keyAgreement.getInstance ("dh"); SenderKeyAgreement.Init (SenderPrivateKey); SenderKeyAgreement.Dophase (SenderPublickey, True); SecretKey SenderSecretKey = SenderKeyAgreement.GenerateSecret ("des"); if (objects.equals (receiversecretkey, sendersecretkey)) {cipher = cipher.getinstance ("des"); cipher.init (cipher.encrypt_mode, sendersecretkey); byte [] result = cipher.dofinal (src.getbytes ()); вернуть hex.encodehexstring (результат); }} catch (Exception e) {e.printstackTrace (); } return null; } public String Decode (String src) {try {cipher.init (cipher.decrypt_mode, receiversecretkey); byte [] result = hex.decodehex (src.tochararray ()); вернуть новую строку (cipher.dofinal (result)); } catch (Exception e) {e.printstackTrace (); } return null; }} 6. Асимметричное шифрование сертификатов цифровой подписи уже очень безопасно, но есть еще один недостаток:
Сервер опубликовал свой открытый ключ. Мой компьютер зашифровал данные с помощью открытого ключа сервера A, а затем отправил их на сервер A. В настоящее время сервер B вторгся на мой компьютер и заменил открытый ключ, который я использовал для шифрования его общедоступным ключом, поэтому отправленные данные, которые я отправил, будут взломаны на личный ключ сервера B. Как предотвратить подделан общественного ключа?
Да, мы подумали о предыдущем сводке сообщения. Когда сервер выбросил мне открытый ключ, он также отправился в CA, чтобы подать заявку на цифровой сертификат. На самом деле, это в основном резюме сообщения об открытом ключе. С помощью этого сертификата, когда я шифровал его с помощью открытого ключа, я сначала могу проверить, подтверждается ли текущий открытый ключ, который мне отправили сервер A.
Вот своего рода RSA:
Пакет com.amuro.strategy.signature; import java.security.keyfactory; импорт java.security.keypair; import java.security.keypairgenerator; импорт java.security.privatekey; импорт Java.security.publickey; импорт java.sighurity; java.security.interfaces.rsaprivatekey; import java.security.interfaces.rsapublickey; import java.security.spec.pkcs8encodedkeyspec; импорт java.security.spec.x509encodkeyspec; public class rsasign {public static verifys verifysigne verifysign. KeyPairGenerator KeyPairGenerator = KeyPairGenerator.getInstance ("RSA"); keypairgenerator.initialize (512); Клавиша клавиши = KeyPairGenerator.GenerateKeyPair (); Publickey rsapublickey = (rsapublickey) keypair.getPublic (); Privatekey rsaprivatekey = (rsaprivatekey) keypair.getPrivate (); Pkcs8encodedkeyspec pkcs8encodedkeyspec = new pkcs8encodkeyspec (rsaprivatekey.getencoded ()); KeyFactory KeyFactory = keyFactory.getInstance ("rsa"); PrivateKey PrivateKey = keyFactory.GeneratePrivate (PKCS8encodeDkeySpec); Signature Signature = Signature.getInstance ("md5withrsa"); signature.initsign (privatekey); signature.update (src.getbytes ()); // генерировать байт -байты подписи байта [] signbytes = signature.sign (); X509encodedkeyspec x509encodedkeyspec = new x509encodkeyspec (rsapublickey.getencoded ()); keyFactory = keyFactory.getInstance ("rsa"); Publickey publickey = keyfactory.generatepublic (x509encodedkeyspec); signature = signature.getInstance ("md5withrsa"); signature.initverify (publickey); signature.update (src.getbytes ()); Boolean Isverififified = Signature.Verify (Signbytes); вернуть иверифицированные; } catch (Exception e) {e.printstackTrace (); } вернуть false; }} Что касается использования цифровых подписей и асимметричных алгоритмов шифрования, я также увидел отличный пример, и я поделюсь им с вами:
Увы, я купил слишком много книг в этом месяце, и я не могу вытащить это до конца месяца. Я случайно встретил Кларка на QQ:
1-2-3: «Кларк, мне нужно 200 Таэль Серебро, могу ли я одолжить его мне?»
Кларк: «Нет проблем. Я сейчас передам вам деньги. Пожалуйста, дайте мне iou».
1-2-3: «Большое спасибо. Я напишу вам слово».
Затем я создал новый документ Word, написал IOU и сохранил его. Тогда что мне делать? Я не могу отправить я прямо в Кларк по причинам:
1. Я не могу гарантировать, что Кларк не изменит «200 таэлей серебра» на «2000 таэлей серебра» после получения IOU.
2. Если я скучаю по долгу, Кларк не может доказать, что я написал iou.
3. Обычные документы Word не могут быть использованы в качестве доказательства судебных процессов.
К счастью, я подал заявку на цифровой сертификат. Сначала я шифровал IOU с моим закрытым ключом, а затем отправляю зашифрованный зашифрованный текст в Кларк в QQ. После того, как Кларк получил зашифрованный текст IOU, он загрузил мой открытый ключ на веб -сайте Центра сертификации цифровых сертификатов, а затем использовал мой открытый ключ для расшифровки зашифрованного текста. Он обнаружил, что это действительно было написано как «200 таэлей заимствованного серебра», поэтому Кларк мог с уверенностью одолжить мне деньги. Я бы не стал беспокоиться о том, что Кларк вмешивается в мой iou, потому что:
1. Поскольку шифвый текст, который я отправил в Кларк, Кларк не может его изменить. Кларк может изменить расшифрованное iou, но у Кларка нет моего личного ключа, поэтому он не может подражать мне шифровать IOU. Это называется защитой от вмешивания.
2. Поскольку IOU зашифровано с моим личным ключом, есть и только мои общедоступные ключи, которые могут быть расшифрованы. И наоборот, IOU, который может быть расшифрован с моим открытым ключом, должен быть зашифрован с моим личным ключом, и только я владею моим личным ключом, поэтому Кларк может доказать, что это было написано мной. Это называется анти-дэбтом.
3. Если я продолжал не платить деньги, Кларк подал в суд на меня в суде, и это документ «Слово», зашифрованное с моим личным ключом, может использоваться в качестве сертификата Ченга Танга. Потому что наша страна выпустила «Закон о электронном подписи Китайской Народной Республики», который делает цифровые подписи юридически эффективными.
Должно быть, вы заметили, что этот IOU, который был зашифрован с моим частным ключом, имеет характеристики подделки и анти-DEBT и может использоваться в качестве сертификата Ченгтана, который совпадает с эффектом «подписания» этого IOU. Кстати, процесс «шифрования Ious с моим частным ключом» называется цифровой подписью.
Это сводная статья, которая пишет некоторые обычно используемые технологии шифрования Java и основной код здесь для справки друзей.