DES加密算法细解

enc = Cipher.getInstance("DES/CBC/PKCS5Padding"); keySpec = new SecretKeySpec(key, "DES");//key ivSpec = new IvParameterSpec(iv);//iv enc.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); enc.doFinal(indata);//encrypthtml

DES能够有这几种模式:  Electronic Codebook (ECB) , Cipher Block Chaining (CBC) , Cipher Feedback (CFB) ,  Output Feedback (OFB)   最基本的是ECB模式,CBC和其余模式都是改进。  ECB模式的缺点是相同的明文加密成相同的密文,明文的规律带到密文。\\ 由于DES是一种block cipher,一个block要8个字节,因此要加密的东西要分红8字节的整数倍,不足的就填充。  PKCS5Padding这种填充,填的字节表明所填字节的总数:   好比差三个字节的话填为 @@@@@333  差7个字节就填为        @7777777  没有差就填             88888888   这样只要读出最后一个字节的内容就知道哪些字节是填充的。   其余填充方式还有:  ISO10126-2Padding  ISO7816-4Padding  X9.23Padding  TBCPadding  ZeroBytePadding算法


http://www.iteye.com/topic/152405dom

http://www.cnblogs.com/janken/archive/2012/04/05/2432930.html  加密

   DES的几种工做方式spa


第一种电子密本方式(ECB)    将明文分红n个64比特分组,若是明文长度不是64比特的倍数,则在明文末尾填充适当数目的规定符号。对明文组用给定的密钥分别进行加密,行密文C=(C0,C1,……,Cn-1)其中Ci=DES(K,xi),i=0,1,…..,n-1。     第二种密文分组连接方式(CBC)    在CBC方式下,每一个明文组xi在加密前与先一组密文按位模二加后,再送到DES加密,CBC方式克服了ECB方式报内组重的缺点,但因为明文组加密前与一组密文有关,所以前一组密文的错误会传播到下一组。     第三种密文反馈方式(CFB),可用于序列密码    明文X=(x0,x1,……,xn-1),其中xi由t个比特组成0   第四种输出反馈方式(OFB),可用于序列密码    与CFB惟一不一样的是OFB是直接取DES输出的t个比特,而不是取密文的t个比特,其他都与CFB相同。但它取的是DES的输出,因此它克服了CFB的密文错误传播的缺点      DES的几种填补方式    DES是对64位数据的加密算法,如数据位数不足64位的倍数,须要填充,补充到64位的倍数。code

   NoPadding    API或算法自己不对数据进行处理,加密数据由加密双方约定填补算法。例如若对字符串数据进行加解密,能够补充\0或者空格,而后trimhtm

   PKCS5Padding    加密前:数据字节长度对8取余,余数为m,若m>0,则补足8-m个字节,字节数值为8-m,即差几个字节就补几个字节,字节数值即为补充的字节数,若为0则补充8个字节的8对象

-------------------------------------------------------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
######    须要使用到 IV的时候    ##########                           (*** 注意 :主要在配合其余语言如:C#,.NET。跨接口调用须要注意保持参数的一 致,密钥、偏移量、块密码模式、填充模式

public class DES {
    private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 };

    public static String encryptDES(String encryptString, String encryptKey)                                      
            throws Exception {
        IvParameterSpec zeroIv = new IvParameterSpec(iv);
        SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");      CBC/PKCS5Padding---->>>    密码模式和填充模式 
        cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
        byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
        return Base64.encode(encryptedData);
    }
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------》》》》》》》》》》》》》》》
######    不须要使用到 IV的时候    ##########
    /**
     * DES加密
     */
    public static byte[] desEncrypt(byte[] datasource, String password) {
        try {
            SecureRandom random = new SecureRandom();
            DESKeySpec desKey = new DESKeySpec(password.getBytes());
            // 建立一个密匙工厂,而后用它把DESKeySpec转换成
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey securekey = keyFactory.generateSecret(desKey);
            // Cipher对象实际完成加密操做
            Cipher cipher = Cipher.getInstance("DES");
            // 用密匙初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
            // 如今,获取数据并加密
            // 正式执行加密操做
            return cipher.doFinal(datasource);
        } catch (Throwable e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
######    须要使用到 IV的时候    ##########
/**
     * DES解密
     */
    public static byte[] desDecrypt(byte[] src, String password) throws Exception {
        // DES算法要求有一个可信任的随机数源
        SecureRandom random = new SecureRandom();
        // 建立一个DESKeySpec对象
        DESKeySpec desKey = new DESKeySpec(password.getBytes());
        // 建立一个密匙工厂
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        // 将DESKeySpec对象转换成SecretKey对象
        SecretKey securekey = keyFactory.generateSecret(desKey);
        // Cipher对象实际完成解密操做
        Cipher cipher = Cipher.getInstance("DES");
        // 用密匙初始化Cipher对象
        cipher.init(Cipher.DECRYPT_MODE, securekey, random);
        // 真正开始解密操做
        return cipher.doFinal(src);
    }
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》


参考:http://www.cnblogs.com/hubcarl/articles/3109538.html