Java对称加密

BASE64加解密

BASE64是一种比较基本、简单的加密算法,其实BASE64主要作用不是用于加密,BASE64是把与原始的数据转换成另一种编码格式,这样方便在网络上传输。所以严格来说,BASE64并不是安全的加密解密算法,但通过BASE64编码过后原来的数据也会改变成非原来的数据的字符。

    /*该方法创建BASE64Encoder对象后调用encodeBuffer()方法对数据进行加密

其中 msg 参数表示加密的数据,为byte数组*/

public static String encryptionTest(byte[] msg) {

        return new BASE64Encoder().encodeBuffer(msg);

    }

    //使用BASE64Decoder对象的decodeBuffer()进行解密

    public static byte[] decodeTest(String str) throws IOException {

        return new BASE64Decoder().decodeBuffer(str);

    }

    //mian方法中分别调用加密和解密方法对需要加密、解密的数据进行加密、解密

    public static void main(String[] args) throws IOException {

        String msg = "这是需要加密的字符串";

        System.out.println("没有加密之前:"+msg);

        String msgOfby = encryptionTest(msg.getBytes());

        System.out.println("加密之后的字符串:"+msgOfby);

        System.out.println(("解密:")+new String( decodeTest(msgOfby)));

    }

效果

使用BASE64加密后的字符串每隔76个字符串就会插入一个回车键(也就是换行,从上图中输出可以看出加密之后的字符串和加密之间空了一行)

 

注:可能是我使用的是my eclipse,在项目上无法直接使用BASE64Decoder和BASE64Encoder类(sun.misc包下),因为两个类都是在sun.misc包下,属于sun公司内容方法,不属于JDK标准库的范畴,但JDK中包含了该类。

解决方法:右击你的项目,选择Build Path,然后点击Configure Buid Path,出现下面界面,点击JRE System Library后选中Access rules,然后点击Edit

点击Add

Resolution项选为Accessible、RulePattern 填写**,然后点击ok,如下

DES加解密

DES(Data Encryption Standard)是一种对称加密算法,所谓对称加密就是加密和解密都是使用同一个密钥,使用的是56位密钥,可破解。 例 下面方法对参数str进行加密并返回

public static String Encrypt(String str) throws Exception {

BASE64Encoder encoder=new BASE64Encoder();//实例化

 byte[] bytes = str.getBytes("UTF-8");//将加密的字符串按UTF-8编码转为byte[]

Cipher cipher = Cipher.getInstance("DES");// 得到Cipher实例对象

 cipher.init(Cipher.ENCRYPT_MODE, key); // 初始化

byte[] doFinalOfBy = cipher.doFinal(bytes); // byte进行加密

return encoder.encode(doFinalOfBy); //byte数组进行编码作String返回

    }

下面该方法对参数str进行解密并返回解密后的字符串

public static String Decrypt(String str) throws Exception {

            BASE64Decoder decoder = new BASE64Decoder();//实例化

            byte[] by = decoder.decodeBuffer(str);

            Cipher cipher = Cipher.getInstance("DES");//实例化cipher对象

            cipher.init(Cipher.DECRYPT_MODE, key); // 初始化

            byte[] doFinal = cipher.doFinal(by); // 解密

            // 将解密后的byte数组按UTF-8编码并返回字符串

            return new String(doFinal, "UTF-8");

    }

main方法

public static void main(String[] args) {

        try{

            //获取DES算法对象

            KeyGenerator generator=KeyGenerator.getInstance("DES");

            //SHA1安全策略

            SecureRandom secureRandom=SecureRandom.getInstance("SHA1PRNG");

            secureRandom.setSeed("tianYe".getBytes());//设置密钥

            generator.init(secureRandom); //初始化基于SHA1的算法对象

            key=generator.generateKey();//生成密钥对象

            generator=null;

        }catch(Exception e){

            throw new RuntimeException(e);

        }

        //加密的字符串

        String Username= Encrypt("田野上的风筝");

        System.out.println("加密后的UserName"+Username);

        //解密

        System.out.println("解密后的UserName"+Decrypt(Username));

    }

运行输出结果

在DES的加解密中操作明文或密文都是调用Cipher中的doFinal()方法,两者调用这个方法的区别在于初始化Cipher时使用的init()方法中的常量,使用Cipher.DECRYPT_MODE表示解密,Cipher.ENCRYPT_MODE常量则表示加密。

 

 

 

 

 

PBE对称加密算法(Password Base Encryption):该算法需要一个密码来生成Key,除此之外还需要一个随机数,不管是加密还是解密,必须同时使用Key和这个随机数才能完成加密或解密,这随机数叫作盐,使用盐和Key加密数据后想要破译就更加难了,加密方需要将盐值传输给解密方解密。

 关键代码

初始化盐方法(Salt必须是8个字节长)

public static byte[] initSalt() {

        byte[] by= new byte[8];

        Random random = new Random();//实例化Random对象

        random.nextBytes(by);

        return by;

    }

加密方法,

public static byte[] encryptPBE(byte[] data, String key, byte[] salt) throws Exception {

        byte[] bytes = null;

            //获取密钥

            Key k = stringToKey(key);

           //实例化PBE参数材料

            PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, 100);

            //加密操作

            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");

            cipher.init(Cipher.ENCRYPT_MODE, k, parameterSpec);

            //执行操作

            bytes = cipher.doFinal(data);

        return bytes;

    }

解密方法

public static byte[] decryptOfPBE (byte[] data, String key, byte[] salt) throws Exception {

        byte[] bytes = null;

            // 获取密钥

            Key key stringToKey(key);

            PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, 100);

            //解密操作

            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");

            cipher.init(Cipher.DECRYPT_MODE, key, parameterSpec);

            bytes = cipher.doFinal(data);

        return bytes;

}

public static Key stringToKey(String key) {//转换密钥

 SecretKey secretKey = null;

 PBEKeySpec keySpec = new PBEKeySpec(key.toCharArray());

 SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");

 secretKey = factory.generateSecret(keySpec); //生成密钥

        return secretKey;

    }

编写测试方法

  public static void main(String[] args) {

        // 加密字符串

        String msg = "Hi,distant place";

        String key = "tianYe"; // key 口令

        byte[] by = initSalt();// 初始化盐

        // 加密

        byte[] encData = encryptOfPBE(msg.getBytes(), key, by);

        // 调用方法解密

        byte[] decData = decryptOfPBE(encData, key, by);

        String encStr = null;

        String decStr = null;

        try {

            encStr = encryptBase64(encData);

            decStr = new String(decData, "UTF-8");

        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();

        } catch (Exception e) {

            e.printStackTrace();

        }

        System.out.println("加密前的msg" + msg);

        System.out.println("加密后的msg" + encStr);

        System.out.println("解密后的msg" + decStr);

    }

运行效果

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值