iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >Android客户端中怎么实现RSA加密功能
  • 536
分享到

Android客户端中怎么实现RSA加密功能

androidrsa 2023-05-30 21:05:43 536人浏览 独家记忆
摘要

Android客户端中怎么实现RSA加密功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Android 客户端RSA加密的实现方法针对java后端进行的RSA

Android客户端中怎么实现RSA加密功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

Android 客户端RSA加密的实现方法

针对java后端进行的RSA加密,android客户端进行解密,结果是部分乱码的问题:

注意两点,编码问题和客户端使用的算法问题

即:都使用UTF-8编码,Base64使用一致,另外,使用下面的代码在后端和移动端解密只有一点不同:

移动端使用

 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

后端使用

 Cipher cipher = Cipher.getInstance("RSA");

其他地方都不需要改动

package rsa;import android.util.Base64;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;//import org.apache.commons.codec.binary.Base64;public class Base64Utils {    private static final int CACHE_SIZE = 1024;    public static byte[] decode(String base64) throws Exception {    return Base64.decode(base64.getBytes(), Base64.DEFAULT);  }    public static String encode(byte[] bytes) throws Exception {    return new String(Base64.encode(bytes, Base64.DEFAULT));  }    public static String encode(String str) throws Exception {    byte[] bytes = str.getBytes("utf-8");    return encode(bytes);  }    public static String encodeFile(String filePath) throws Exception {    byte[] bytes = fileToByte(filePath);    return encode(bytes);  }    public static void decodeToFile(String filePath, String base64) throws Exception {    byte[] bytes = decode(base64);    byteArrayToFile(bytes, filePath);  }    public static byte[] fileToByte(String filePath) throws Exception {    byte[] data = new byte[0];    File file = new File(filePath);    if (file.exists()) {      FileInputStream in = new FileInputStream(file);      ByteArrayOutputStream out = new ByteArrayOutputStream(2048);      byte[] cache = new byte[CACHE_SIZE];      int nRead = 0;      while ((nRead = in.read(cache)) != -1) {        out.write(cache, 0, nRead);        out.flush();      }      out.close();      in.close();      data = out.toByteArray();    }    return data;  }    public static void byteArrayToFile(byte[] bytes, String filePath) throws Exception {    InputStream in = new ByteArrayInputStream(bytes);    File destFile = new File(filePath);    if (!destFile.getParentFile().exists()) {      destFile.getParentFile().mkdirs();    }    destFile.createNewFile();    OutputStream out = new FileOutputStream(destFile);    byte[] cache = new byte[CACHE_SIZE];    int nRead = 0;    while ((nRead = in.read(cache)) != -1) {      out.write(cache, 0, nRead);      out.flush();    }    out.close();    in.close();  }}
package rsa;import android.util.Base64;import java.io.ByteArrayOutputStream;import java.security.Key;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;import javax.crypto.Cipher;public class RSAUtils {    public static final String KEY_ALGoRITHM = "RSA";    public static final String SIGNATURE_ALGORITHM = "MD5withRSA";    private static final String PUBLIC_KEY = "RSAPublicKey";    private static final String PRIVATE_KEY = "RSAPrivateKey";    private static final int MAX_ENCRYPT_BLOCK = 117;    private static final int MAX_DECRYPT_BLOCK = 128;    public static Map<String, Object> genKeyPair() throws Exception {    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);    keyPairGen.initialize(1024);    KeyPair keyPair = keyPairGen.generateKeyPair();    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();    Map<String, Object> keyMap = new HashMap<String, Object>(2);    keyMap.put(PUBLIC_KEY, publicKey);    keyMap.put(PRIVATE_KEY, privateKey);    return keyMap;  }    public static String sign(byte[] data, String privateKey) throws Exception {    byte[] keyBytes = Base64.decode(privateKey,0);    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);    Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);    signature.initSign(privateK);    signature.update(data);    return Base64.encodeToString(signature.sign(), 0);  }    public static boolean verify(byte[] data, String publicKey, String sign)      throws Exception {    byte[] keyBytes = Base64.decode(publicKey,0);    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    PublicKey publicK = keyFactory.generatePublic(keySpec);    Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);    signature.initVerify(publicK);    signature.update(data);    return signature.verify(Base64.decode(sign,0));  }    public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey)      throws Exception {    byte[] keyBytes = Base64.decode(privateKey, 0);    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);    Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");    cipher.init(Cipher.DECRYPT_MODE, privateK);    int inputLen = encryptedData.length;    ByteArrayOutputStream out = new ByteArrayOutputStream();    int offSet = 0;    byte[] cache;    int i = 0;    // 对数据分段解密    while (inputLen - offSet > 0) {      if (inputLen - offSet > MAX_DECRYPT_BLOCK) {        cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);      } else {        cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);      }      out.write(cache, 0, cache.length);      i++;      offSet = i * MAX_DECRYPT_BLOCK;    }    byte[] decryptedData = out.toByteArray();    out.close();    return decryptedData;  }    public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey)      throws Exception {    byte[] keyBytes = Base64.decode(publicKey,0);    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key publicK = keyFactory.generatePublic(x509KeySpec);    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.DECRYPT_MODE, publicK);    int inputLen = encryptedData.length;    ByteArrayOutputStream out = new ByteArrayOutputStream();    int offSet = 0;    byte[] cache;    int i = 0;    // 对数据分段解密    while (inputLen - offSet > 0) {      if (inputLen - offSet > MAX_DECRYPT_BLOCK) {        cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);      } else {        cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);      }      out.write(cache, 0, cache.length);      i++;      offSet = i * MAX_DECRYPT_BLOCK;    }    byte[] decryptedData = out.toByteArray();    out.close();    return decryptedData;  }    public static byte[] encryptByPublicKey(byte[] data, String publicKey)      throws Exception {    byte[] keyBytes = Base64.decode(publicKey,0);    X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key publicK = keyFactory.generatePublic(x509KeySpec);    // 对数据加密    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.ENCRYPT_MODE, publicK);    int inputLen = data.length;    ByteArrayOutputStream out = new ByteArrayOutputStream();    int offSet = 0;    byte[] cache;    int i = 0;    // 对数据分段加密    while (inputLen - offSet > 0) {      if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {        cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);      } else {        cache = cipher.doFinal(data, offSet, inputLen - offSet);      }      out.write(cache, 0, cache.length);      i++;      offSet = i * MAX_ENCRYPT_BLOCK;    }    byte[] encryptedData = out.toByteArray();    out.close();    return encryptedData;  }    public static byte[] encryptByPrivateKey(byte[] data, String privateKey)      throws Exception {    byte[] keyBytes = Base64.decode(privateKey,0);    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);    Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());    cipher.init(Cipher.ENCRYPT_MODE, privateK);    int inputLen = data.length;    ByteArrayOutputStream out = new ByteArrayOutputStream();    int offSet = 0;    byte[] cache;    int i = 0;    // 对数据分段加密    while (inputLen - offSet > 0) {      if (inputLen - offSet > MAX_ENCRYPT_BLOCK) {        cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK);      } else {        cache = cipher.doFinal(data, offSet, inputLen - offSet);      }      out.write(cache, 0, cache.length);      i++;      offSet = i * MAX_ENCRYPT_BLOCK;    }    byte[] encryptedData = out.toByteArray();    out.close();    return encryptedData;  }    public static String getPrivateKey(Map<String, Object> keyMap)      throws Exception {    Key key = (Key) keyMap.get(PRIVATE_KEY);    return Base64.encodeToString(key.getEncoded(),0);  }    public static String getPublicKey(Map<String, Object> keyMap)      throws Exception {    Key key = (Key) keyMap.get(PUBLIC_KEY);    return Base64.encodeToString(key.getEncoded(), 0);  }}

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: Android客户端中怎么实现RSA加密功能

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

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

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

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

下载Word文档
猜你喜欢
  • Android客户端中怎么实现RSA加密功能
    Android客户端中怎么实现RSA加密功能,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Android 客户端RSA加密的实现方法针对java后端进行的RSA...
    99+
    2023-05-30
    android rsa
  • 怎么实现security.js RSA加密与java客户端解密
    本篇文章给大家分享的是有关怎么实现security.js RSA加密与java客户端解密,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  在通常的http协议的网站中直接提交数...
    99+
    2023-06-02
  • android ssh客户端怎么实现
    要实现 Android 上的 SSH 客户端,可以使用以下步骤: 添加 SSH 客户端库:首先需要在 Android 项目中添加...
    99+
    2023-10-22
    android ssh
  • nodejs中socket怎么实现服务端和客户端功能
    小编给大家分享一下nodejs中socket怎么实现服务端和客户端功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:使用node.js的net模块能很快的开发出基于TCP的服务端...
    99+
    2024-04-02
  • Python怎么实现RSA加密解密
    这篇文章主要介绍了Python怎么实现RSA加密解密的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python怎么实现RSA加密解密文章都会有所收获,下面我们一起来看看吧。一、安装模块pip inst...
    99+
    2023-06-30
  • python rsa加密解密怎么实现
    在Python中,可以使用`cryptography`库来实现RSA加密和解密。以下是一个示例: from cryptography...
    99+
    2023-10-26
    python
  • FTP客户端c代码功能实现
    现在市面上有很多免费的FTP软件:如FileZilla ,那如果想自己在代码中实现与ftp服务器的上传下载文件该如何实现那?  本质上ftp协议就是TCP基础上建立的一种协议,具体如下。 FTP 概述 文件传输协议(FTP)作为网络共享文件...
    99+
    2023-09-24
    服务器 网络 linux
  • 怎么在C#中使用MJPEG实现一个客户端功能
    怎么在C#中使用MJPEG实现一个客户端功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:服务端MJPEG服务器使用的是手机的DroidCam,很方便的一个MJPEG服务...
    99+
    2023-06-06
  • Go语言怎么实现RSA加密解密
    这篇文章将为大家详细讲解有关Go语言怎么实现RSA加密解密,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。go是什么golang是一种编译语言,可以将代码编译为机器代码,编译后的二进制文件可以直接部署到目标...
    99+
    2023-06-14
  • Vue项目怎么实现rsa加密
    这篇“Vue项目怎么实现rsa加密”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue项目怎么实现rsa加密”文章吧。安装j...
    99+
    2023-07-02
  • 怎么利用Python实现RSA加密解密
    这篇文章主要介绍“怎么利用Python实现RSA加密解密”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么利用Python实现RSA加密解密”文章能帮助大家解决问题。RSA加密实验基本流程:一、选取...
    99+
    2023-06-29
  • java怎么实现rsa加密解密文件
    要在Java中实现RSA加密和解密文件,可以使用Java Cryptography Architecture(JCA)提供的RSA算...
    99+
    2023-10-26
    java
  • C#实现MQTT服务端与客户端通讯功能
    关于MQTT MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设...
    99+
    2024-04-02
  • Android如何实现仿银行客户签名功能
    这篇文章将为大家详细讲解有关Android如何实现仿银行客户签名功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先需要一个自定义view用来签字使用,可以修改颜色和画笔的粗细,可以擦拭重新画packa...
    99+
    2023-05-31
    android
  • Java聊天室之实现客户端群聊功能
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:不同的客户端之间需要进行通信,一个客户端与其他的多个客户端进行通信,实现群聊功能。 实现一个客户端与其他多个客户端进行...
    99+
    2022-11-13
    Java实现聊天室 Java 聊天室 Java 客户端群聊
  • C#用websocket实现简易聊天功能(客户端)
    本文实例为大家分享了C#用websocket实现简易聊天功能的具体代码,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.NET FrameWork4功能包含群聊,和私聊参...
    99+
    2024-04-02
  • VSTS 2010客户端IDE新功能怎么用
    小编给大家分享一下VSTS 2010客户端IDE新功能怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!本文要介绍的是VSTS 2010客户端IDE的一个新功能...
    99+
    2023-06-17
  • VB中怎么实现加密安全功能
    在VB中可以使用加密算法来实现加密安全功能,常用的加密算法包括对称加密算法和非对称加密算法。以下是在VB中实现加密安全功能的步骤: ...
    99+
    2024-04-03
    VB
  • Android Socket怎么实现多个客户端聊天布局
    这篇“Android Socket怎么实现多个客户端聊天布局”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Andr...
    99+
    2023-06-30
  • android用户登录功能怎么实现
    要实现Android用户登录功能,可以采取以下步骤:1. 创建一个登录页面,包括用户名和密码的输入框,以及登录按钮。2. 在Main...
    99+
    2023-09-13
    android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作