Android+Java中使用Aes对称加密的工具类与使用
場景
Android+Java中使用RSA加密實現接口調用時的校驗功能:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/111467394
在以上使用RSA非對稱加密時所加密的key是固定的,如果限制只能在Android端和Java端能解密獲取到key,在傳輸時使用密文,可以使用對稱加密中的Aes加密。即使用同一個密鑰進行加解密。
注:
博客主頁:
https://blog.csdn.net/badao_liumang_qizhi
關注公眾號
霸道的程序猿
獲取編程相關電子書、教程推送與免費下載。
實現
首先在SpringBoot項目中引入需要的依賴
??????? <!-- Aes加密--><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk16</artifactId><version>1.46</version></dependency>然后新建一個工具類AesUtils
package com.ruoyi.web.controller.common;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 = "A3kppuf53Ch498Dj";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 = "A3kppuf53Ch498Dj";//字符串String str = "badaodechengxvyuan";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();}} }首先需要調用main方法中獲取獲取key的代碼
??????? String sjkey = getKey();System.out.println("獲得隨機key:" + sjkey);注意這里的Base64的引入
import org.apache.tomcat.util.codec.binary.Base64;然后將獲取的Key手動復制給上面的
public static String key = "A3kppuf53Ch498Dj";然后將此key交給Android
Android項目打開build.gradle引入相關依賴
??? //AES加密相關// https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk16implementation group: 'org.bouncycastle', name: 'bcprov-jdk16', version: '1.46'在Android中新建工具類
package com.badao.badaoimclient.common;import android.util.Base64; import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec;/*** 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;/*** 固定的Aes加密key*/public static String aesKey = "A3kppuf53Ch498Dj";//這里的Key要和進行加密時使用的key一致/*** 解密** @param encryptStr 解密的字符串* @param decryptKey 解密的key值*/public static String decrypt(String encryptStr, String decryptKey) throws Exception {//base64格式的key字符串轉bytebyte[] decodeBase64 = Base64.decode(encryptStr,Base64.DEFAULT);//設置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);}}注意這里的Base64
import android.util.Base64;將從Java中獲取的key賦值到上面的變量。
然后就可以實現在Java端將某字符串進行加密,然后將密文傳輸到Android,在Android中使用相同的key將密文解密。
所以這里Android中只有解密的方法,如果想加密發送,則將Java的加密方法復制過來。
為了演示加解密,只在Java端進行調用演示
?
?
總結
以上是生活随笔為你收集整理的Android+Java中使用Aes对称加密的工具类与使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android+Java中使用RSA加密
- 下一篇: Java中使用mysqldump实现my