化妆品排行榜
  1. 首页 >
  2. 美妆资讯 >
  3. 美妆 >
  1. 2.常见加密解密方式

美妆资讯
2.常见加密解密方式
2023-08-05

1.2 常见加密方式

1.2.1 对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。示例我们现在有一个原文3要发送给B设置密钥为108, 3 * 108 = 324, 将324作为密文发送给BB拿到密文324后, 使用324/108 = 3 得到原文常见加密算法DES : Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。AES : Advanced Encryption Standard, 高级加密标准 .在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。特点加密速度快, 可以加密大文件密文可逆, 一旦密钥文件泄漏, 就会导致数据暴露加密后编码表找不到对应字符, 出现乱码一般结合Base64使用

1.2.2 DES加密

示例代码 des加密算法

Cipher :文档 //p1-tt.byteimg.com/origin/tos-cn-i-qvj2lq49k0/8c628204a8614a8382b760bb97bf6bcc.jpg" style="width: 650px;">

修改 密钥 key = “12345678” ,再次运行 ,出现乱码是因为对应的字节出现负数,但负数,没有出现在 ascii 码表里面,所以出现乱码,需要配合base64进行转码

使用 base64 进行编码

base64 导包的时候,需要注意 ,别导错了,需要导入 apache 包

运行程序

1.2.4 DES解密

使用 ctrl + alt + m 快捷键抽取代码

package com.xxx.desaes;\n\nimport com.sun.org.apache.xml.internal.security.utils.Base64;\n\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\n\npublic class DesDemo {\n // DES加密算法,key的大小必须是8个字节\n\n public static void main(String[] args) throws Exception {\n String input =硅谷;\n // DES加密算法,key的大小必须是8个字节\n String key = 12345678;\n\n String transformation = DES; // 9PQXVUIhaaQ=\n // 指定获取密钥的算法\n String algorithm = DES;\n String encryptDES = encryptDES(input, key, transformation, algorithm);\n System.out.println(加密: + encryptDES);\n String s = decryptDES(encryptDES, key, transformation, algorithm);\n System.out.println(解密: + s);\n\n }\n\n /**\n * 使用DES加密数据\n *\n * @param input : 原文\n * @param key : 密钥(DES,密钥的长度必须是8个字节)\n * @param transformation : 获取Cipher对象的算法\n * @param algorithm : 获取密钥的算法\n * @return : 密文\n * @throws Exception\n */\n private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {\n // 获取加密对象\n Cipher cipher = Cipher.getInstance(transformation);\n // 创建加密规则\n // 第一个参数key的字节\n // 第二个参数表示加密算法\n SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);\n // ENCRYPT_MODE:加密模式\n // DECRYPT_MODE: 解密模式\n // 初始化加密模式和算法\n cipher.init(Cipher.ENCRYPT_MODE,sks);\n // 加密\n byte[] bytes = cipher.doFinal(input.getBytes());\n\n // 输出加密后的数据\n String encode = Base64.encode(bytes);\n\n return encode;\n }\n\n /**\n * 使用DES解密\n *\n * @param input : 密文\n * @param key : 密钥\n * @param transformation : 获取Cipher对象的算法\n * @param algorithm : 获取密钥的算法\n * @throws Exception\n * @return: 原文\n */\n private static String decryptDES(String input, String key, String transformation, String algorithm) throws Exception {\n // 1,获取Cipher对象\n Cipher cipher = Cipher.getInstance(transformation);\n // 指定密钥规则\n SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);\n cipher.init(Cipher.DECRYPT_MODE, sks);\n // 3. 解密,上面使用的base64编码,下面直接用密文\n byte[] bytes = cipher.doFinal(Base64.decode(input));\n // 因为是明文,所以直接返回\n return new String(bytes);\n }\n}\n\n

运行程序:

Base64 算法简介

Base64是网络上最常见的用于传输8Bit字节码的可读性编码算法之一\n可读性编码算法不是为了保护数据的安全性,而是为了可读性\n可读性编码不改变信息内容,只改变信息内容的表现形式\n所谓Base64,即是说在编码过程中使用了64种字符:大写A到Z、小写a到z、数字0到9、“+”和“/”\nBase58是Bitcoin(比特币)中使用的一种编码方式,主要用于产生Bitcoin的钱包地址\n相比Base64,Base58不使用数字0,字母大写O,字母大写I,和字母小写i,以及+和/符号\n

Base64 算法原理

base64 是 3个字节为一组,一个字节 8位,一共 就是24位 ,然后,把3个字节转成4组,每组6位,

3 * 8 = 4 * 6 = 24 ,每组6位,缺少的2位,会在高位进行补0 ,这样做的好处在于 ,base取的是后面6位,去掉高2位 ,那么base64的取值就可以控制在0-63位了,所以就叫base64,111 111 = 32 + 16 + 8 + 4 + 2 + 1 =

base64 构成原则

① 小写 a - z = 26个字母

② 大写 A - Z = 26个字母

③ 数字 0 - 9 = 10 个数字

④ + / = 2个符号

大家可能发现一个问题,咱们的base64有个 = 号,但是在映射表里面没有发现 = 号 , 这个地方需要注意,等号非常特殊,因为base64是三个字节一组 ,如果当我们的位数不够的时候,会使用等号来补齐

1.2.4 base64补等号测试

package com.xxx;\n\nimport com.sun.org.apache.xml.internal.security.utils.Base64;\n\n\npublic class TestBase64 {\n public static void main(String[] args) {\n // 1:MQ== 表示一个字节,不够三个字节,所以需要后面通过 == 号补齐\n System.out.println(Base64.encode(1.getBytes()));\n// System.out.println(Base64.encode(12.getBytes()));\n// System.out.println(Base64.encode(123.getBytes()));\n// // 硅谷:中文占6个字节,6 * 8 = 48 ,刚刚好被整除,所以没有等号\n// System.out.println(Base64.encode(硅谷.getBytes()));\n }\n}\n

运行:

1.2.5 AES加密解密

AES 加密解密和 DES 加密解密代码一样,只需要修改加密算法就行,拷贝 ESC 代码

package com.xxx.desaes;\nimport com.sun.org.apache.xml.internal.security.utils.Base64;\n\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.SecretKeySpec;\n\npublic class AesDemo {\n // DES加密算法,key的大小必须是8个字节\n\n public static void main(String[] args) throws Exception {\n String input =硅谷;\n // AES加密算法,比较高级,所以key的大小必须是16个字节\n String key = 1234567812345678;\n\n String transformation = AES; // 9PQXVUIhaaQ=\n // 指定获取密钥的算法\n String algorithm = AES;\n // 先测试加密,然后在测试解密\n String encryptDES = encryptDES(input, key, transformation, algorithm);\n System.out.println(加密: + encryptDES);\n String s = dncryptDES(encryptDES, key, transformation, algorithm);\n System.out.println(解密: + s);\n\n }\n\n /**\n * 使用DES加密数据\n *\n * @param input : 原文\n * @param key : 密钥(DES,密钥的长度必须是8个字节)\n * @param transformation : 获取Cipher对象的算法\n * @param algorithm : 获取密钥的算法\n * @return : 密文\n * @throws Exception\n */\n private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {\n // 获取加密对象\n Cipher cipher = Cipher.getInstance(transformation);\n // 创建加密规则\n // 第一个参数key的字节\n // 第二个参数表示加密算法\n SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);\n // ENCRYPT_MODE:加密模式\n // DECRYPT_MODE: 解密模式\n // 初始化加密模式和算法\n cipher.init(Cipher.ENCRYPT_MODE,sks);\n // 加密\n byte[] bytes = cipher.doFinal(input.getBytes());\n\n // 输出加密后的数据\n String encode = Base64.encode(bytes);\n\n return encode;\n }\n\n /**\n * 使用DES解密\n *\n * @param input : 密文\n * @param key : 密钥\n * @param transformation : 获取Cipher对象的算法\n * @param algorithm : 获取密钥的算法\n * @throws Exception\n * @return: 原文\n */\n private static String dncryptDES(String input, String key, String transformation, String algorithm) throws Exception {\n // 1,获取Cipher对象\n Cipher cipher = Cipher.getInstance(transformation);\n // 指定密钥规则\n SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);\n cipher.init(Cipher.DECRYPT_MODE, sks);\n // 3. 解密\n byte[] bytes = cipher.doFinal(Base64.decode(input));\n\n return new String(bytes);\n }\n}\n

运行程序:AES 加密的密钥key , 需要传入16个字节

在运行程序

1.2.6 toString()与new String ()用法区别

举例子

package com.xxx;\n\n\nimport com.sun.org.apache.xerces.internal.impl.dv.util.Base64;\n\n\npublic class TestBase64 {\n public static void main(String[] args) {\n String str=TU0jV0xBTiNVYys5bEdiUjZlNU45aHJ0bTdDQStBPT0jNjQ2NDY1Njk4IzM5OTkwMDAwMzAwMA==;\n\n\n String rlt1=new String(Base64.decode(str));\n\n String rlt2=Base64.decode(str).toString();\n\n System.out.println(rlt1);\n\n System.out.println(rlt2);\n }\n}\n

结果是:

MM#WLAN#Uc+9lGbR6e5N9hrtm7CA+A==#646465698#399900003000\n\n[B@1540e19d\n

哪一个是正确的?为什么?

这里应该用new String()的方法,因为Base64加解密是一种转换编码格式的原理

toString()与new String ()用法区别

str.toString是调用了这个object对象的类的toString方法。一般是返回这么一个String:[class name]@[hashCode]

new String(str)是根据parameter是一个字节数组,使用java虚拟机默认的编码格式,将这个字节数组decode为对应的字符。若虚拟机默认的编码格式是ISO-8859-1,按照ascii编码表即可得到字节对应的字符。

什么时候用什么方法呢?

new String()一般使用字符转码的时候,byte[]数组的时候

toString()对象打印的时候使用

版权声明:CosMeDna所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系删除!

本文链接://www.cosmedna.com/article/142532112.html