1

在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);

为什么需要 aSecureRandom对象sr来初始化 Cipher 对象?至于解密方面,也需要一个SecureRandom与加密大小生成的对象不同的对象。这些SecureRandom对象仅用于奇偶校验位吗?

4

1 回答 1

2

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

CipherJavadocs解释了这个论点的目的:

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

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

于 2013-03-14T10:25:52.793 回答