DES、3DES、AES、PBE对称加密算法实现及应用
- 2019 年 10 月 3 日
- 笔记
1.????????
???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
????????????????????????????????????????????????????????????
????????????????????????????????
???????????????????????????
???????????????????DES?IDEA????DES??????????????????????AES?????????DES?
2.??????-DES
DES??????????????????????????????1972???IBM????????????????
???64?????????64????????56???DES????8?16?24?32?40?48?56?64?????? ???????????1?????????56?????????????????????????
???? | ?? | ???? | ???? | ??? |
---|---|---|---|---|
56 | 56 | ECB?CBC?PCBC?CTR?CTS?CFB?CFB8?128?OFB?OFB8?128 | NoPadding?PKCS5Padding?ISO10126Padding | JDK |
64 | 56 | ?? | PKCS7Padding?ISO10126d2Padding?X932Padding?ISO7816d4Padding?ZeroBytePadding | BC |
??Bouncy Castle???
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15</artifactId> <version>1.46</version> </dependency>
??Commons Codec???
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency>
Java?????
import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import org.apache.commons.codec.binary.Hex; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class DES { public static final String src = "des test"; public static void main(String[] args) { jdkDES(); bcDES(); } // ?jdk??: public static void jdkDES() { try { // ??KEY KeyGenerator keyGenerator = KeyGenerator.getInstance("DES"); keyGenerator.init(56); // ???? SecretKey secretKey = keyGenerator.generateKey(); // ???? byte[] bytesKey = secretKey.getEncoded(); // KEY?? DESKeySpec desKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(desKeySpec); // ?? Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("jdk des encrypt:" + Hex.encodeHexString(result)); // ?? cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); result = cipher.doFinal(result); System.out.println("jdk des decrypt:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } } // ?bouncy castle??: public static void bcDES() { try { Security.addProvider(new BouncyCastleProvider()); // ??KEY KeyGenerator keyGenerator = KeyGenerator.getInstance("DES", "BC"); keyGenerator.getProvider(); keyGenerator.init(56); // ???? SecretKey secretKey = keyGenerator.generateKey(); // ???? byte[] bytesKey = secretKey.getEncoded(); // KEY?? DESKeySpec desKeySpec = new DESKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DES"); Key convertSecretKey = factory.generateSecret(desKeySpec); // ?? Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("bc des encrypt:" + Hex.encodeHexString(result)); // ?? cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); result = cipher.doFinal(result); System.out.println("bc des decrypt:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } } }
?????
3.??????-3DES
?????????????????Triple Data Encryption Algorithm????TDEA?Triple DEA????3DES?Triple DES????????????????????????????????????DES???????????????????DES?????????????????3DES???????????????????????DES??????????????????????????????
Java?????
import java.security.Key; import java.security.SecureRandom; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import org.apache.commons.codec.binary.Hex; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class DES3 { public static final String src = "3des test"; public static void main(String[] args) { jdk3DES(); bc3DES(); } // ?jdk??: public static void jdk3DES() { try { // ??KEY KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede"); // ??????112?168 // keyGenerator.init(168); keyGenerator.init(new SecureRandom()); // ???? SecretKey secretKey = keyGenerator.generateKey(); // ???? byte[] bytesKey = secretKey.getEncoded(); // KEY?? DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); Key convertSecretKey = factory.generateSecret(desKeySpec); // ?? Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("jdk 3des encrypt:" + Hex.encodeHexString(result)); // ?? cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); result = cipher.doFinal(result); System.out.println("jdk 3des decrypt:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } } // ?bouncy castle??: public static void bc3DES() { try { Security.addProvider(new BouncyCastleProvider()); // ??KEY KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede", "BC"); keyGenerator.getProvider(); keyGenerator.init(168); // ???? SecretKey secretKey = keyGenerator.generateKey(); // ???? byte[] bytesKey = secretKey.getEncoded(); // KEY?? DESedeKeySpec desKeySpec = new DESedeKeySpec(bytesKey); SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede"); Key convertSecretKey = factory.generateSecret(desKeySpec); // ?? Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("bc 3des encrypt:" + Hex.encodeHexString(result)); // ?? cipher.init(Cipher.DECRYPT_MODE, convertSecretKey); result = cipher.doFinal(result); System.out.println("bc 3des decrypt:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } } }
4.??????-AES
??????????Advanced Encryption Standard????AES?????????Rijndael??????????????????????????????????DES????????????????????????????????????????????????NIST??2001?11?26????FIPS PUB 197???2002?5?26?????????2006????????????????????????????
???????????Joan Daemen?Vincent Rijmen???????????????Rijndael?????????????????Rijndael?????"Rhine doll"?
???? | ?? | ???? | ???? | ??? |
---|---|---|---|---|
128?192?256 | 128 | ECB?CBC?PCBC?CTR?CTS?CFB?CFB8?128?OFB?OFB8?128 | NoPadding?PKCS5Padding?ISO10126Padding | JDK?256????????????????? |
?? | ?? | ?? | PKCS7Padding?ZeroBytePadding | BC |
Java?????
import java.security.Key; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Hex; import org.bouncycastle.jce.provider.BouncyCastleProvider; public class AES { public static final String src = "aes test"; public static void main(String[] args) { jdkAES(); bcAES(); } // ?jdk??: public static void jdkAES() { try { // ??KEY KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(128); // ???? SecretKey secretKey = keyGenerator.generateKey(); // ???? byte[] keyBytes = secretKey.getEncoded(); // KEY?? Key key = new SecretKeySpec(keyBytes, "AES"); // ?? Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("jdk aes encrypt:" + Hex.encodeHexString(result)); // ?? cipher.init(Cipher.DECRYPT_MODE, key); result = cipher.doFinal(result); System.out.println("jdk aes decrypt:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } } // ?bouncy castle??: public static void bcAES() { try { Security.addProvider(new BouncyCastleProvider()); // ??KEY KeyGenerator keyGenerator = KeyGenerator.getInstance("AES", "BC"); keyGenerator.getProvider(); keyGenerator.init(128); // ???? SecretKey secretKey = keyGenerator.generateKey(); // ???? byte[] keyBytes = secretKey.getEncoded(); // KEY?? Key key = new SecretKeySpec(keyBytes, "AES"); // ?? Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("bc aes encrypt:" + Hex.encodeHexString(result)); // ?? cipher.init(Cipher.DECRYPT_MODE, key); result = cipher.doFinal(result); System.out.println("bc aes decrypt:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } } }
5.??????-PBE
PBE???Password Based Encryption?????????????????????????????????????????????????????????????????????
PBE???????????????????????????????????????PBE????KDF?????KDF?????????????????????“?”?salt?????????????????????????????????????????PBE???????????????????????DES?3DES?RC5????????
???????
?? | ???? | ?? | ???? | ???? | ?? |
---|---|---|---|---|---|
PBEWithMD5AndDES | 64 | 64 | CBC???? | PKCS5Padding?PKCS7Padding?ISO10126Padding?ZeroBytePadding????? | BC???? |
PBEWithMD5AndRC2 | 112 | 128 | |||
PBEWithSHA1AndDES | 64 | 64 | |||
PBEWithSHA1AndRC2 | 128 | 128 | |||
PBEWithSHAAndIDEA-CBC | 128 | 128 | |||
PBEWithSHAAnd2-KeyTripleDES-CBC | 128 | 128 | |||
PBEWithSHAAnd3-KeyTripleDES-CBC | 192 | 192 | |||
PBEWithSHAAnd128BitRC2-CBC | 128 | 128 | |||
PBEWithSHAAnd40BitRC2-CBC | 40 | 40 | |||
PBEWithSHAAnd128BitRC4 | 128 | 128 | |||
PBEWithSHAAnd40BitRC4 | 40 | 40 | |||
PBEWithSHAAndTwofish-CBC | 256 | 256 |
Java?????
import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import org.apache.commons.codec.binary.Hex; public class PBE { public static final String src = "pbe test"; public static void main(String[] args) { jdkPBE(); } // ?jdk??: public static void jdkPBE() { try { // ???? SecureRandom random = new SecureRandom(); byte[] salt = random.generateSeed(8); // ????? String password = "timliu"; PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray()); SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES"); Key key = factory.generateSecret(pbeKeySpec); // ?? PBEParameterSpec pbeParameterSpac = new PBEParameterSpec(salt, 100); Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES"); cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpac); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("jdk pbe encrypt:" + Hex.encodeHexString(result)); // ?? cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpac); result = cipher.doFinal(result); System.out.println("jdk pbe decrypt:" + new String(result)); } catch (Exception e) { e.printStackTrace(); } } }
?????