技术开发 频道

了解Java密码扩展的基础


IT168技术文档】 
    生成密钥: 
    Listing D 展示了如果初时化密钥生成器来生成密钥;
import javax.crypto.KeyGenerator; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.Security; public class DESKeyGenerator { public static void main(String[] args) { Security.addProvider(new com.sun.crypto.provider.SunJCE()); try { KeyGenerator kg = KeyGenerator.getInstance("DES"); Key key = kg.generateKey(); System.out.println("Key format: " + key.getFormat()); System.out.println("Key algorithm: " + key.getAlgorithm()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } }
    为了生成密钥,我们首先要初始化密钥生成器,这一步可以通过调用KeyGenerator类的静态方法getInstance来实现。我们所用的vanilla DES算法没有模式和填充模型。你同样可以(在getInstance(""))传入DES/ECB/PKCS5Padding来指明模式(ECB)和填充模式(PKCS5Padding);也可以传入另外一个参数指明所用的提供者,不过这是可选的;
KeyGenerator kg = KeyGenerator.getInstance("DES"); 

    一旦我们有了特定的密钥生成对象,我们就可以用他得到密钥: 
    Key key = kg.generateKey(); 
    生成密码: 
    生成密码的过程跟生成密钥类似,需要调用Cipher类的getInstance方法,参数要跟生成密钥时用的参数保持一致; 
    Cipher cipher = Cipher.getInstance(“DES”); 

    Listing E 说明了如果操作:
import javax.crypto.Cipher; import javax.crypto.NoSuchPaddingException; import java.security.Security; import java.security.NoSuchAlgorithmException; public class DESCipherGenerator { public static void main(String[] args) { Security.addProvider(new com.sun.crypto.provider.SunJCE()); try { Cipher cipher = Cipher.getInstance("DES"); System.out.println("Cipher provider: " + cipher.getProvider()); System.out.println("Cipher algorithm: " + cipher.getAlgorithm()); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } } }
    加解密数据 
    加密是对字节的,所以保密行比较高,当你准备好了密钥和密码时,你已经做好了加密的准备,要注意的时,同一个算法要用相同的密钥和密码,比如说,你不能用DESsede的密钥,用DES的密码,密码对象用同一个方法对数据进行加密和解密,所有你要首先初时化,让他知道你要干什么: 
    cipher.init(Cipher.ENCRYPT_MODE, key); 
    这就将初始化Cipher类,以准备好加密数据,.最简单的加密方法及时对传入的字节数组调用doFinal方法:
byte[] data = “Hello World!”.getBytes(); byte[] result = cipher.doFinal(data); Listing F 是详细的代码 Listing F: DESCryptoTest.java import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import javax.crypto.IllegalBlockSizeException; import javax.crypto.BadPaddingException; import java.security.Key; import java.security.Security; import java.security.NoSuchAlgorithmException; import java.security.InvalidKeyException; public class DESCryptoTest { public static void main(String[] args) { Security.addProvider(new com.sun.crypto.provider.SunJCE()); try { KeyGenerator kg = KeyGenerator.getInstance("DES"); Key key = kg.generateKey(); Cipher cipher = Cipher.getInstance("DES"); byte[] data = "Hello World!".getBytes(); System.out.println("Original data : " + new String(data)); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] result = cipher.doFinal(data); System.out.println("Encrypted data: " + new String(result)); cipher.init(Cipher.DECRYPT_MODE, key); byte[] original = cipher.doFinal(result); System.out.println("Decrypted data: " + new String(original)); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } } }
    总结:JCE是个功能强大的API,提供了众多的加密方法和其他安全相关的属性,我们已经找到怎样动态和静态安装JCE,并用DES对一段简单的信息进行了加密和解密,在本系列的第二部分,我们将把本文的知识用到现实的应用中去,将告诉大家如果写一个跟Socket配合使用的包装类(Wrapper),用以加密你网上交易的重要信息。
0
相关文章