Algorithme du cryptage
DES est la norme de chiffrement des données de nom complet, qui est un algorithme de bloc qui utilise le cryptage des clés. Il a été déterminé comme la norme fédérale de traitement des données (FIPS) par le Bureau national des normes du gouvernement fédéral américain en 1976, et a ensuite été largement diffusé à l'étranger.
Il existe trois paramètres d'entrée de l'algorithme DES: clé, données et mode. Parmi eux, la clé est de 7 octets, 56 bits au total, qui est la clé de travail de l'algorithme DES; Les données sont de 8 octets, 64 bits au total, qui sont les données à crypter ou à déchiffrer; Le mode est le mode de travail de DES: cryptage ou décryptage.
L'algorithme DES transforme le bloc d'entrée en texte clair 64 bits dans un bloc de sortie de texte chiffré 64 bits. La clé qu'il utilise est également 56 bits. Son algorithme est principalement divisé en deux étapes:
1) La fonction de permutation initiale consiste à recombiner les blocs de données d'entrée 64 bits en bits et à diviser la sortie en deux parties: L0 et R0, chaque pièce mesure 32 bits. La règle de permutation consiste à basculer le 58e bit de l'entrée au premier bit, le 50e bit au deuxième bit ... et ainsi de suite, le dernier bit est le 7ème bit d'origine. L0 et R0 sont les deux parties après la sortie de transposition, L0 est les 32 bits gauche de la sortie et R0 est les droits de 32 bits. Exemple: définissez la valeur d'entrée avant la transposition sur D1d2d3 ... D64, puis le résultat après la permutation initiale est: l0 = d58d50 ... d8; R0 = d57d49 ... d7.
Les règles de remplacement sont affichées dans le tableau suivant:
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,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,
2) Après 16 opérations d'itération, L16 et R16 sont obtenus. Prenez cela en entrée et effectuez une permutation inverse. La permutation inverse est exactement le fonctionnement inverse de la permutation initiale, obtenant ainsi la sortie de texte chiffré.
Cet algorithme est un représentant du système d'algorithme de chiffrement symétrique et est largement utilisé dans les systèmes de réseau informatique.
Implémentation de base Java
Package Com.stone.Security; Importer java.security.key; Importer Java.Security.SeCurère et; import javax.crypto.cipher; Importer javax.crypto.keygenerator; Importer Javax.crypto.SecretKey; Importer Javax.crypto.SecretKeyFactory; Importer javax.crypto.spe.deskeyspec; Importer javax.crypto.spe.ivParameterspec; / ** * DES Algorithm 1972 développé par IBM aux États-Unis, algorithme de cryptage symétrique * / classe publique des {// algorithm nom public statique final string key_algorithm = "des"; // Nom d'algorithme / mode de chiffrement / Méthode de remplissage Public Static Final String cipher_algorithm_ecb = "DES / ECB / PKCS5PADDING"; Public Static Final String cipher_algorithm_cbc = "DES / CBC / PKCS5PADDING"; public static void main (String [] args) lance l'exception {/ * * Utiliser le mode ECB * Générateur de touches pour générer la clé * Le mode ECB ne peut pas utiliser iv * / byte [] key = generateKey (); octet [] Encrypt = Encrypt ("Gasculite F # * (X)". GetBytes (), Key); System.out.println (new String (Decrypt (Encrypt, Key))); / * * Utilisez le mode CBC * Utilisez l'usine de clés pour générer la clé, crypter et décrypter * iv: DES en mode CBC et chiffrements RSA avec opération de codage OAEP. * / Deskeyspec dks = new deskeyspec (generateKey ()); SecretKeyFactory Factory = SecretKeyFactory.getInstance (key_algorithm); SecretKey SecretKey = Factory.GenerateSeCret (DKS); Cipher cipher = cipher.getInstance (cipher_algorithm_cbc); cipher.init (cipher.encpt_mode, SecretKey, new ivParameterspec (getiv ())); octet [] ENC = Cipher.Dofinal ("Gasculite A% F # * (x)". GetBytes ()); // Encrypt Cipher.init (cipher.decrypt_mode, SecretKey, new ivParameterspec (getiv ())); octet [] dec = cipher.dofinal (ENC); // Decrypt System.out.println (new String (dec)); } octet statique [] geniv () {String iv = "asdfivh7"; // Longueur iv: doit être de 8 octets de long retour iv.getbytes (); } / ** * générer une clé * * @return * @throws exception * / private static byte [] generateKey () lève exception {keyGenerator keyGenerator = keyGenerator.getInstance (key_algorithm); KeyGenerator.Init (56); // DES doit être 56, cette méthode initiale n'a pas à appeler SecretKey SecretKey = KeyGenerator.GenerateKey (); return SecretKey.getEncoded (); } / ** * Restore Key * * @param key * @return * @throws exception * / private static key tokey (byte [] key) exception {deskeyspec des = new deskeyspec (key); SecretKeyFactory KeyFactory = SecretKeyFactory.getInstance (key_algorithm); SecretKey SecretKey = KeyFactory.GenerateSeCret (DES); Retour Secretkey; } / ** * Encrypt * @param Données Texte d'origine * @Param Key * @return CiPherText * @throws Exception * / public static byte [] Encrypt (byte [] data, byte [] key) lève une exception {key k = tokey (key); Cipher cipher = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.encrypt_mode, K, new SecureRandom ()); return cipher.dofinal (données); } / ** * Decrypt * @Param Data Motword * @param key * @return Plain Text, Texte d'origine * @throws exception * / public static byte [] decrypt (byte [] data, byte [] key) lève une exception {key k = tokey (key); Cipher cipher = cipher.getInstance (cipher_algorithm_ecb); cipher.init (cipher.decrypt_mode, K, new SecureRandom ()); return cipher.dofinal (données); }} Java Triple DES Implémentation:
Package Com.stone.Security; import javax.crypto.cipher; Importer javax.crypto.keygenerator; Importer Javax.crypto.SecretKey; Importer Javax.crypto.SecretKeyFactory; Importer javax.crypto.spe.desedekeyspec; Importer javax.crypto.spe.ivParameterspec; / ** * Triple Encryption 3DES est également utilisé comme triple DES, * / Classe publique Triplées {// Nom d'algorithm String statique final statique key_algorithm = "Deede"; // Nom d'algorithme / Mode de chiffrement / Méthode de remplissage public Static Final String cipher_algorithm_ecb = "Dedede / ECB / PKCS5PADDING"; Public Static Final String cipher_algorithm_cbc = "Dedede / CBC / PKCS5PADDING"; KeyGenerator privé Keygen; Secretkey privé Secretkey; Private SecretKey SecretKey2; Cipher privé; octet statique privé [] EncryptData; public static void main (String [] args) lève une exception {Tripledes tripledes = new tripledes ("ECB"); Tripledes.encrypt ("SAU8JZXLCVM, '123`98 (* ^ &% ^^ JCB ZX >> A <S <}} {"); System.out.println ("After Encryption:" + New String (Triples.Decrypt (CryptData))); Trides = New Tripledes ("CBC"); Tripledes.encrypt2 ("SAU8JZXLC DQV #> <« | VM, '123`98 (* ^ &% ^^ JCB ZX >> A <S <}} {"); System.out.println (" After Encryption: "+ New String (EncryptData)); System.out.println (" After Decrypt: "+ New String (Triplets.Decrypt2 (EncryptData)));} Public Tripledes (Mode String) lance une exception {if ("ecb" .equals (mode)) {// cipher = cipher.getInstance (CIPHER_ALGORITHM); KeyGenerator.getInstance (key_algorithm); SecretKey = keygen. Deedekeyspec (keygen.generateKey (). GetEncoded ()); SecretKey2 = SecretKeyFactory.getInstance (Key_algorithm). Cipher.init (cipher.encrypt_mode, SecretKey); return EncryptData = cipher.dofinal (str.getBytes ()); } / ** * Decrypt * @param Encrypt * @return * @throws exception * / public byte [] decrypt (byte [] Encrypt) lève une exception {cipher.init (cipher.decrypt_mode, secretKey); return EncryptData = Cipher.Dofinal (Encrypt); } byte [] geniv () {return "administe" .getBytes (); } / ** * Encrypt * @param str * @return * @throws exception * / public octet [] Encrypt2 (String str) lève une exception {cipher.init (cipher.encrypt_mode, secretKey2, new ivParametersPec (getiv ())); return EncryptData = cipher.dofinal (str.getBytes ()); } / ** * Decrypt * @param Encrypt * @return * @throws exception * / public byte [] decrypt2 (byte [] Encrypt) lève une exception {cipher.init (cipher.decrypt_mode, secrétkey2, nouveau ivParameterspec (getiv ())); return EncryptData = Cipher.Dofinal (Encrypt); }}