Java中的对称加密详解

目录
  • 常见的对称加密方法
  • 代码案例
    • byte[] 和16进制字符串相互转换
    • DES 加密和解密
    • AES 加密和解密
    • 加密模式
    • 填充模式
    • 使用加密模式和填充模式的案例
  • 总结

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

常见的对称加密方法

DES : Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。

AES : Advanced Encryption Standard, 高级加密标准 .在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。

代码案例

byte[] 和16进制字符串相互转换

private byte[] hexStringToBytes(String hexString) {
    if (hexString.length() % 2 != 0) throw new IllegalArgumentException("hexString length not valid");
    int length = hexString.length() / 2;
    byte[] resultBytes = new byte[length];
    for (int index = 0; index < length; index++) {
        String result = hexString.substring(index * 2, index * 2 + 2);
        resultBytes[index] = Integer.valueOf(Integer.parseInt(result, 16)).byteValue();
    }
    return resultBytes;
}
private String bytesToHexString(byte[] sources) {
    if (sources == null) return null;
    StringBuilder stringBuffer = new StringBuilder();
    for (byte source : sources) {
        String result = Integer.toHexString(source& 0xff);
        if (result.length() < 2) {
            result = "0" + result;
        }
        stringBuffer.append(result);
    }
    return stringBuffer.toString();
}

DES 加密和解密

private String encryptByDES(String input,String key) throws Exception {
    // 算法
    String algorithm = "DES";
    String transformation = "DES";
    // Cipher:密码,获取加密对象
    // transformation:参数表示使用什么类型加密
    Cipher cipher = Cipher.getInstance(transformation);
    // 指定秘钥规则
    // 第一个参数表示:密钥,key的字节数组 长度必须是8位
    // 第二个参数表示:算法
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
    // 对加密进行初始化
    // 第一个参数:表示模式,有加密模式和解密模式
    // 第二个参数:表示秘钥规则
    cipher.init(Cipher.ENCRYPT_MODE,sks);
    // 进行加密
    byte[] bytes = cipher.doFinal(input.getBytes());
    return bytesToHexString(bytes);
}

private String decryptByDES(String input,String key)throws Exception{
    // 算法
    String algorithm = "DES";
    String transformation = "DES";
    // Cipher:密码,获取加密对象
    // transformation:参数表示使用什么类型加密
    Cipher cipher = Cipher.getInstance(transformation);
    // 指定秘钥规则
    // 第一个参数表示:密钥,key的字节数组 长度必须是8位
    // 第二个参数表示:算法
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
    // 对加密进行初始化
    // 第一个参数:表示模式,有加密模式和解密模式
    // 第二个参数:表示秘钥规则
    cipher.init(Cipher.DECRYPT_MODE,sks);
    // 进行解密
    byte [] inputBytes = hexStringToBytes(input);
    byte[] bytes = cipher.doFinal(inputBytes);
    return new String(bytes);
 }

AES 加密和解密

private String encryptByAES(String input,String key) throws Exception {
    // 算法
    String algorithm = "AES";
    String transformation = "AES";
    // Cipher:密码,获取加密对象
    // transformation:参数表示使用什么类型加密
    Cipher cipher = Cipher.getInstance(transformation);
    // 指定秘钥规则
    // 第一个参数表示:密钥,key的字节数组 长度必须是16位
    // 第二个参数表示:算法
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
    // 对加密进行初始化
    // 第一个参数:表示模式,有加密模式和解密模式
    // 第二个参数:表示秘钥规则
    cipher.init(Cipher.ENCRYPT_MODE,sks);
    // 进行加密
    byte[] bytes = cipher.doFinal(input.getBytes());
    return bytesToHexString(bytes);
}

private String decryptByAES(String input,String key)throws Exception{
    // 算法
    String algorithm = "AES";
    String transformation = "AES";
    // Cipher:密码,获取加密对象
    // transformation:参数表示使用什么类型加密
    Cipher cipher = Cipher.getInstance(transformation);
    // 指定秘钥规则
    // 第一个参数表示:密钥,key的字节数组 长度必须是16位
    // 第二个参数表示:算法
    SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
    // 对加密进行初始化
    // 第一个参数:表示模式,有加密模式和解密模式
    // 第二个参数:表示秘钥规则
    cipher.init(Cipher.DECRYPT_MODE,sks);
    // 进行解密
    byte [] inputBytes = hexStringToBytes(input);
    byte[] bytes = cipher.doFinal(inputBytes);
    return new String(bytes);
}

加密模式

ECB

Electronic codebook, 电子密码本. 需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密

优点:并行加密,速度快
缺点:同样的明文,加密成同样的密文,容易被破解,不利于安全保护
CBC

优点:同样的原文生成不同的密文
缺点:串行处理,速度慢

注意: 需要一个初始的向量值IV

填充模式

当需要按块处理的数据, 数据长度不符合块处理需求时, 按照一定的方法填充满块长的规则

NoPadding
不填充.
在DES加密算法下, 要求原文长度必须是8byte的整数倍
在AES加密算法下, 要求原文长度必须是16byte的整数倍PKCS5Padding
数据块的大小为8位, 不够就补足

注意
默认情况下, 加密模式和填充模式为 : ECB/PKCS5Padding
如果使用CBC模式, 在初始化Cipher对象时, 需要增加参数, 初始化向量IV : IvParameterSpec iv = new IvParameterSpec(key.getBytes());

加密模式和填充模式

AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)

使用加密模式和填充模式的案例

    private String encryptByAES(String input,String key) throws Exception {
        // 算法
        String algorithm = "AES";
        String transformation = "AES/CBC/PKCS5Padding";
        // Cipher:密码,获取加密对象
        // transformation:参数表示使用什么类型加密
        Cipher cipher = Cipher.getInstance(transformation);
        // 指定秘钥规则
        // 第一个参数表示:密钥,key的字节数组 长度必须是16位
        // 第二个参数表示:算法
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
        // 初始向量值长度必须是16位
        String ivStr = "2222222222222221";
        IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
        // 对加密进行初始化
        // 第一个参数:表示模式,有加密模式和解密模式
        // 第二个参数:表示秘钥规则
        cipher.init(Cipher.ENCRYPT_MODE,sks,iv);
        // 进行加密
        byte[] bytes = cipher.doFinal(input.getBytes());
        return bytesToHexString(bytes);
    }

    private String decryptByAES(String input,String key)throws Exception{
        // 算法
        String algorithm = "AES";
        String transformation = "AES/CBC/PKCS5Padding";
        // Cipher:密码,获取加密对象
        // transformation:参数表示使用什么类型加密
        Cipher cipher = Cipher.getInstance(transformation);
        // 指定秘钥规则
        // 第一个参数表示:密钥,key的字节数组 长度必须是16位
        // 第二个参数表示:算法
        SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);
        // 初始向量值长度必须是16位
        String ivStr = "2222222222222221";
        IvParameterSpec iv = new IvParameterSpec(ivStr.getBytes());
        // 对加密进行初始化
        // 第一个参数:表示模式,有加密模式和解密模式
        // 第二个参数:表示秘钥规则
        cipher.init(Cipher.DECRYPT_MODE,sks,iv);
        // 进行解密
        byte [] inputBytes = hexStringToBytes(input);
        byte[] bytes = cipher.doFinal(inputBytes);
        return new String(bytes);
    }

总结

到此这篇关于Java中的对称加密详解的文章就介绍到这了,更多相关Java对称加密内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • plsql实现DES对称加密 Java解密

    背景 某项目接口采用plsql开发,接口返回用户密码,但要求密码不能是明文返回,因为程序内部需要用到明文密码,所以只能在plsql中对密码进行对称加密,在程序内部进行解密,程序采用java开发. 实现 dbms_crypto是oracle自带的加密包,包含多种加密解密方法,非dba用户需要授权才能进行使用 grant execute on dbms_crypto to xxx;   下面是一个通过DES算法加密的function function encrypt_password(p_passw

  • Java 实现常见的非对称加密算法

    概述 非对称加密算法与对称加密算法的主要差别在于非对称加密算法用于加密和解密的密钥不相同,非对称加密算法密钥分为公钥和私钥,公钥加密只能用私钥解密,反之私钥加密只能用公钥解密.相比对称加密算法,非对称加密算法加/解密效率低,但安全性高,这两种算法一般结合使用.常见非对称加密算法有RSA.ECC.Elgamal等. 使用RSA实现加密解密 公钥加密,私钥解密. package com.ss.utils; import javax.crypto.Cipher; import java.securit

  • Java 实现对称加密算法

    概述 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密.在对称加密算法中,DES算法最具有代表性,DESede是DES算法的变种,AES算法则作为DES算法的替代者. DES DES(Data Encryption Standard),即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来. import java

  • 教你用Java实现RSA非对称加密算法

    一.非对称加密 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥).公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密.因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法. 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将公钥公开,需要向甲方发送信息的其他角色(乙方)使用该密钥(甲方的公钥)对机密信息进行加密后再发送给甲方:甲方再用自己私钥对加密

  • Java 实现RSA非对称加密算法

    目录 公钥与私钥 Java实现 公钥与私钥 公钥与私钥是成对的,一般的,我们认为的是公钥加密.私钥解密.私钥签名.公钥验证,有人说成私钥加密,公钥解密时不对的. 公钥与私钥的生成有多种方式,可以通过程序生成(下文具体实现),可以通过openssl工具: # 生成一个私钥,推荐使用1024位的秘钥,秘钥以pem格式保存到-out参数指定的文件中,采用PKCS1格式 openssl genrsa -out rsa.pem 1024 # 生成与私钥对应的公钥,生成的是Subject Public Ke

  • Java中的对称加密详解

    目录 常见的对称加密方法 代码案例 byte[] 和16进制字符串相互转换 DES 加密和解密 AES 加密和解密 加密模式 填充模式 使用加密模式和填充模式的案例 总结 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密. 常见的对称加密方法 DES : Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政

  • Java中可变长度参数代码详解

    到J2SE1.4为止,一直无法在Java程序里定义实参个数可变的方法--因为Java要求实参(Arguments)和形参(Parameters)的数量和类型都必须逐一匹配,而形参的数目是在定义方法时就已经固定下来了.尽管可以通过重载机制,为同一个方法提供带有不同数量的形参的版本,但是这仍然不能达到让实参数量任意变化的目的. 然而,有些方法的语义要求它们必须能接受个数可变的实参--例如著名的main方法,就需要能接受所有的命令行参数为实参,而命令行参数的数目,事先根本无法确定下来. 对于这个问题,

  • Java中自动生成构造方法详解

    Java中自动生成构造方法详解 每个类在没有声明构造方法的前提下,会自动生成一个不带参数的构造方法,如果类一但声明有构造方法,就不会产生了.证明如下: 例1: class person { person(){System.out.println("父类-person");} person(int z){} } class student extends person { // student(int x ,int y){super(8);} } class Rt { public st

  • 基于Java中的StringTokenizer类详解(推荐)

    StringTokenizer是字符串分隔解析类型,属于:Java.util包. 1.StringTokenizer的构造函数 StringTokenizer(String str):构造一个用来解析str的StringTokenizer对象.java默认的分隔符是"空格"."制表符('\t')"."换行符('\n')"."回车符('\r')". StringTokenizer(String str,String delim)

  • JAVA中string数据类型转换详解

    在JAVA中string是final类,提供字符串不可以修改,string类型在项目中经常使用,下面给大家介绍比较常用的string数据类型转换: String数据类型转换成long.int.double.float.boolean.char等七种数据类型 复制代码 代码如下: * 数据类型转换 * @author Administrator * */ public class 数据类型转换 { public static void main(String[] args) { String c=

  • java 中 阻塞队列BlockingQueue详解及实例

    java 中 阻塞队列BlockingQueue详解及实例 BlockingQueue很好的解决了多线程中数据的传输,首先BlockingQueue是一个接口,它大致有四个实现类,这是一个很特殊的队列,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作.

  • Java中BigDecimal的基本运算(详解)

    BigDecimal一共有4个够造方法,让来看看其中比较常用的两种用法: 第一种:BigDecimal(double val) Translates a double into a BigDecimal. 第二种:BigDecimal(String val) Translates the String repre sentation of a BigDecimal into a BigDecimal. 使用BigDecimal要用String来够造,要做一个加法运算,需要先将两个浮点数转为Str

  • java 中 ChannelHandler的用法详解

    java 中 ChannelHandler的用法详解 前言: ChannelHandler处理一个I/O event或者拦截一个I/O操作,在它的ChannelPipeline中将其递交给相邻的下一个handler. 通过继承ChannelHandlerAdapter来代替 因为这个接口有许多的方法需要实现,你或许希望通过继承ChannelHandlerAdapter来代替. context对象 一个ChannelHandler和一个ChannelHandlerContext对象一起被提供.一个

  • Java中的反射机制详解

    Java中的反射机制详解 反射,当时经常听他们说,自己也看过一些资料,也可能在设计模式中使用过,但是感觉对它没有一个较深入的了解,这次重新学习了一下,感觉还行吧! 一,先看一下反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 反射是Java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接.但是反射使用不当会成本很高! 看概念很晕的,继续往下

  • java 中匿名内部类的实例详解

    java 中匿名内部类的实例详解 原来的面貌: class TT extends Test{ void show() { System.out.println(s+"~~~哈哈"); System.out.println("超级女声"); } TT tt=new TT(); tt.show(); 只是说我们这里采用的是匿名的形式来处理. 重写了Test的show()方法,在重写好了以后,又调用了重写后的show()方法 实现代码: package cn.com; c

随机推荐