DES Algorithm
DES - это стандарт шифрования данных полного имени, который представляет собой алгоритм блока, который использует шифрование ключей. Он был определен как федеральный стандарт обработки данных (FIPS) Национальным Управлением по федеральному правительству США в 1976 году, а затем был широко распространен на международном уровне.
Существует три параметра записи алгоритма DES: ключ, данные и режим. Среди них ключ составляет 7 байтов, всего 56 бит, что является рабочим ключом алгоритма DES; Данные составляют 8 байтов, в общей сложности 64 бита, которые являются данными, которые должны быть зашифрованы или расшифрованы; Режим - это рабочий режим DES: шифрование или дешифрование.
Алгоритм DES превращает 64-битный входной блок открытого текста в 64-разрядный выходной блок зашифрованного текста. Ключ, который он использует, также 56-битный. Его алгоритм в основном разделен на два шага:
1) Начальная функция перестановки заключается в рекомбинации 64-битных блоков данных ввода в битах и разделите выход на две части: L0 и R0, каждая часть составляет 32 бита в длину. Правило перестановки состоит в том, чтобы переключить 58 -й бит ввода на первый бит, 50 -й бит на второй бит ... и т. Д., Последний бит - это оригинальный 7 -й бит. L0 и R0 - две части после выхода транспозиции, L0 - это левые 32 бита выхода, а R0 - правые 32 бита. Пример: установите входное значение перед транспозицией в D1D2D3 ... D64, затем результат после начальной перестановки: L0 = D58D50 ... D8; R0 = D57D49 ... D7.
Правила замены показаны в следующей таблице:
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,64,56,48,40,32,24,16,8 , 57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,53,55,47,39,31,23,15,7, 7,53,55,47,39,31,23,23,7,
2) После 16 итерационных операций получены L16 и R16. Возьмите это как вход и выполните обратную перестановку. Обратная перестановка является точно обратной работой начальной перестановки, тем самым получая выходной сигнал.
Этот алгоритм является представителем системы симметричного алгоритма шифрования и широко используется в компьютерных сетевых системах.
Основная реализация Java
пакет com.stone.security; Импорт java.security.key; Импорт java.security.securerandom; Импорт javax.crypto.cipher; Импорт javax.crypto.keygenerator; Импорт javax.crypto.secretkey; импортировать javax.crypto.secretkeyfactory; импортировать javax.crypto.spec.deskeyspec; Импорт javax.crypto.spec.ivparameterspec; / *** DES Algorithm 1972, разработанный IBM в Соединенных Штатах, Algorithm Symmetric Encryption*/ Public Class des {// Имя алгоритма публичная статическая конечная строка key_algorithm = "des"; // Имя алгоритма/режим шифрования/метод заполнения публичная статическая конечная строка Cipher_algorithm_ecb = "des/ecb/pkcs5padding"; public Static Final String Cipher_algorithm_cbc = "des/cbc/pkcs5padding"; public static void main (string [] args) бросает исключение { / * * Использовать режим ECB * Генератор ключей для генерации клавиши * Режим ECB не может использовать IV * / byte [] key = GenerateKey (); byte [] encrypt = incrypt ("Гаскулит F#*(x)". GetBytes (), Key); System.out.println (New String (Decrypt (Encrypt, Key))); / * * Используйте режим CBC * Используйте ключевую заводскую завод, чтобы сгенерировать ключ, шифрование и расшифровку * IV: DES в режиме CBC и RSA Ciphers с операцией кодирования OAEP. */ Deskeyspec dks = new deskeyspec (generatekey ()); SecretKeyFactory Factory = secretKeyFactory.getInstance (key_algorithm); SecretKey SecretKey = Factory.GenerateCret (DKS); Cipher cipher = cipher.getInstance (cipher_algorithm_cbc); cipher.init (cipher.encrypt_mode, secretkey, new ivparameterspec (getiv ())); byte [] enc = cipher.dofinal ("Гаскулит a%f#*(x)". getbytes ()); // incrypt cipher.init (cipher.decrypt_mode, secretkey, new ivparameterspec (getiv ())); byte [] dec = cipher.dofinal (enc); // расшифровывать System.out.println (New String (dec)); } static byte [] getiv () {string iv = "asdfivh7"; // IV Длина: должен быть длиной 8 байт return iv.getbytes (); } / ** * Сгенерировать ключ * * @return * @Throws Exception * / private Static Byte [] GenerateKey () Throws Exception {KeyGenerator Keygenerator = KeyGenerator.GetInstance (key_algorithm); keygenerator.init (56); // DES должен быть 56, этот начальный метод не должен вызывать SecretKey SecretKey = keyGenerator.GenerateKey (); return secretkey.getencoded (); } / ** * Восстановить клавишу * * @param ключа * @return * @throhs Exception * / private static key tokey (byte [] key) throws exection {deskeyspec des = new deskeyspec (key); SecretKeyFactory KeyFactory = secretKeyFactory.getInstance (key_algorithm); SecretKey SecretKey = keyFactory.GenerateCret (des); вернуть секретный клавиш; } / *** Encrypt* @param Data Original Text* @param Key* @return Ciphertext* @Throws Exception* / public Static Byte [] Encrypt (byte [] data, byte [] key) throws Exception {key k = tokey (key); Cipher cipher = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.encrypt_mode, K, new Securerandom ()); return cipher.dofinal (data); } / *** Decrypt* @param Data Password* @param ключ* @return Plain Text, исходный текст* @Throws Exception* / public Static Byte [] Decrypt (byte [] data, byte [] key) throws Exception {key k = tokey (key); Cipher cipher = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.decrypt_mode, K, new Securerandom ()); return cipher.dofinal (data); }} Java Triple DES Реализация:
пакет com.stone.security; Импорт javax.crypto.cipher; Импорт javax.crypto.keygenerator; Импорт javax.crypto.secretkey; импортировать javax.crypto.secretkeyfactory; Импорт javax.crypto.spec.desedekeyspec; Импорт javax.crypto.spec.ivparameterspec; / ** * Triple Encryption 3DES также используется в качестве Triple DES, */ Public Class Tripledes {// Имя алгоритма публичная статическая конечная строка key_algorithm = "desede"; // Имя алгоритма/режим шифрования/метод заполнения публичная статическая конечная строка cipher_algorithm_ecb = "desede/ecb/pkcs5padding"; public Static Final String Cipher_algorithm_cbc = "desede/cbc/pkcs5padding"; Частный ключа Keygen; Частный секретный тайник; Частный секретный секрет, 2; частный шифр шифр; частный статический байт [] EncryptData; public static void main (string [] args) бросает исключение {tripledes tripledes = new Tripledes ("ecb"); tripledes.encrypt ("sau8jzxlcvm, '123`98 (*^&%^^ jcb zx >> a <s <}} {"); system.out.println ("После шифрования:" + new String (tripledes.decrypt (encryptdata)); Tripledes = new Tripledes ("cbccrypt (encryptdata))); tripledes = new Tripledes (" cbcccpp (encryptdata))); Tripledes = "); tripledes.encrypt2 ("sau8jzxlc dqv#> <« | vm, '123`98 (*^&%^^ jcb zx >> a <s <}} {"); System.out.println (" После шифрования: " + new String (encryptdata); String (tripledes.decrypt2 (EncryptData)); Keygenerator.getinstance (key_algorithm); Deselekeyspec (keygen.generatekey (). GetEncoded ()); SecretKey); return encryptdata = cipher.dofinal (str.getbytes ()); } / ** * decrypt * @param incrypt * @return * @throhs excection * / public byte [] decrypt (byte [] encrypt) бросает исключение {cipher.init (cipher.decrypt_mode, secretkekekey); return encryptdata = cipher.dofinal (encrypt); } byte [] getiv () {return "administ" .getbytes (); } / ** * Encrypt * @param str * @return * @throhs Exception * / public byte [] encrypt2 (string str) throws exection {cipher.init (cipher.encrypt_mode, secretkey2, new ivparameterspec (getiv ())); return encryptdata = cipher.dofinal (str.getbytes ()); } / ** * decrypt * @param incrypt * @return * @throhs excection * / public byte [] decrypt2 (byte [] encrypt) throws exception {cipher.init (cipher.decrypt_mode, secretkey2, new ivparameterspec (getiv ()); return encryptdata = cipher.dofinal (encrypt); }}