zoukankan      html  css  js  c++  java
  • android基于口令加密快速搞懂(一)


    import java.util.Random;

    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.PBEKeySpec;
    import javax.crypto.spec.PBEParameterSpec;

    public class Token {

    /*
    * 基于口令加密创建步骤
    * 1、读取口令
    * 将需加密字符串转化为字符数组
    * 将口令保存至PBEKeySpec对象中
    * 2、由口令生成秘钥
    * 通过SecretKeyfactory工厂类的getInstance静态方法获取SecretKeyFactory对象;
    * getInstance方法需要一个参数--指定口令加密算法{
    * 1、PBEWithMD5AndDES
    * 2、PBEWithHmacSHA1AndDESede}
    * 通过SecretKeyFactory工厂类的generateSecret()方法生成秘钥
    * 3、生成随机数(盐)
    * 盐必须是8个元素的字节数组
    * 通过Random类的nextbyte方法生成随机数并将随机数赋值给byte数组,参数为byte数组
    * 4、创建并初始化密码器
    * 通过getInstance方法获取密码器对象,参数为基于口令的加密算法
    * 通过PBEParameterSpec类构造器向Cipher对象指定基于口令加密的算法(包括提高破解难度的盐)
    * 5、获取明文,进行加密
    * 执行密码器的doFinal()方法进行加密,加密结果保存在字节数组ctext中
    * */
    //口令加密操作方法
    public byte[] cmdEncryptionOperation(String encryptionStr,String pwdStr) throws Exception
    {
    //读取口令
    //将口令转化为字符数组
    char[] pwd = pwdStr.toCharArray();
    //将加密数组存储至PBEKeySpec对象
    PBEKeySpec pbeKeySpec = new PBEKeySpec(pwd);

    //由口令生成秘钥
    //通过SecretKeyFactory的getinstance方法创建SecretKeyFactory对象,构造参数为加密类型
    SecretKeyFactory secretKeyFactory = SecretKeyFactory
    .getInstance("PBEWithMD5AndDES");//抛出没找到关键字异常
    //通过generateSecret生成口令
    SecretKey key = secretKeyFactory.generateSecret(pbeKeySpec);

    //生成随机数(盐)
    // 创建是8个元素的字节数组的盐
    byte[] salt = new byte[8];
    //通过Random类的nextbyte方法生成随机数并将随机数赋值给byte数组,参数为byte数组
    Random random = new Random();
    random.nextBytes(salt);

    //创建并初始化密码器
    Cipher cipher = Cipher.getInstance("PBEWithMD5AndDES");
    PBEParameterSpec parameterSpec = new PBEParameterSpec(salt, 1000);
    cipher.init(Cipher.ENCRYPT_MODE, key,parameterSpec);

    //获取明文,进行加密
    byte[] ptext = encryptionStr.getBytes("UTF-8");
    byte[] ctext = cipher.doFinal(ptext);//cipher的dofinal方法进行加密
    return ctext;
    }

    }

    使用加密方法:

    public static void main(String[] args) throws Exception {
    Token token = new Token();
    byte[] ctext = token.cmdEncryptionOperation("加QQ群 499092562交流!!","2016/4/5");
    FileOutputStream os = new FileOutputStream("PBEEnc.dat");
    os.write(ctext);
    for (int i = 0; i < ctext.length; i++) {
    System.out.print(ctext[i]);
    }

    }

  • 相关阅读:
    树的子结构(剑指offer_26)
    合并两个排序的链表(剑指offer_25)
    反转链表(剑指offer_24)多看多思多想
    链表中环的入口结点(剑指offer_23)
    链表中倒数第k个节点
    调整数组顺序使奇数位于偶数前面(剑指offer_21)
    表示数值的字符串(剑指offer_20)
    1676. 跳石头
    1670. 回合制游戏
    1667. 区间统计(回顾)
  • 原文地址:https://www.cnblogs.com/sunzan/p/5359052.html
Copyright © 2011-2022 走看看