添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

提示:以下是本篇文章正文内容,下面案例可供参考

一、简单实现加解密

1.1加密

* @param content 待加密内容 * @param encryptKey 加密 KEY * @return public static String encrypt ( String content, String encryptKey ) throws Exception { if ( content == null || encryptKey == null ) { throw new IllegalArgumentException ( "加密内容 content 和 encryptKey 不能为 null" ) ; if ( encryptKey.length ( ) != KEY_LENGTH ) { throw new IllegalArgumentException ( "加密的encryptKey必须为16位" ) ; // 创建cipher实例 参数按 "算法/模式/填充模式" "AES/ECB/PKCS5Padding" Cipher cipher = Cipher.getInstance ( PADDING ) ; // 初始化ciper, // ( 1 ) opmode :Cipher.ENCRYPT_MODE ( 加密模式 ) 和 Cipher.DECRYPT_MODE ( 解密模式 ) // ( 2 ) key :密匙,使用传入的盐构造出一个密匙,可以使用SecretKeySpec、KeyGenerator和KeyPairGenerator创建密匙,其中 // * SecretKeySpec和KeyGenerator支持AES,DES,DESede三种加密算法创建密匙 // * KeyPairGenerator支持RSA加密算法创建密匙 // ( 3 ) params :使用CBC模式时必须传入该参数,该项目使用IvParameterSpec创建iv 对象 cipher.init ( Cipher.ENCRYPT_MODE, new SecretKeySpec ( encryptKey.getBytes ( DEFAULT_ENCODING ) , KEY_ALGORITHM )) ; /* org.apache.commons.codec.binary.Base64 ; Base64.encodeBase64String ( ) 解决Base64加密换行问题 */ // 加密或解密,返回byte数组 byte [ ] bytes = cipher.doFinal ( content.getBytes ( DEFAULT_ENCODING )) ; return Base64.encodeBase64String ( bytes ) ;

1.2、解密

* @param content 待解密内容 * @param decryptKey 解密的 KEY * @return public static String decrypt ( String content, String decryptKey ) throws Exception { if ( content == null || decryptKey == null ) { throw new IllegalArgumentException ( "解密内容或解密key不能为null" ) ; if ( decryptKey.length ( ) != KEY_LENGTH ) { throw new IllegalArgumentException ( "解密的decryptKey必须为16位" ) ; Cipher cipher = Cipher.getInstance ( PADDING ) ; cipher.init ( Cipher.DECRYPT_MODE, new SecretKeySpec ( decryptKey.getBytes ( DEFAULT_ENCODING ) , KEY_ALGORITHM )) ; /*Base64.decodeBase64 ( content ) ; */ byte [ ] bytes = Base64.decodeBase64 ( content ) ; bytes = cipher.doFinal ( bytes ) ; return new String ( bytes, DEFAULT_ENCODING ) ;

1.3 代码解释

上面简单实现了AES(“AES/CBC/PKCS5Padding”)的加密和解密。可以看到代码中主要的是cipher对象,并有以下调用

(1)新建Cipher对象时需要传入一个参数"AES/CBC/PKCS5Padding"

(2)cipher对象使用之前还需要初始化,共三个参数(“加密模式或者解密模式”,“密匙”,“向量”)

(3)调用数据转换:cipher.doFinal(content),其中content是一个byte数组

实际上Cipher类实现了多种加密算法,在创建Cipher对象时,传入不同的参数就可以进行不同的加密算法。而这些算法不同的地方只是创建密匙的方法不同而已。

如传入“AES/CBC/NoPadding”可进行AES加密,传入"DESede/CBC/NoPadding"可进行DES3加密。具体的后面会介绍到。

2. Cipher类

2.1 Cipher类提供了加密和解密的功能。

该项目使用Cipher类完成aes,des,des3和rsa加密.

获取Cipher类的对象:Cipher cipher = Cipher.getInstance(“DES/CBC/PKCS5Padding”); 参数按"算法/模式/填充模式",有以下的参数

  • 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)
    (1)加密算法有:AES,DES,DESede(DES3)和RSA 四种
    (2) 模式有CBC(有向量模式)和ECB(无向量模式),向量模式可以简单理解为偏移量,使用CBC模式需要定义一个IvParameterSpec对象
    (3) 填充模式:
  • NoPadding: 加密内容不足8位用0补足8位, Cipher类不提供补位功能,需自己实现代码给加密内容添加0, 如{65,65,65,0,0,0,0,0}
  • PKCS5Padding: 加密内容不足8位用余位数补足8位, 如{65,65,65,5,5,5,5,5}或{97,97,97,97,97,97,2,2}; 刚好8位补8位8

2.2 Cipher对象需要初始化

init(int opmode, Key key, AlgorithmParameterSpec params)
(1)opmode :Cipher.ENCRYPT_MODE(加密模式)和 Cipher.DECRYPT_MODE(解密模式)
(2)key :密匙,使用传入的盐构造出一个密匙,可以使用SecretKeySpec、KeyGenerator和KeyPairGenerator创建密匙,其中

  • SecretKeySpec和KeyGenerator支持AES,DES,DESede三种加密算法创建密匙
  • KeyPairGenerator支持RSA加密算法创建密匙
    (3)params :使用CBC模式时必须传入该参数,该项目使用IvParameterSpec创建iv 对象

2.3 加密或解密

byte[] b = cipher.doFinal(content);
返回结果为byte数组,如果直接使用 new String(b) 封装成字符串,则会出现乱码

DES: Data Encryption Standard,秘钥长度为56位,2003年左右被破解–秘钥可以暴力破解。 3DES: DES的改进版本。 AES: Advanced Encryption Standard,支持的秘钥长度包括 128bits,192bits,258bits,384bits,512bits。 ※ :密钥 Cipher 加密 和解密提供密码功能。它构成了 Java Cryptographic Extension(JCE)框架的核心。在本章的上述内容中,只完成了密钥的处理,并未完成 加密 与解密的操作。这些核心操作需要通过 Cipher 实现 。 // 此 加密 和解密提供密码功能 public class Cipher extends Object Cipher 是一个引擎 ,它需要通过getIn 1、 java x.crypto. Cipher 提供 加密 和解密的功能,它构成了 Java 加密 扩展(JCE)框架的核心。 2、 Cipher 的 getInstance(String transformation) 方法可以获取实例,参数 transformation 表示转换名称,包括: 加密 算法/反馈模式/填充方案。 加密 算法是必选项,反馈模式与填充方案可以不写 使用 默认值。如: Cipher cipher = Cipher .getInstance("AES"); Cipher c = 这也是可选的,它指定了如何处理不够一个完整数据块的情况。:这是可选的,它指定算法的工作模式。对称 加密 算法支持多种模式,如ECB(电子密码本模式)、CBC(密码块链接模式)、CTR(计数器模式)等。如果你不指定模式,将 使用 算法的默认模式。那么将 使用 AES的默认工作模式和默认填充方式(如 Java 实现 中的默认可能是AES/ECB/PKCS5Padding)。方法时,提供的算法、模式和填充方式与您的环境匹配,并且您的安全提供者支持它们。对象,它根据传入的字符串参数指定 加密 或解密的算法、工作模式和填充方式。 Java 加密 分为两种方式一个是对称 加密 ,另一个是非对称 加密 。对称 加密 是因为 加密 和解密的钥匙相同,而非对称 加密 加密 和解密的钥匙不同。 对称 加密 与非对称 加密 的区别: 对称 加密 称为密钥 加密 ,速度快,但 加密 和解密的钥匙必须相同,只有通信双方才能知道密钥。 非对称 加密 称为公钥 加密 ,算法更加复杂,速度慢, 加密 和解密钥匙不相同,任何人都可以知道公钥,只有一个人持有私钥可以解密。 对称 加密解密 : BASE64加解密 BASE64是一种比较基本、简单的 加密 算法,其实BASE64主要作用不是用于 加密 ,BASE64是把与原始的数据转换成另一种编码格式,这样方便在网络上传输。所以严格来说,BASE64并不是安全的 加密解密 算法,但通过BASE64编码过后原来的数据也会改变成非原来的数据的字符。 /*该方法创建BASE64Encoder对象后调用encodeBuffer()方法对数据... // java 加密 扩展(JCE)框架的核心。提供了 加密 和解密的功能。 Cipher cipher = Cipher .getInstance("DES"); //用秘钥与随机源初始化此密码 cipher . init (2,secretKey,sr); //在单一部分操作中 加密 或解密数据。或完成多部分操作。 byte[] bytes = cipher .doFin Cipher cipher = Cipher .getInstance("DES/CBC/PKCS5Padding"); cipher . init ( Cipher .ENCRYPT_MODE, key, zeroIv); CBC是工作模式,DES一共有电子密...