对称加密、PBE基于密码加密、PKCS

对称加密:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。常用的对称加密有:DES(Data Encryption Standard)、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等
所谓对称,就是采用 这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。

PBE——Password-based encryption(基于密码加密)其特点在于口令由用户自己掌管,不借助任何物理媒体;采用 随机数(这里我们叫做盐)杂凑 多重加密等方法保证数据的安全性。是一种简便的 对称加密方式。
PBE算法没有密钥 (秘密[对称]密钥)的概念, 把密码+盐+消息摘要迭代数当做密钥了。 因为密钥长短影响算法安全性,还不方便记忆,这里我们直接换成我们自己常用的密码就大大不同了,便于我们的记忆。但是单纯的密码很容易被字典法给穷举出来,所以我们这里给密码加了点“盐”,这个盐和密码组合,想破解就难了。同时我们将盐和口令合并后用消息摘要算法进行迭代很多次来构建密钥初始化向量的基本材料,使破译更加难了。
PBE算法没构建新的加密算法,就是用了我们常用的对称加密算法,例如AES,DES等算法。 它是将密钥的概念转成 “口令+盐” 的方式,将不便于记忆的密钥转成便于记忆的口令。

这个是不是和我们到银行开的U盾有些像呢?
就拿民生银行的U盾来说,我们插上U盾,还需要我们去输入口令。然后才能到网上银行去登陆操作,付款的时候还是需要我们去输入口令。
1、U盾的盐从何来?:应该是那个闪盘的序列编号经过一定的处理得出的一个值,因为我们想要U盾生效,在民生的大厅中需要找一个机器激活的。那个激活的动作应该是将我们U盾这个闪盘中的数据写入到我们个人的账户中,相当于做了一次盐的公布
2、口令何来?:就是我们设定的登陆密码呀。这个在窗口办理的时候需要我们设定U盾的密码。并且我们在激活的时候可以改我们的密码

有了上边两个,我们再进行操作,就可以进行我们的身份发送数据的安全性了。网银的数据交换真的安全了...

java6和bouncycastle支持的算法列表
算法 密钥长度 密钥长度默认值 工作模式 填充方式 备注
PBEWithMD5AndDES 56 56 CBC PKCS5Padding java6实现
PBEWithMD5AndTripeDES 112、168 168 CBC PKCS6Padding java7实现
PBEWithSHA1AndDESede 112、168 168 CBC PKCS7Padding java8实现
PBEWithSHA1AndRC2_40 40至1024 128 CBC PKCS8Padding java9实现

PBEWithMD5AndDES 64 64 CBC PKCS5Padding/PKCS7Padding/ISO10126Padding/ZeroBytePadding BouncyCastle实现
PBEWithMD5AndRC2 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10127Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHA1AndDES 64 64 CBC PKCS5Padding/PKCS7Padding/ISO10128Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHA1AndRC2 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10129Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHAAndIDEA-CBC 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10130Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHAAnd2-KeyTripleDES-CBC 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10131Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHAAnd3-KeyTripleDES-CBC 192 192 CBC PKCS5Padding/PKCS7Padding/ISO10132Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHAAnd128BitRC2-CBC 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10133Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHAAnd40BitRC2-CBC 40 40 CBC PKCS5Padding/PKCS7Padding/ISO10134Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHAAnd128BitRC4 128 128 CBC PKCS5Padding/PKCS7Padding/ISO10135Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHAAnd40BitRC4 40 40 CBC PKCS5Padding/PKCS7Padding/ISO10136Padding/ZeroBytePadding BouncyCastle实现
PBEWithSHAAndTwofish-CBC 256 256 CBC PKCS5Padding/PKCS7Padding/ISO10137Padding/ZeroBytePadding BouncyCastle实现

PKCS:The Public-Key Cryptography Standards (PKCS)是由美国RSA数据安全公司及其合作伙伴制定的一组 公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签 名、数字信封的格式等方面的一系列相关协议。

PBE加密例子:
package com.ca.test;  
    import java.security.Key;  
    import java.security.SecureRandom;  
    import javax.crypto.Cipher;  
    import javax.crypto.SecretKey;  
    import javax.crypto.SecretKeyFactory;  
    import javax.crypto.spec.PBEKeySpec;  
    import javax.crypto.spec.PBEParameterSpec;  
    import org.apache.commons.codec.binary.Base64;  
    /** 
     * 对称加密算法:基于口令加密-PBE算法实现 
     * 使用java6提供的PBEWITHMD5andDES算法进行展示 
     * @author kongqz 
     * */  
    public class PBECoder {  
          
        /** 
         * JAVA6支持以下任意一种算法 
         * PBEWITHMD5ANDDES 
         * PBEWITHMD5ANDTRIPLEDES 
         * PBEWITHSHAANDDESEDE 
         * PBEWITHSHA1ANDRC2_40 
         * PBKDF2WITHHMACSHA1 
         * */  
        public static final String ALGORITHM="PBEWITHMD5andDES";  
          
        /** 
         * 迭代次数 
         * */  
        public static final int ITERATION_COUNT=100;  
          
        /** 
         * 盐初始化 
         * 盐长度必须为8字节 
         * @return byte[] 盐 
         * */  
        public static byte[] initSalt() throws Exception{  
            //实例化安全随机数  
            SecureRandom random=new SecureRandom();  
            //产出盐  
            return random.generateSeed(8);  
        }  
          
        /** 
         * 转换密钥 
         * @param password 密码 
         * @return Key 密钥 
         * */  
        private static Key toKey(String password) throws Exception{  
            //密钥彩礼转换  
            PBEKeySpec keySpec=new PBEKeySpec(password.toCharArray());  
            //实例化  
            SecretKeyFactory keyFactory=SecretKeyFactory.getInstance(ALGORITHM);  
            //生成密钥  
            SecretKey secretKey=keyFactory.generateSecret(keySpec);  
              
            return secretKey;  
        }  
        /** 
         * 加密 
         * @param data 待加密数据 
         * @param password 密码 
         * @param salt 盐 
         * @return byte[] 加密数据 
         *  
         * */  
        public static byte[] encrypt(byte[] data,String password,byte[] salt) throws Exception{  
            //转换密钥  
            Key key=toKey(password);  
            //实例化PBE参数材料  
            PBEParameterSpec paramSpec=new PBEParameterSpec(salt,ITERATION_COUNT);  
            //实例化  
            Cipher cipher=Cipher.getInstance(ALGORITHM);  
            //初始化  
            cipher.init(Cipher.ENCRYPT_MODE, key,paramSpec);  
            //执行操作  
            return cipher.doFinal(data);  
        }  
        /** 
         * 解密 
         * @param data 待解密数据 
         * @param password 密码 
         * @param salt 盐 
         * @return byte[] 解密数据 
         *  
         * */  
        public static byte[] decrypt(byte[] data,String password,byte[] salt) throws Exception{  
            //转换密钥  
            Key key=toKey(password);  
            //实例化PBE参数材料  
            PBEParameterSpec paramSpec=new PBEParameterSpec(salt,ITERATION_COUNT);  
            //实例化  
            Cipher cipher=Cipher.getInstance(ALGORITHM);  
            //初始化  
            cipher.init(Cipher.DECRYPT_MODE, key,paramSpec);  
            //执行操作  
            return cipher.doFinal(data);  
        }  
        /** 
         * 使用PBE算法对数据进行加解密 
         * @throws Exception  
         *  
         */  
        public static void main(String[] args) throws Exception {  
            //待加密数据  
            String str="PBE";  
            //设定的口令密码  
            String password="azsxdc";  
              
            System.out.println("原文:/t"+str);  
            System.out.println("密码:/t"+password);  
              
            //初始化盐  
            byte[] salt=PBECoder.initSalt();  
            System.out.println("盐:/t"+Base64.encodeBase64String(salt));  
            //加密数据  
            byte[] data=PBECoder.encrypt(str.getBytes(), password, salt);  
            System.out.println("加密后:/t"+Base64.encodeBase64String(data));  
            //解密数据  
            data=PBECoder.decrypt(data, password, salt);  
            System.out.println("解密后:"+new String(data));  
        }  
    }  
    控制台结果输出:  
    原文: PBE  
    密码: azsxdc  
    盐:  VeEQqRzOw2Y=  
    加密后:    7bQTon5WD04=  
    解密后:PBE  

你可能感兴趣的:(对称加密)