java DES加密和解密的困惑?

liu13430 发布于 2015/05/05 23:42
阅读 337
收藏 0
 /**
     * Description 根据键值进行加密
     * @param data
     * @param key  加密键byte数组
     * @return
     * @throws Exception
     */
    private staticbyte[] encrypt(byte[] data,byte[] key)throwsException {
        // 生成一个可信任的随机数源
        SecureRandom sr =newSecureRandom();
 
        // 从原始密钥数据创建DESKeySpec对象
        DESKeySpec dks =newDESKeySpec(key);
 
        // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
        SecretKey securekey = keyFactory.generateSecret(dks);
 
        // Cipher对象实际完成加密操作
        Cipher cipher = Cipher.getInstance(DES);
 
        // 用密钥初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
 
        returncipher.doFinal(data);
    }
     
     
    /**
     * Description 根据键值进行解密
     * @param data
     * @param key  加密键byte数组
     * @return
     * @throws Exception
     */
    private staticbyte[] decrypt(byte[] data,byte[] key)throwsException {
        // 生成一个可信任的随机数源
        SecureRandom sr =newSecureRandom();
 
        // 从原始密钥数据创建DESKeySpec对象
        DESKeySpec dks =newDESKeySpec(key);
 
        // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
        SecretKey securekey = keyFactory.generateSecret(dks);
 
        // Cipher对象实际完成解密操作
        Cipher cipher = Cipher.getInstance(DES);
 
        // 用密钥初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
 
        returncipher.doFinal(data);

    }


我一直有一事不明,请大家指点。
SecureRandom sr = newSecureRandom(),在加密和解密都有,它不是随机生成的吗?为什么依然可以正确加密和解密?

加载中
0
终曲
终曲

密钥是种子,种子一样,随机序列就一样

注意Random和SecureRandom都是随机序列,不是每个数都独立随机

liu13430
liu13430
小弟在此谢过,大哥,详尽的回答。
终曲
终曲
回复 @liu13430 : 当然有作用,key->secureKey作为种子,设到sr里,得到真正的密钥序列,所以只要key一样,加密和解密时候用的序列就一样了
liu13430
liu13430
应该是这句代码: cipher.init(Cipher.DECRYPT_MODE, securekey, sr); 设置的sr根本没有起作用的原因?
liu13430
liu13430
嗯,当设置相同的种子时,两个secureRandom随机出来的序列是一样的,但是上面的没有设置种子呀,怎样回事呢?
终曲
终曲
回复 @liu13430 : 很简单,你new两次SecureRandom(看作一次加密一次解密),都把种子用setSeed设成1(看作把key设进去),两个sr对象都用next输出10个数,出结果应该就明白了
下一页
0
mi-la-king
mi-la-king
你的key一样 所以序列就一样了
liu13430
liu13430
嗯,谢谢了.
返回顶部
顶部