加密解密

一、对称加密算法

1.DES

    可以存在获取秘钥算法和加解密算法不同情况

    创建秘钥:

注入BouncyCastle

要添加Security.addProvider(new BouncyCastleProvider());下面的"BC"才会生效 

KeyGenerator keyGenerator= KeyGenerator.getInstance("DES","BC"); 

初始化设置64位的,java7是56位

keyGenerator.init(64);

生成秘钥(还原的时候就是还原成这个来解密)

SecretKey key= keyGenerator.generateKey();

转为二进制形式

byte[] keys=key.getEncoded();

    用Base64对秘钥转换为可见字符串存储

    转换秘钥

获取秘钥二进制形式

创建秘钥材料

DESKeySpec desKeySpec=new DESKeySpec(keys);

实例化秘钥工厂

SecretKeyFactory skf=SecretKeyFactory.getInstance("DES");

生成秘钥

SecretKey key2=skf.generateSecret(desKeySpec);

加解密

加密解密步骤一样,只是在初始化参数的时候类型参数(Cipher.ENCRYPT_MODE和Cipher.DECRYPT_MODE)不同

获取加解密实例

Cipher cipher=Cipher.getInstance("DES");

初始化数据 加密、解密  秘钥

cipher.init(Cipher.ENCRYPT_MODE, key);加密

cipher2.init(Cipher.DECRYPT_MODE, key);解密

执行加密解密操作

byte[] res2=cipher2.doFinal(data);

2.AES

Security.addProvider(new BouncyCastleProvider());

String string="Java加密与解密的艺术";

byte[] str=string.getBytes("utf-8");

//生成密钥

KeyGenerator keyGenerator= null;

try {

keyGenerator = KeyGenerator.getInstance("AES");

keyGenerator.init(256);

SecretKey secretKey=keyGenerator.generateKey();

byte[] keys=secretKey.getEncoded();

System.out.println(Base64Utils.encodeToString(keys));

//还原密钥

SecretKey secretKey1=new SecretKeySpec(keys,"AES");

//加密

Cipher cipher=Cipher.getInstance("AES","BC");

cipher.init(Cipher.ENCRYPT_MODE,secretKey);

byte[]encodeStr=cipher.doFinal(str);

System.out.println(Base64Utils.encodeToString(encodeStr));

//解密

Cipher cipher1=Cipher.getInstance("AES");

cipher1.init(Cipher.DECRYPT_MODE,secretKey1);

byte[]decodeStr=cipher1.doFinal(encodeStr);

System.out.println(new String(decodeStr,"utf-8"));

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (BadPaddingException e) {

e.printStackTrace();

} catch (IllegalBlockSizeException e) {

e.printStackTrace();

} catch (NoSuchProviderException e) {

e.printStackTrace();

}

二、非对称加密算法

三、这些不知道怎么分

Base64:

1 获取加密二进制数组

2 将原数组3个8位转为4个6位并在高位补0(两个0)

3 对照Base64加密表获取对应加密字母并转为10进制的二进制数组(底层强转为byte)

提供的工具类:spring有提供、 jdk1.8有提供、BouncyCastle有提供(依赖包 bcprov-jdk15on),commons-codec提供的

<dependency>

<groupId>org.bouncycastle</groupId>

<artifactId>bcprov-jdk15on</artifactId>

<version>1.61</version>

</dependency>

<dependency>

<groupId>commons-codec</groupId>

<artifactId>commons-codec</artifactId>

<version>1.13</version>

</dependency>

Md5

commons-code提供DigestUtils工具类

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容