在Java中初始化一个Cipher对象

时间:2013-03-14 10:13:37

标签: java encryption des

在java中加密数据时如下:

    SecureRandom sr = new SecureRandom();  
    DESKeySpec dks = new DESKeySpec(rawKeyData);

    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
    SecretKey key = keyFactory.generateSecret(dks);  
    Cipher cipher = Cipher.getInstance("DES");  
    cipher.init(Cipher.ENCRYPT_MODE, key, sr);  
    // why the sr is necessary to init a Cipher object?
    byte data[] = str.getBytes();  
    byte[] encryptedData = cipher.doFinal(data);

为什么启动Cipher对象需要SecureRandom对象sr?至于解密侧,还需要一个SecureRandom对象,它与加密大小中生成的对象不同。这些SecureRandom对象仅用于奇偶校验位吗?

1 个答案:

答案 0 :(得分:2)

SecureRandom对象是可选的。如果您不选择一个,Java将使用默认的随机源。请参阅this method的文档以了解如何选择一个。

Cipher Javadocs解释了这个论点的目的:

  

如果这个密码(包括它的底层反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从随机获得它们。

因此,在您的特定情况下,您可能根本没有使用此项目。 DES使用中的任何内容都不需要随机数据(因为您似乎使用的是ECB模式)。如果您使用CBC模式,那么我假设IV将从SecureRandom对象中随机生成。