Java 加密:
基本的单向加密算法:
- BASE64 : 严格上属于编码格式
- MD5 : Message Digest algorithm 5 ,信息摘要算法
- SHA : Secure Hash Algorithm ,安全散列算法
- HMAC : 散列消息鉴别码
复杂的对称加密、非对称加密算法: - DES : Data Encryption Standard ,数据加密算法
- PBE :Password-based-encryption ,基于密码验证
- DSA :Digital Signature Algorithm ,数字签名
- …
一、单向加密算法:
- MD5:广泛用于加密和解密技术,常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值。
- ==SHA ==: 数字签名等密码学应用中重要的工具。
单向加密的用途主要是为了校验数据在传输过程中是否被修改。
二、BASE64加密:
- ==BASE64 ==:BASE64(双向的)内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
常见的有:邮件、http加密
主要是BASE64Encoder、BASE64Decoder两个类。
base加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。
三、对称加密:
DES :
DES算法的三个参数有:key、Data、Mode。其中key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密和解密的数据。Mode是DES的工作方式,即解密或加密。
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。
AES:
AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据代码栗子如下:
/** * 2019-05-31 by wx AES加密解密demo * */ public class AESTest { /* * 加密 * 1.构造密钥生成器 * 2.根据ecnodeRules规则初始化密钥生成器 * 3.产生密钥 * 4.创建和初始化密码器 * 5.内容加密 * 6.返回字符串 */ public static String encrypt(String pwd ,String content){ try { //创建AES的key生产者 KeyGenerator kgen = KeyGenerator.getInstance("AES"); //利用密码作为随机数初始化出128位的key生产者 //加密没关闭,SecureRandom是生成安全随机数序列,pwd.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有pwd就行 kgen.init(128,new SecureRandom(pwd.getBytes())); // SecretKey secretKey = kgen.generateKey();//根据密码生成一个密钥 byte [] enCodeFormat = secretKey.getEncoded();//返回将基本格式的密钥,如果此密钥不支持编码,则返回null //转化为AES专用密钥 SecretKeySpec key = new SecretKeySpec(enCodeFormat,"AES"); //创建密码器 Cipher cipher = Cipher.getInstance("AES"); //初始化为加密模式的密码器 cipher.init(Cipher.ENCRYPT_MODE,key); //获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码 byte[] byteContent = content.getBytes("utf-8"); //加密 byte[] result =cipher.doFinal(byteContent); //将加密后的数据转为字符串 String s = new String (new BASE64Encoder().encode(result)); return s; }catch (NoSuchPaddingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }catch (UnsupportedEncodingException e) { e.printStackTrace(); }catch (InvalidKeyException e) { e.printStackTrace(); }catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null; } /* * 解密 * 解密过程: * 1.同加密1-4步 * 2.将加密后的字符串反纺成byte[]数组 * 3.将加密内容解密 */ public static String deencrty(String pwd,String content){ try { //1.构成密钥生成器,指定AES算法,不区分大小写 KeyGenerator kgen = KeyGenerator.getInstance("AES"); //2.根据pwd初始化密钥生成器 //生成一个128位的随机源,根据传入的字节数组 kgen.init(128,new SecureRandom(pwd.getBytes())); //3.产生原始对称密钥 SecretKey ori_key =kgen.generateKey(); //4.获得原始对称密钥的字节数组 byte[] raw =ori_key.getEncoded(); //5.根据字节数组生成AES密钥 SecretKey key =new SecretKeySpec(raw ,"AES"); //6.根据指定算法AES自成密码器 Cipher cipher = Cipher.getInstance("AES"); //7. 初始化密码器,第一个参数为加密模式,第二个为使用的key cipher.init(Cipher.DECRYPT_MODE,key); //8.将加密并编码后的内容解码成字节数组 byte[] byte_content = new BASE64Decoder().decodeBuffer(content); //解密 byte[] result = cipher.doFinal(byte_content); String re = new String (result,"utf-8"); return re; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); }catch (NoSuchPaddingException e) { e.printStackTrace(); }catch (InvalidKeyException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); }catch (IllegalBlockSizeException e) { e.printStackTrace(); } catch (BadPaddingException e) { e.printStackTrace(); } return null; } public static void main (String[] args){ Scanner scanner = new Scanner(System.in); //加密 System.out.println("使用AES 对称加密,请输入加密的规则:"); String key = scanner.next(); System.out.println("请输入要加密的内容:"); String content = scanner.next(); String re = encrypt(key,content); System.out.println("根据输入的key加密后的密文:"+ re); //解密 System.out.println("使用AES对称解密,请输入加密的密钥:与加密时的密钥一致"); key = scanner.next(); System.out.println("请输入要解密的密文:"); content = scanner.next(); String le= deencrty(key,content); System.out.println("根据输入的密钥key解密后的明文是:"+le); }
版权声明:本文为baidu_35160588原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。