场景

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对称加密的工具类与使用相关推荐

  1. Java中封装的全局日期处理工具类

    场景 全局日期处理类. 时间日期操作类,集成了大部分时间的应用类. 主要功能如下: 获取SimpleDateFormat 获取日期中的某数值.如获取月份 增加日期中某类型的某数值.如增加日期 获取精确 ...

  2. Java中导出pdf文件,pdf工具类demo

    最近在做导出pdf文件的功能,参考了很多资料和demo,完成了转出pdf的功能,并适合项目的pdf工具类,现贴出具体的工具类和demo,如有不对的地方欢迎指正 1.pdf工具类PdfUtil.java ...

  3. java中map和对象互转工具类

    在项目开发中,经常碰到map转实体对象或者对象转map的场景,工作中,很多时候我们可能比较喜欢使用第三方jar包的API对他们进行转化,而且用起来也还算方便,比如像fastJson就可以轻松实现map ...

  4. RSA对称加密 Util工具类

    证书Key直接去换行符存放到就可以更方便,如果需要做安全的话可以把字段放到so层比较好 public class RSAUtil {public static final String KEY_ALG ...

  5. java中拼接xml方法_Java常用工具类,拼接XML格式的字符串,非常好用

    import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.u ...

  6. Java AES 加密解密工具类

    maven 引入一个依赖 <!-- https://mvnrepository.com/artifact/commons-codec/commons-codec --> <depen ...

  7. Java中的AES加密和解密(CBC模式)

    通过有线方式传输诸如纯文本密码之类的机密数据总是容易受到安全性的影响,始终建议对此类信息进行加密并使用SSL传输这些机密数据.Java为此提供了多种加密算法.在本文中,我们将讨论Java中具有CBC模 ...

  8. java gcm_JAVA中的AES GCM加密和解密

    我正在尝试在JAVA中实现AES / GCM / NoPadding加密和解密.使用的密钥是来自接收方的公钥和发送方的私钥(ECDH)的共享密钥.加密效果很好(有无iv).但是,我无法解密...... ...

  9. RSA加密及AES对称加密代码实现

    最近老师布置了两个加密的作业,记录一下编码过程及遇到的问题. 对于RSA解密基本内容这里就不赘述,直接说一下编码过程把: 1:N = p*q(p.q互质,即公约数只有1)可以用辗转相除去判断 2:L是 ...

最新文章

  1. js jquery 数组的合并 对象的合并
  2. 全新释放 | RealSight APM, 让客户的极致数字体验成为可能
  3. js日期的初始化的格式
  4. STM32的ADC采集的引脚汇总
  5. HDU1231(DP)
  6. 编译原理系列之四 自顶向下语法分析方法
  7. 啊哈C——学习2.5一起来找茬
  8. HTML作业制作服装推广软文,盘点:服装推广软文写作技巧
  9. 正态分布随机数产生方法
  10. Kaldi的安装与测试
  11. 判断系统(服务器)中是否存在后门程序的2个工具
  12. java最大文件描述符,java – 为什么JDK NIO使用这么多的anon_inode文件描述符?
  13. linux搭建pptp服务器
  14. (转)HBase WAL简介
  15. 程序员是什么又代表这多少角色?你想过吗?
  16. 初学Java常用设计模式之——单例模式
  17. 【Apsara Clouder 认证】API 接口调用真题
  18. python3 - 7 Python数据类型-字符串
  19. MBR膜池的问题,怎么样判断池水问题?
  20. LaTeX 插入PDF图片,该用哪个命令?

热门文章

  1. 浙江农林大学2021年新生杯程序设计竞赛(同步赛)
  2. Java DelayQueue延迟队列的使用和源码分析
  3. maven的pom.xml中profiles的作用
  4. matlab ltiview应用例子,Matlab控制工具箱(网络软件)
  5. android 加载动画效果_这效果炸了,网易云音乐“宇宙尘埃”特效
  6. dotween曲线运动 unity_Unity中DOTween插件的DOTweenPath轨迹移动
  7. 如何在cmd运行python文件夹_python怎么在cmd运行文件夹
  8. java jdk的作用_jdk的作用是什么?jdk和jre区别介绍
  9. 和ur的区别_UR机械臂simscape正逆解仿真
  10. python适合做什么生意_适合Python的5大练手项目,你练了么?