Des Verschlüsselungsalgorithmus
DES ist der vollständige Standard -Datenverschlüsselungsstandard, bei dem es sich um einen Blockalgorithmus handelt, der die Schlüsselverschlüsselung verwendet. Es wurde als FIPS (Federal Data Processing Standard (FIPS) durch das nationale Standards der US -Bundesregierung im Jahr 1976 bestimmt und später international verbreitet.
Es gibt drei Eingabeparameter des DES -Algorithmus: Schlüssel, Daten und Modus. Unter ihnen ist der Schlüssel insgesamt 7 Bytes, insgesamt 56 Bit, was der Arbeitschlüssel des Des -Algorithmus ist. Die Daten betragen 8 Bytes, insgesamt 64 Bit, was die Daten sind, die verschlüsselt oder entschlüsselt werden sollen. Modus ist der Arbeitsmodus von DES: Verschlüsselung oder Entschlüsselung.
Der DES-Algorithmus verwandelt den 64-Bit-Klartext-Eingangsblock in einen 64-Bit-Ciphertext-Ausgangsblock. Der Schlüssel, den es verwendet, ist ebenfalls 56-Bit. Sein Algorithmus ist hauptsächlich in zwei Schritte unterteilt:
1) Die anfängliche Permutationsfunktion besteht darin, die Eingang 64-Bit-Datenblöcke in Bits zu rekombinieren und die Ausgabe in zwei Teile zu unterteilen: L0 und R0, jeder Teil ist 32 Bit lang. Die Permutationsregel besteht darin, das 58. Bit des Eingangs auf das erste Bit zu wechseln, das 50. Bit zum zweiten Bit ... und so weiter, das letzte Bit ist das ursprüngliche 7. Bit. L0 und R0 sind die beiden Teile nach der Transpositionsausgabe, L0 sind die linken 32 Bit des Ausgangs und R0 die rechten 32 Bit. Beispiel: Setzen Sie den Eingangswert vor der Transposition zu D1D2D3 ... D64, dann ist das Ergebnis nach der anfänglichen Permutation: l0 = D58D50 ... D8; R0 = D57D49 ... D7.
Die Ersatzregeln sind in der folgenden Tabelle angezeigt:
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,5,63,55,47,39,31,23,15,7, 7, 7,5,63,55,47,31,15,7.
2) Nach 16 Iterationsoperationen werden L16 und R16 erhalten. Nehmen Sie dies als Input und führen Sie umgekehrte Permutation durch. Die inverse Permutation ist genau der inverse Betrieb der anfänglichen Permutation, wodurch die Ciphertext -Leistung erzielt wird.
Dieser Algorithmus ist ein Vertreter des symmetrischen Verschlüsselungsalgorithmus -Systems und wird in Computernetzwerksystemen häufig verwendet.
Grundlegende Java -Implementierung
Paket com.stone.security; import Java.Security.Key; Java.security.securerandom importieren; importieren javax.crypto.cipher; import Javax.Crypto.KeyGenerator; importieren javax.crypto.secretkey; importieren javax.crypto.secretkeyFactory; importieren javax.crypto.spec.deskeyspec; importieren javax.crypto.spec.ivparameterspec; / *** des Algorithmus 1972 entwickelt von IBM in den Vereinigten Staaten, symmetrischer Verschlüsselungsalgorithmus*/ Public Class Des {// Algorithmus Name Public static Final String KEY_ALGORITHM = "DES"; // Algorithmus Name/Verschlüsselungsmodus/Füllmethode öffentliche statische endgültige Zeichenfolge cipher_algorithm_ecb = "Des/ecb/pkcs5padding"; public static Final String cipher_algorithmus_cbc = "Des/CBC/PKCS5Padding"; public static void main (String [] args) löst Ausnahme aus { / * * Verwenden Sie den ECB -Modus * Schlüsselgenerator, um den Schlüssel zu generieren. Byte [] Encrypt = Encrypt ("Gasculitis f#*(x)". getBytes (), Schlüssel); System.out.println (neuer String (decrypt (verschlüsseln, Schlüssel)); / * * Verwenden Sie den CBC -Modus * Verwenden Sie die Schlüsselfabrik, um den Schlüssel, Verschlüsseln und Entschlüsseln zu generieren * IV: DES im CBC -Modus und RSA -Chiffren mit OAEP -Codierungsoperation. */ Deskeyspec dks = new Deskeyspec (generateKey ()); SecryKeyFactory factory = secryKeyFactory.getInstance (Key_Algorithmus); SecretKey SecretKey = factory.generateSecret (dks); Cipher Cipher = cipher.getInstance (Cipher_algorithmus_cbc); cipher.init (cipher.encrypt_mode, secryKey, neuer ivparameterspec (getiv ())); byte [] Enc = cipher.dofinal ("Gasculitis A%f#*(x)". getBytes ()); // cipher.init (cipher.decrypt_mode, secryKey, neuer ivParameterspec (getiv ())); byte [] dec = cipher.dofinal (ENC); // entschlüsseln system.out.println (neuer String (dec)); } static byte [] getiv () {String iv = "Asdfivh7"; // IV Länge: Muss 8 Bytes langen Rückkehr iv.getBytes () sein; } / ** * Taste generieren * * @return * @throws Exception * / private static byte [] generateKey () löst Ausnahme aus {KeyGenerator keygenerator = keygenerator.getInstance (KEY_ALGORITHM); Keygenerator.init (56); // Des muss 56 sein, diese anfängliche Methode muss SecretKey SecretKey nicht nennen. return SecretKey.getEcoded (); } / ** * Taste wiederherstellen * * @param key * @return * @throws Exception * / private static Key Tey (Byte [] Key) löst eine Ausnahme aus {Deskeyspec Des = new Deskeyspec (Key); SecryKeyFactory keyFactory = secryKeyFactory.getInstance (Key_Algorithmus); SecretKey SecretKey = KeyFactory.generateSecret (DES); Return SecretKey; } / *** Encrypt* @param data Original Text* @param key* @return ciphertext* @throws Exception* / public static byte [] Encrypt (byte [] data, byte [] key) löst Ausnahme aus {Key k = tokey (key); Cipher Cipher = cipher.getInstance (Cipher_algorithm_ecb); cipher.init (cipher.encrypt_mode, k, new Securerandom ()); cipher.dofinal (Daten) zurückgeben; } / *** entschlüsselt* @param data password* @param key* @return plain text, original text* @throws exception* / public static byte [] entschlüsselt (byte [] data, byte [] key) löst eine Ausnahme aus {Key k = tokey (key); Cipher Cipher = cipher.getInstance (Cipher_algorithm_ecb); cipher.init (cipher.decrypt_mode, k, new Securerandom ()); cipher.dofinal (Daten) zurückgeben; }} Java Triple DES -Implementierung:
Paket com.stone.security; importieren javax.crypto.cipher; import Javax.Crypto.KeyGenerator; importieren javax.crypto.secretkey; importieren javax.crypto.secretkeyFactory; importieren javax.crypto.spec.desedekeyspec; importieren javax.crypto.spec.ivparameterspec; / ** * Triple Encryption 3DES wird auch als Triple DES verwendet, */ öffentliche Klasse Tripledes {// Algorithmus Name Public static Final String key_algorithmus = "Dese"; // Algorithmus Name/Verschlüsselungsmodus/Füllmethode Public static Final String cipher_algorithm_ecb = "Desede/ECB/PKCS5Padding"; public static Final String cipher_algorithmus_cbc = "Desede/CBC/PKCS5Padding"; privater Keygenerator Keygen; Private SecretKey SecretKey; Private SecretKey SecretKey2; Private Chiffre Chiffre; privates statisches Byte [] Encryptdata; public static void main (String [] args) löst eine Ausnahme aus (Tripledes Tripledes = New Tripledes ("ECB"); Tripledes.encrypt ("Sau8jzxlcvm, 123`98 (*^&%^^ jcb zx >> a <s <}} {"); System.out.println ("After verschlüsselt:" + new String (tripledes.decrypt (tripyptdata)))); Tripledes.encrypt2 ("Sau8jzxlc DQV#> <« | vm, 123`98 (*^&%^^ JCB ZX >> a <s <}} {"); System.out.println (" After verschlüsselt: " + new String (decryptdata); String (Tripledes.Decrypt2 (EncryptData)); Keygenerator.getInstance (key_algorithmus); DesedeKeyspec (Keygen.GenerateKey (). GETECODED ()); cipher.init (cipher.encrypt_mode, secryKey); return EncryptData = cipher.dofinal (str.getBytes ()); } / ** * entschlüsselt * @param encrypt * @return * @throws Exception * / public byte [] entschlüsselt (byte [] Encrypt) Ausnahme {Cipher.init (Cipher.decrypt_mode, SecretKey); return EncryptData = cipher.dofinal (Encrypt); } byte [] getiv () {return "administ" .GetByTes (); } / ** * Encrypt * @param str * @return * @throws Exception * / public byte [] Encrypt2 (String Str) löst Ausnahme aus {cipher.init (cipher.encrypt_mode, secryKey2, neuer ivparameterspec (getiv ()); return EncryptData = cipher.dofinal (str.getBytes ()); } / ** * entschlüsselt * @param Encrypt * @return * @throws Exception * / public byte [] decrypt2 (byte [] Encrypt) löst eine Ausnahme aus {cipher.init (cipher.decrypt_mode, secryKey2, new ivparameterSpec (getiv ()); return EncryptData = cipher.dofinal (Encrypt); }}