在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
对象仅用于奇偶校验位吗?
答案 0 :(得分:2)
SecureRandom
对象是可选的。如果您不选择一个,Java将使用默认的随机源。请参阅this method的文档以了解如何选择一个。
Cipher
Javadocs解释了这个论点的目的:
如果这个密码(包括它的底层反馈或填充方案)需要任何随机字节(例如,用于参数生成),它将从随机获得它们。
因此,在您的特定情况下,您可能根本没有使用此项目。 DES使用中的任何内容都不需要随机数据(因为您似乎使用的是ECB模式)。如果您使用CBC模式,那么我假设IV将从SecureRandom
对象中随机生成。