对海尔网站建设水平的评价,昆明网络推广哪里有,如何做线上推广,上海招聘网站建设场景
AndroidJava中使用Aes对称加密的工具类与使用#xff1a;
AndroidJava中使用Aes对称加密的工具类与使用_霸道流氓气质的博客-CSDN博客
上面讲的Java与安卓进行数据传输时使用AES加解密的示例工具类。
如果Java需要与其他第三方平台比如Winform程序进行数据传递时也需…场景
AndroidJava中使用Aes对称加密的工具类与使用
AndroidJava中使用Aes对称加密的工具类与使用_霸道流氓气质的博客-CSDN博客
上面讲的Java与安卓进行数据传输时使用AES加解密的示例工具类。
如果Java需要与其他第三方平台比如Winform程序进行数据传递时也需要
数据加解密。
AES
AES高级加密标准Advanced Encryption Standard)加密是一种对称的加密方式用来替代原先的DES。
AES支持三种长度的密钥 128位192位256位
平时大家所说的AES128AES192AES256实际上就是指AES算法对不同长度密钥的使用。
三种密钥的区别
从安全性来看AES256安全性最高。从性能看AES128性能最高。本质原因是它们的加密处理轮数不同。
本文采用AES的ECB模式进行加密填充方式为PKCS5Padding加密的密码必须为16位。编码方式统一使用UTF-8。
关于加密模式与填充模式不再详解可自行学习只需保证Java与Winform中对应即可。
Java AES加密中的ECB加密模式对应于C#中的System.Security.Cryptography.CipherMode.ECB模式;
Java中的PKCS5Padding填充方式对应于C#中的System.Security.Cryptography.PaddingMode.PKCS7;
注
博客https://blog.csdn.net/badao_liumang_qizhi
实现
1、Java中进行加解密的流程与上面博客中一致
引入依赖 !-- Aes加密--dependencygroupIdorg.bouncycastle/groupIdartifactIdbcprov-jdk16/artifactIdversion1.46/version/dependency
新建工具类
import org.apache.tomcat.util.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Random;/*** AES加、解密算法工具类*/
public class AesUtils {/*** 加密算法AES*/private static final String KEY_ALGORITHM AES;/*** key的长度Wrong key size: must be equal to 128, 192 or 256* 传入时需要16、24、36*/private static final Integer KEY_LENGTH 16 * 8;/*** 算法名称/加密模式/数据填充方式* 默认AES/ECB/PKCS5Padding*/private static final String ALGORITHMS AES/ECB/PKCS5Padding;/*** 后端AES的key由静态代码块赋值*/public static String key badaodechengxvyu;static {key getKey();}/*** 获取key*/public static String getKey() {StringBuilder uid new StringBuilder();//产生16位的强随机数Random rd new SecureRandom();for (int i 0; i KEY_LENGTH / 8; i) {//产生0-2的3位随机数int type rd.nextInt(3);switch (type) {case 0://0-9的随机数uid.append(rd.nextInt(10));break;case 1://ASCII在65-90之间为大写,获取大写随机uid.append((char) (rd.nextInt(25) 65));break;case 2://ASCII在97-122之间为小写获取小写随机uid.append((char) (rd.nextInt(25) 97));break;default:break;}}return uid.toString();}/*** 加密** param content 加密的字符串* param encryptKey key值*/public static String encrypt(String content, String encryptKey) throws Exception {//设置Cipher对象Cipher cipher Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), KEY_ALGORITHM));//调用doFinalbyte[] b cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));// 转base64return Base64.encodeBase64String(b);}/*** 解密** param encryptStr 解密的字符串* param decryptKey 解密的key值*/public static String decrypt(String encryptStr, String decryptKey) throws Exception {//base64格式的key字符串转bytebyte[] decodeBase64 Base64.decodeBase64(encryptStr);//设置Cipher对象Cipher cipher Cipher.getInstance(ALGORITHMS,new BouncyCastleProvider());cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), KEY_ALGORITHM));//调用doFinal解密byte[] decryptBytes cipher.doFinal(decodeBase64);return new String(decryptBytes);}
}
加解密测试 public static void main(String[] args) {/* String sjkey getKey();System.out.println(获得随机key sjkey);*///16位String key badaodechengxvyu;//字符串String str 霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主;try {//加密String encrypt encrypt(str, key);//解密String decrypt decrypt(encrypt, key);System.out.println(加密前 str);System.out.println(加密后 encrypt);System.out.println(解密后 decrypt);} catch (Exception e) {e.printStackTrace();}}
测试结果 2、Winform中也新建工具类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;namespace WinformStudyDemo.com.badao.utils
{class AESUtils{private static string key badaodechengxvyu;// AES 加密public static string encrypt(string str){if (string.IsNullOrEmpty(str)) return null;Byte[] toEncryptArray Encoding.UTF8.GetBytes(str);RijndaelManaged rm new RijndaelManaged{Key Encoding.UTF8.GetBytes(key),Mode CipherMode.ECB,Padding PaddingMode.PKCS7};ICryptoTransform cTransform rm.CreateEncryptor();Byte[] resultArray cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Convert.ToBase64String(resultArray, 0, resultArray.Length);}// AES 解密public static string decrypt(string str){if (string.IsNullOrEmpty(str)) return null;Byte[] toEncryptArray Convert.FromBase64String(str);RijndaelManaged rm new RijndaelManaged{Key Encoding.UTF8.GetBytes(key),Mode CipherMode.ECB,Padding PaddingMode.PKCS7};ICryptoTransform cTransform rm.CreateDecryptor();Byte[] resultArray cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);return Encoding.UTF8.GetString(resultArray);}}
}
注意与上面Java一致的key
然后进行加解密测试 //字符串String str https://blog.csdn.net/BADAO_LIUMANG_QIZHI;try{//加密String encrypt com.badao.utils.AESUtils.encrypt(str);//解密String decrypt com.badao.utils.AESUtils.decrypt(encrypt);Console.WriteLine(加密前 str);Console.WriteLine(加密后 encrypt);Console.WriteLine(解密后 decrypt);}catch (Exception exeception){Console.WriteLine(exeception.Message);}测试结果 3、经过对比结果一致
均为
加密前https://blog.csdn.net/BADAO_LIUMANG_QIZHI
加密后hI/PIG/rNC9OOqeqSILf4txnymyEAWa5FUVtBMYvNDlkpxgShSB44FKbh1HkvVg
解密后https://blog.csdn.net/BADAO_LIUMANG_QIZHI