对称加密

package 对称加密;

import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

public class AES {

    private static String src="imooc";
    public static void main(String[] args) {
        jdkAES();
    }
    public static void jdkAES(){
        //生成密钥
        try {

            KeyGenerator keyGenerator =KeyGenerator.getInstance("AES");
            keyGenerator.init(new SecureRandom());
            SecretKey secretKey=keyGenerator.generateKey();
            System.out.println("编码格式"+secretKey.getFormat());
            byte[] keyBytes=secretKey.getEncoded();


            //key转换
            Key key=new SecretKeySpec(keyBytes,"AES");



            //加密
            /**
             * 初始化cipher
             * 调用cipher的doFinal()方法生成字符数组形式的密文
             */
            Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] result=cipher.doFinal(src.getBytes());
            //result 变十六进制
            System.out.println(byteHexStr(result));

            //解密
            //密钥++密文
            cipher.init(Cipher.DECRYPT_MODE, key);
            result=cipher.doFinal(result);
            //result变成字符串
            System.out.println("jdkAES:  "+new String(result));




        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }






    }

     public static String byteHexStr(byte[] b) {
            String stmp = "";
            StringBuilder sb = new StringBuilder("");
            for (int n = 0; n < b.length; n++) {
              stmp = Integer.toHexString(b[n] & 0xFF);
              sb.append((stmp.length() == 1) ? "0" + stmp : stmp);
            }
            return sb.toString().toUpperCase().trim();
          }



}

package 对称加密;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Provider;
import java.security.Security;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

/**
 * 
 * 明文 密钥+算法 密文 密钥是如何来的???
 * 
 * 
 * @author idea
 * 
 */

public class DES {
    private static String src = "imooc";

    // 明文
    public static void main(String[] args) {
        try {
            jdkDES();
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void bcDES() throws InvalidKeyException,
            NoSuchAlgorithmException, InvalidKeySpecException,
            NoSuchPaddingException, IllegalBlockSizeException,
            BadPaddingException, NoSuchProviderException {

        //添加实现方
        //Security.addProvider(new Provider());


        // 生成密钥
        // 初始化(对称)密钥生成器
        KeyGenerator keyGenerator = KeyGenerator.getInstance("DES","BC");//这一点与jdk不同
        keyGenerator.init(56);
        // ===生成密钥并编码,使用字节数组接受
        SecretKey secretKey = keyGenerator.generateKey();
        byte[] byteKey = secretKey.getEncoded();

        // 密钥转换
        DESKeySpec desKeySpec = new DESKeySpec(byteKey);
        SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
        Key convertSecretKey = factory.generateSecret(desKeySpec);

        // 加密
        // result是密文
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
        byte[] result = cipher.doFinal(src.getBytes());
        System.out.println(byteHexStr(result));

        // 解密
        // 把cipher初始化解密码 
        // converSecretKey是密钥
        // 形参result是密文,返回结果是byte[]

        cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
        result = cipher.doFinal(result);
        System.out.println(new String(result));

    }

    public static void jdkDES() throws InvalidKeyException,
    NoSuchAlgorithmException, InvalidKeySpecException,
    NoSuchPaddingException, IllegalBlockSizeException,
    BadPaddingException {

// 生成密钥
// 初始化(对称)密钥生成器
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(56);
// ===生成密钥并编码,使用字节数组接受
SecretKey secretKey = keyGenerator.generateKey();
byte[] byteKey = secretKey.getEncoded();

// 密钥转换
DESKeySpec desKeySpec = new DESKeySpec(byteKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");
Key convertSecretKey = factory.generateSecret(desKeySpec);

// 加密
// result是密文
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println(byteHexStr(result));

// 解密
// 把cipher初始化解密码 
// converSecretKey是密钥
// 形参result是密文,返回结果是byte[]

cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
result = cipher.doFinal(result);
System.out.println(new String(result));

}




    /**
     * 
     * 字节数组按照16进制转为字符串
     * @param b
     * @return
     */
     public static String byteHexStr(byte[] b) {
            String stmp = "";
            StringBuilder sb = new StringBuilder("");
            for (int n = 0; n < b.length; n++) {
              stmp = Integer.toHexString(b[n] & 0xFF);
              sb.append((stmp.length() == 1) ? "0" + stmp : stmp);
            }
            return sb.toString().toUpperCase().trim();
          }



}

package 对称加密;

import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

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

public class PBE {
    private static String src = "imooc";

    public static void main(String[] args) {
        jdkPBE();
    }

    private static void jdkPBE() {
        // 初始化盐
        SecureRandom random = new SecureRandom();
        byte[] salt = random.generateSeed(8);
        // 口令和密钥
        String password = "imooc";
        PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
        SecretKeyFactory factory;
        try {
            factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
            // 工厂生产密钥需要告诉规范,就是pbeKeySpec
            Key key = factory.generateSecret(pbeKeySpec);
            // 加密
            PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, 100);// 100???
            Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
            cipher.init(Cipher.ENCRYPT_MODE, key, pbeParameterSpec);
            byte[] result = cipher.doFinal(src.getBytes());
            System.out.println(byteHexStr(result));
            // 解密
            cipher.init(Cipher.DECRYPT_MODE, key, pbeParameterSpec);
            result = cipher.doFinal(result);
            System.out.println(new String(result));

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static String byteHexStr(byte[] b) {
        String stmp = "";
        StringBuilder sb = new StringBuilder("");
        for (int n = 0; n < b.length; n++) {
            stmp = Integer.toHexString(b[n] & 0xFF);
            sb.append((stmp.length() == 1) ? "0" + stmp : stmp);
        }
        return sb.toString().toUpperCase().trim();
    }

}

package 对称加密;

import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.DESedeKeySpec;

public class ThreeDES {
    private static String src = "imooc";
    public static void main(String[] args) {
        try {
            jdk3DES();
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void jdk3DES() throws InvalidKeyException,
    NoSuchAlgorithmException, InvalidKeySpecException,
    NoSuchPaddingException, IllegalBlockSizeException,
    BadPaddingException {

// 生成密钥
// 初始化(对称)密钥生成器
KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
keyGenerator.init(168);
// ===生成密钥并编码,使用字节数组接受

SecretKey secretKey = keyGenerator.generateKey();
byte[] byteKey = secretKey.getEncoded();

// 密钥转换
DESedeKeySpec desKeySpec = new DESedeKeySpec(byteKey);
SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");
Key convertSecretKey = factory.generateSecret(desKeySpec);

// 加密
// result是密文
Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);
byte[] result = cipher.doFinal(src.getBytes());
System.out.println(byteHexStr(result));

// 解密
// 把cipher初始化解密码 
// converSecretKey是密钥
// 形参result是密文,返回结果是byte[]

cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);
result = cipher.doFinal(result);
System.out.println(new String(result));

}




    /**
     * 
     * 字节数组按照16进制转为字符串
     * @param b
     * @return
     */
     public static String byteHexStr(byte[] b) {
            String stmp = "";
            StringBuilder sb = new StringBuilder("");
            for (int n = 0; n < b.length; n++) {
              stmp = Integer.toHexString(b[n] & 0xFF);
              sb.append((stmp.length() == 1) ? "0" + stmp : stmp);
            }
            return sb.toString().toUpperCase().trim();
          }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值