iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android 数据SM4传输加解密
  • 396
分享到

Android 数据SM4传输加解密

java开发语言 2023-09-07 07:09:56 396人浏览 泡泡鱼
摘要

第一:场景介绍   甲方要求,数据在传输过程中要加密。 第二:选择加解密方式: 这里面Android 和服务端都是选择SM4 第三:实现方式 服务端采用SpringBoot,在pom.xml 文件下添加依赖 org.bouncycastle

第一:场景介绍

  甲方要求,数据在传输过程中要加密。

第二:选择加解密方式:

这里面Android 和服务端都是选择SM4

第三:实现方式

服务端采用SpringBoot,在pom.xml 文件下添加依赖

org.bouncycastlebcprov-jdk15on1.64

在Android 端同样添加依赖,在module 下面build.gradle

  implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.64'

服务端SM4工具

package com.wansun.datahouse.visit.utils;import org.apache.Tomcat.util.buf.HexUtils;import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecreTKEySpec;import java.security.InvalidAlGorithmParameterException;import java.security.InvalidKeyException;import java.security.Key;import java.security.NoSuchAlgorithmException;import java.security.NoSuchProviderException;import java.security.SecureRandom;import java.security.Security;public class Sm4Util {        public static final String ALGORITHM_NAME = "SM4";        public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding";        public static final String ALGORITHM_NAME_ECB_NOPADDING = "SM4/ECB/NoPadding";        public static final String ALGORITHM_NAME_CBC_PADDING = "SM4/CBC/PKCS5Padding";        public static final String ALGORITHM_NAME_CBC_NOPADDING = "SM4/CBC/NoPadding";        public static final int DEFAULT_KEY_SIZE = 128;    static {        // 加入 BC 实现        Security.addProvider(new BouncyCastleProvider());    }        private static byte[] generateKey() throws NoSuchAlgorithmException, NoSuchProviderException {        return generateKey(DEFAULT_KEY_SIZE);    }        private static byte[] generateKey(int keySize) throws NoSuchAlgorithmException, NoSuchProviderException {        KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);        kg.init(keySize, new SecureRandom());        return kg.generateKey().getEncoded();    }        private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key)            throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException,            InvalidKeyException {        Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);        Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);        cipher.init(mode, sm4Key);        return cipher;    }        private static byte[] encryptEcbPadding(byte[] key, byte[] data)            throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException,            NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key);        return cipher.doFinal(data);    }        private static byte[] decryptEcbPadding(byte[] key, byte[] cipherText)            throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException,            NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException {        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key);        return cipher.doFinal(cipherText);    }        private static byte[] encryptEcbNoPadding(byte[] key, byte[] data)            throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException,            NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_NOPADDING, Cipher.ENCRYPT_MODE, key);        return cipher.doFinal(data);    }        private static byte[] decryptEcbNoPadding(byte[] key, byte[] cipherText)            throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException,            NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException {        Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_NOPADDING, Cipher.DECRYPT_MODE, key);        return cipher.doFinal(cipherText);    }        private static Cipher generateCbcCipher(String algorithmName, int mode, byte[] key, byte[] iv)            throws InvalidKeyException, InvalidAlgorithmParameterException, NoSuchAlgorithmException,            NoSuchProviderException, NoSuchPaddingException {        Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);        Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);        cipher.init(mode, sm4Key, ivParameterSpec);        return cipher;    }        private static byte[] encryptCbcPadding(byte[] key, byte[] iv, byte[] data)            throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException,            NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException,            InvalidAlgorithmParameterException {        Cipher cipher = generateCbcCipher(ALGORITHM_NAME_CBC_PADDING, Cipher.ENCRYPT_MODE, key, iv);        return cipher.doFinal(data);    }        private static byte[] decryptCbcPadding(byte[] key, byte[] iv, byte[] cipherText)            throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException,            NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException,            InvalidAlgorithmParameterException {        Cipher cipher = generateCbcCipher(ALGORITHM_NAME_CBC_PADDING, Cipher.DECRYPT_MODE, key, iv);        return cipher.doFinal(cipherText);    }        private static byte[] encryptCbcNoPadding(byte[] key, byte[] iv, byte[] data)            throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException,            NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException,            InvalidAlgorithmParameterException {        Cipher cipher = generateCbcCipher(ALGORITHM_NAME_CBC_NOPADDING, Cipher.ENCRYPT_MODE, key, iv);        return cipher.doFinal(data);    }        private static byte[] decryptCbcNoPadding(byte[] key, byte[] iv, byte[] cipherText)            throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException,            NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException,            InvalidAlgorithmParameterException {        Cipher cipher = generateCbcCipher(ALGORITHM_NAME_CBC_NOPADDING, Cipher.DECRYPT_MODE, key, iv);        return cipher.doFinal(cipherText);    }        public static String generateKey_Hex() throws Exception {        return HexUtils.toHexString(generateKey());    }        public static String encryptCbcPaddingHex(String key, String iv, String data) throws Exception {        String iv_hex = HexUtils.toHexString(iv.getBytes());        return HexUtils.toHexString(encryptCbcPadding(HexUtils.fromHexString(key),                HexUtils.fromHexString(iv_hex), data.getBytes()));    }        public static String decryptCbcPaddingHex(String key, String iv, String cipherText) throws Exception {        return new String(decryptCbcPadding(HexUtils.fromHexString(key), iv.getBytes(),                HexUtils.fromHexString(cipherText)));    }    public static void main(String[] args) throws Exception {        String data = "{\"test\":\"湖北利川深圳\"}";        String iv = "blade12345678910";//        String hexKey = generateKey_Hex();        String hexKey = "20785fae41a54c65ab95d2db1abc7f9f";        System.out.println("hexKey===" + hexKey);        String cipher = encryptCbcPaddingHex(hexKey, iv, data);        System.out.println("cipher==" + cipher);        String b = decryptCbcPaddingHex(hexKey, iv, cipher);        System.out.println(b);    }}

Android SM4 工具类,要把 

BouncyCastleProvider.PROVIDER_NAME 贴换为 new BouncyCastleProvider()  不然报错

分别在拦截器里面调用 加解密方法。hexKey 可以自己生成。iv 自己定义16位

    String hexKey = "20785fae41a54c65ab95d2db1abc7f9f";    String iv = "blade12345678910";

加密方法:

String encryptJSON = Sm4Util.encryptCbcPaddingHex(hexKey, iv, String.valueOf(json));

解密方法:

 String decryptJson = Sm4Util.decryptCbcPaddingHex(hexKey, iv, String.valueOf(data));

这里面就不展示拦截器里面的代码。

截图展示加解密后的效果。

 

来源地址:https://blog.csdn.net/beautifulYuan/article/details/129528518

--结束END--

本文标题: Android 数据SM4传输加解密

本文链接: https://www.lsjlt.com/news/397779.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android 数据SM4传输加解密
    第一:场景介绍   甲方要求,数据在传输过程中要加密。 第二:选择加解密方式: 这里面Android 和服务端都是选择SM4 第三:实现方式 服务端采用SpringBoot,在pom.xml 文件下添加依赖 org.bouncycastle...
    99+
    2023-09-07
    java 开发语言
  • vue数据传输怎么加密
    今天小编给大家分享一下vue数据传输怎么加密的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.首先,在vue项目中使用yar...
    99+
    2023-07-04
  • Node.js 数据加密传输浅析
    前言 数据加密传输,大家经常接触几个方式一个是密文传输,一个明文传输密文传输,就是用密钥对数据加密,使用公钥对数据解密,传输的通道可以是https的也可以是http的。明文传输,前提是建立一个安全的传输通道...
    99+
    2022-06-04
    数据 Node js
  • vue数据传输如何加密
    在vue中使用jsencrypt.js对数据进行加密传输首先,在vue项目中使用yarn安装jsencrypt.js;yarn add jsencrypt --depjsencrypt.js安装好后,在vue项目中引入jsencrypt.j...
    99+
    2022-10-24
  • FTP传输数据怎么加密
    利用vsftp对FTP传输数据进行加密的方法首先,在计算机中创建一个FTP用户;user -d /ftp_www -s /sbin/nologin mvpbangecho "123123" | passwd mvpbang --stdinc...
    99+
    2022-10-17
  • kettle传输数据如何加密
    java使用ASE128对kettle加密传输数据,具体方法如下:package com;import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import ...
    99+
    2022-10-15
  • Android客户端与服务端数据加密传输方案详解
    目录前言数据加密方案数据加密细节AES加解密RSA公钥加密总结前言 在网络通信中,通信传输数据容易被截取或篡改,如果在传输用户隐私数据过程中,被不法分子截取或篡改,就可能导致用户受...
    99+
    2023-01-03
    Android客户端服务端数据加密传输 Android 数据加密传输
  • 如何进行Springboot数据安全传输加密与解密
    这篇文章给大家介绍如何进行Springboot数据安全传输加密与解密,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。环境:springboot2.2.6.RELEASE、Vue+axio...
    99+
    2022-10-19
  • Node怎么实现前后端数据传输加密解密
    今天小编给大家分享一下Node怎么实现前后端数据传输加密解密的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一...
    99+
    2022-10-19
  • 如何用rc5做数据传输加密
    在c++项目中使用rc5对数据传输进行加密的方法具体方法如下:#include "stdafx.h"#include#include #include #define UINT32 unsigned int#define INT32 int...
    99+
    2022-10-18
  • 数据传输用什么加密算法
    常用于数据传输加密的加密算法有以下几种RSA算法RSA算法是一种使用不同的加密密钥与解密密钥,是由已知加密密钥推导出解密密钥在计算上是不可行的密码体制,其原理是根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以...
    99+
    2022-10-19
  • 数据传输有什么加密措施
    数据传输的加密措施有以下几种数据加密数据在传输过程中是很容易被抓包,可以使用https协议,在http和tcp之间添加一层加密层,这一层负责数据的加密和解密。数据加签数据加签就是由发送者产生一段无法伪造的一段数字串,来保证数据在传输过程中不...
    99+
    2022-10-17
  • SpringBoot如何集成数据传输加密
    这篇文章主要讲解了“SpringBoot如何集成数据传输加密”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot如何集成数据传输加密”吧!生成DESKey生成的DES加密密钥一...
    99+
    2023-07-04
  • Android数据加密之Des加密详解
    Android DES加密的相关实现,简单的实现了一下,今天来总结一下: DES加密介绍: DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES...
    99+
    2022-06-06
    加密 des加密 des Android
  • app数据传输加密方式有哪些
    app数据传输的加密方式有以下几种端到端加密端到端加密是允许数据从源点到终点的传输过程中始终以密文形式存在,使用端到端加密时,消息在被传输是到达终点之前不进行解密,因为消息在整个传输过程中均受到保护,所以即使有节点被损坏也不会使消息泄露;但...
    99+
    2022-10-20
  • 前后端传输数据加密怎么做
    使用base64加密实现前后端数据加密传输的方法具体方法如下:var keyStr = "ABCDEFGHIJKLMNOP"+"QRSTUVWXYZabcdef"+"ghijklmnopqrstuv"+"wxyz0123456789+/="...
    99+
    2022-10-17
  • 数据传输的加密方式有哪些
    常见的数据传输加密方式有以下两种MD5加密MD5是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护,MD5是以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分...
    99+
    2022-10-15
  • 数据传输加密的模式有哪些
    数据传输加密的模式有以下两种对称加密对称加密是采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,对称性加密通常在消息发送方需要加密大量数据时使用。非对称加密非对称加密使用了公钥和私钥,私钥只能由一方安全保管,不能外泄,而公...
    99+
    2022-10-19
  • PHP加密解密函数实现数据传输的安全保护功能
    PHP加密解密函数实现数据传输的安全保护功能随着互联网的快速发展和应用的普及,数据的安全性问题变得尤为重要。很多网站和应用程序需要在客户端和服务器之间传输敏感数据,如用户密码、银行账户信息等,为了保护这些数据的安全,一种可行的方法是使用加密...
    99+
    2023-11-20
    数据传输 安全保护 PHP加密解密函数
  • 网络数据传输加密方式有哪些
    常见的网络数据传输加密方式有以下三种节点加密节点加密是通过在中间节点先对消息进行解密,在进行加密操作,节点加密过程中需要对所有传输的数据进行加密,所以其加密过程是透明的。链路加密链路加密是在数据传输前进行加密,并在每一个节点对接收的数据进行...
    99+
    2022-10-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作