iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么在Android中利用RSA算法进行加密和解密
  • 364
分享到

怎么在Android中利用RSA算法进行加密和解密

androidrsa 2023-05-30 20:05:36 364人浏览 独家记忆
摘要

这期内容当中小编将会给大家带来有关怎么在Android中利用RSA算法进行加密和解密,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、公钥加密和私钥解密    pu

这期内容当中小编将会给大家带来有关怎么在Android中利用RSA算法进行加密和解密,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一、公钥加密和私钥解密

    public static final String RSA = "RSA";  // public static final String TRANSFORMATioN = "RSA/None/NoPadding";    public static final String TRANSFORMATION = "RSA/None/PKCS1Padding";    public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {    // 得到公钥对象    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);    KeyFactory keyFactory = KeyFactory.getInstance("RSA");    PublicKey pubKey = keyFactory.generatePublic(keySpec);    // 加密数据    Cipher cp = Cipher.getInstance(TRANSFORMATION);    cp.init(Cipher.ENCRYPT_MODE, pubKey);    return cp.doFinal(data);  }    public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception {    // 得到私钥对象    PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);    KeyFactory kf = KeyFactory.getInstance(RSA);    PrivateKey keyPrivate = kf.generatePrivate(keySpec);    // 解密数据    Cipher cp = Cipher.getInstance(TRANSFORMATION);    cp.init(Cipher.DECRYPT_MODE, keyPrivate);    byte[] arr = cp.doFinal(encrypted);    return arr;  }

data是要加密的数据,如果是字符串则getBytes。publicKey是公钥,privateKey是私钥。自定义密钥对测试

  String data = "hello world";  try {    int keyLength = 1024;    //生成密钥对    KeyPair keyPair = RSAUtils.generateRSAKeyPair(keyLength);    //获取公钥    byte[] publicKey = RSAUtils.getPublicKey(keyPair);    //获取私钥    byte[] privateKey = RSAUtils.getPrivateKey(keyPair);        //用公钥加密    byte[] encrypt = RSAUtils.encryptByPublicKey(data.getBytes(), publicKey);    Log.d("TAG", "加密后的数据:" + StringUtils.byteArrayToString(encrypt));        //用私钥解密    byte[] decrypt = RSAUtils.decryptByPrivateKey(encrypt, privateKey);    Log.d("TAG", "解密后的数据:" + new String(decrypt, "utf-8"));  } catch (Exception e) {    e.printStackTrace();  }

怎么在Android中利用RSA算法进行加密和解密

从文件中读取公钥

怎么在Android中利用RSA算法进行加密和解密

String data = "hello world";    //读取公钥文件    String publicKeyString = IOUtils.readAssetsFile(this, "rsa_public_key.pem");    //base64解码    byte[] publicKey = Base64Utils.decodeToBytes(publicKeyString);        try {      //加密      byte[] encrypt = RSAUtils.encryptByPublicKey(data.getBytes(), publicKey);      Log.d("TAG", "加密后的数据:" + StringUtils.byteArrayToString(encrypt));      //     //读取私钥文件//     String privateKeyString = IOUtils.readAssetsFile(this, "rsa_private_key.pem");//     //base64解码//     byte[] privateKey = Base64Utils.decodeToBytes(privateKeyString);//     //解密//     byte[] decrypt = RSAUtils.decryptByPrivateKey(encrypt, privateKey);//     Log.d("TAG", "解密后的数据:" + new String(decrypt, "utf-8"));    } catch (Exception e) {      e.printStackTrace();    }

二、公钥分段加密和私钥分段解密

当加密的数据过长时,会出现javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes的异常。rsa算法规定一次加密的数据不能超过生成密钥对时的keyLength/8-11,keyLength一般是1024个字节,则加密的数据不能超过117个字节

    public static final int DEFAULT_KEY_SIZE = 1024;    public static final int DEFAULT_BUFFERSIZE = (DEFAULT_KEY_SIZE / 8) - 11;    public static final byte[] DEFAULT_SPLIT = "#PART#".getBytes();    public static byte[] encryptByPublicKeyForSpilt(byte[] data, byte[] publicKey) throws Exception{    int dataLen = data.length;    if (dataLen <= DEFAULT_BUFFERSIZE) {      return encryptByPublicKey(data, publicKey);    }    List<Byte> allBytes = new ArrayList<Byte>(2048);    int bufIndex = 0;    int subDataLoop = 0;    byte[] buf = new byte[DEFAULT_BUFFERSIZE];    for (int i = 0; i < dataLen; i++) {      buf[bufIndex] = data[i];      if (++bufIndex == DEFAULT_BUFFERSIZE || i == dataLen - 1) {        subDataLoop++;        if (subDataLoop != 1) {          for (byte b : DEFAULT_SPLIT) {            allBytes.add(b);          }        }        byte[] encryptBytes = encryptByPublicKey(buf, publicKey);        for (byte b : encryptBytes) {          allBytes.add(b);        }        bufIndex = 0;        if (i == dataLen - 1) {          buf = null;        } else {          buf = new byte[Math              .min(DEFAULT_BUFFERSIZE, dataLen - i - 1)];        }      }    }    byte[] bytes = new byte[allBytes.size()];    int i = 0;    for (Byte b : allBytes) {      bytes[i++] = b.byteValue();    }    return bytes;  }    public static byte[] decryptByPrivateKeyForSpilt(byte[] encrypted, byte[] privateKey) throws Exception {    int splitLen = DEFAULT_SPLIT.length;    if (splitLen <= 0) {      return decryptByPrivateKey(encrypted, privateKey);    }    int dataLen = encrypted.length;    List<Byte> allBytes = new ArrayList<Byte>(1024);    int latestStartIndex = 0;    for (int i = 0; i < dataLen; i++) {      byte bt = encrypted[i];      boolean isMatchSplit = false;      if (i == dataLen - 1) {        // 到data的最后了        byte[] part = new byte[dataLen - latestStartIndex];        System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);        byte[] decryptPart = decryptByPrivateKey(part, privateKey);        for (byte b : decryptPart) {          allBytes.add(b);        }        latestStartIndex = i + splitLen;        i = latestStartIndex - 1;      } else if (bt == DEFAULT_SPLIT[0]) {        // 这个是以split[0]开头        if (splitLen > 1) {          if (i + splitLen < dataLen) {            // 没有超出data的范围            for (int j = 1; j < splitLen; j++) {              if (DEFAULT_SPLIT[j] != encrypted[i + j]) {                break;              }              if (j == splitLen - 1) {                // 验证到split的最后一位,都没有break,则表明已经确认是split段                isMatchSplit = true;              }            }          }        } else {          // split只有一位,则已经匹配了          isMatchSplit = true;        }      }      if (isMatchSplit) {        byte[] part = new byte[i - latestStartIndex];        System.arraycopy(encrypted, latestStartIndex, part, 0, part.length);        byte[] decryptPart = decryptByPrivateKey(part, privateKey);        for (byte b : decryptPart) {          allBytes.add(b);        }        latestStartIndex = i + splitLen;        i = latestStartIndex - 1;      }    }    byte[] bytes = new byte[allBytes.size()];    int i = 0;    for (Byte b : allBytes) {      bytes[i++] = b.byteValue();    }    return bytes;  }

测试分段加密和解密

String data = "hello world hello world hello world hello world hello world hello world hello world hello world " +        "hello world hello world hello world hello world hello world hello world hello world hello world hello world " +        "hello world hello world hello world hello world hello world hello world hello world hello world hello world ";    Log.d("TAG", "要加密的数据:" + data + ", 要加密的数据长度:" + data.length());    try {      //分段加密      byte[] encrypt = RSAUtils.encryptByPublicKeyForSpilt(data.getBytes(), publicKey);      Log.d("TAG", "加密后的数据:" + StringUtils.byteArrayToString(encrypt));            //分段解密      byte[] decrypt = RSAUtils.decryptByPrivateKeyForSpilt(encrypt, privateKey);      Log.d("TAG", "解密后的数据:" + new String(decrypt, "utf-8"));    } catch (Exception e) {      e.printStackTrace();    }

三、生成密钥对

怎么在Android中利用RSA算法进行加密和解密

    public static KeyPair generateRSAKeyPair(int keyLength) throws NoSuchAlGorithmException {    KeyPairGenerator kpg = KeyPairGenerator.getInstance(RSA);    kpg.initialize(keyLength);    return kpg.genKeyPair();  }    public static byte[] getPublicKey(KeyPair keyPair) {    RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();    return rsaPublicKey.getEncoded();  }    public static byte[] getPrivateKey(KeyPair keyPair) {    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();    return rsaPrivateKey.getEncoded();  }

生成公钥和私钥后,用base64编码

int keyLength = 1024;    try {      //生成密钥对      KeyPair keyPair = RSAUtils.generateRSAKeyPair(keyLength);      //获取公钥      byte[] publicKey = RSAUtils.getPublicKey(keyPair);      Log.d("TAG", "公钥:" + StringUtils.byteArrayToString(publicKey));      //公钥用base64编码      String encodePublic = Base64Utils.encodeToString(publicKey);      Log.d("TAG", "base64编码的公钥:" + encodePublic);      //获取私钥      byte[] privateKey = RSAUtils.getPrivateKey(keyPair);      Log.d("TAG", "私钥:" + StringUtils.byteArrayToString(privateKey));      //私钥用base64编码      String encodePrivate = Base64Utils.encodeToString(privateKey);      Log.d("TAG", "base64编码的私钥:" + encodePrivate);    } catch (NoSuchAlgorithmException e) {      e.printStackTrace();    }

怎么在Android中利用RSA算法进行加密和解密

上述就是小编为大家分享的怎么在Android中利用RSA算法进行加密和解密了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么在Android中利用RSA算法进行加密和解密

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

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

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

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

下载Word文档
猜你喜欢
  • 怎么在Android中利用RSA算法进行加密和解密
    这期内容当中小编将会给大家带来有关怎么在Android中利用RSA算法进行加密和解密,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、公钥加密和私钥解密    pu...
    99+
    2023-05-30
    android rsa
  • 如何在java中使用RSA算法对密码进行加密与解密
    本篇文章给大家分享的是有关如何在java中使用RSA算法对密码进行加密与解密,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。前言:  RSA是第一个比较完善的公开密钥算...
    99+
    2023-05-31
    java rsa算法 ava
  • 如何在Java中使用RSA加密对密码进行加密解密
    这期内容当中小编将会给大家带来有关如何在Java中使用RSA加密对密码进行加密解密,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。具体如下:public static void ...
    99+
    2023-05-31
    java rsa加密 ava
  • python3中的rsa加密算法怎么用
    今天小编给大家分享一下python3中的rsa加密算法怎么用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:rsa加密,...
    99+
    2023-06-30
  • 怎么利用Python实现RSA加密解密
    这篇文章主要介绍“怎么利用Python实现RSA加密解密”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么利用Python实现RSA加密解密”文章能帮助大家解决问题。RSA加密实验基本流程:一、选取...
    99+
    2023-06-29
  • 国密算法:利用python进行sm4算法的加解密,对称密钥
    本篇利用python中的gmssl库进行sm4算法的加解密演示。 国密算法sm4特点: 密钥长度:16bytes(128bits)分组长度和密钥长度均为128bits;是对称加密算法;分为ecb模式和...
    99+
    2023-09-02
    python 国密算法 sm4算法 对称密钥 gmssl
  • 怎么在PHP中使用RSA非对称加密算法
    本篇文章给大家分享的是有关怎么在PHP中使用RSA非对称加密算法,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言...
    99+
    2023-06-14
  • 利用Python实现RSA加密解密方法实例
    目录前言一、安装模块二、生成密钥对三、加密四、解密五、完整代码总结前言 加密技术在数据安全存储,数据传输中发挥着重要作用,能够保护用户隐私数据安全,防止信息窃取。RSA是一种非对称加...
    99+
    2024-04-02
  • android应用中怎么对视频进行加密与解密
    本篇文章为大家展示了android应用中怎么对视频进行加密与解密,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。MainActivity.javapublic class MainActivity e...
    99+
    2023-05-31
    android roi
  • Thinkphp 6 使用RSA非对称加密算法 对接口加密解密
    后台接口中 经常使用到加密算法 如何使用RSA 非对称加密 对数据进行加密传输 下载RSA 加密算法 php-Rsa算法下载 将下载好的RSA 算法 放入 到 TP6项目根目录下 exten...
    99+
    2023-09-17
    php 算法
  • Vue中怎么使用jsencrypt进行RSA非对称加密
    本篇内容介绍了“Vue中怎么使用jsencrypt进行RSA非对称加密”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下载jsencryptc...
    99+
    2023-06-29
  • 怎么在java中使用Base64进行加密与解密
    怎么在java中使用Base64进行加密与解密?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Base64加密与解密操作package cn.mldn.demo;i...
    99+
    2023-06-14
  • JAVA 如何实现解密RSA算法并使用JS加密
    JAVA 如何实现解密RSA算法并使用JS加密?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JAVA 中解密RSA算法JS加密实例详解有这样一个需求,前端登录的用户名密码,...
    99+
    2023-05-31
    java js加密 rsa算法
  • golang常用加密解密算法总结(AES、DES、RSA、Sha1、MD5)
    目录关于加密解密AESDESRSAMD5Sha1Base64在项目开发过程中,当操作一些用户的隐私信息,诸如密码、帐户密钥等数据时,往往需要加密后可以在网上传输。这时,需要一些高效地...
    99+
    2024-04-02
  • 如何在Python中进行数据加密和解密
    如何在Python中进行数据加密和解密,需要具体代码示例数据加密和解密是信息安全领域中非常重要的概念。在实际应用中,我们经常需要对敏感的数据进行加密保护,以防止未授权的访问和信息泄露。Python是一种功能强大的编程语言,提供了丰富的库和函...
    99+
    2023-10-22
    Python 数据加密 数据解密
  • RSA加密算法如何在java项目中实现
    这篇文章将为大家详细讲解有关RSA加密算法如何在java项目中实现,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、什么是非对称加密加密的密钥与加密的密钥不相同,这样的加密算法称之为非对称加...
    99+
    2023-05-31
    java rsa加密 ava
  • 详解PHP使用非对称加密算法RSA
    目录加密的类型非对称加密算法具体实现1、加密解密的第一步2、PHP的加密解密类库调用demo加密的类型 在日常设计及开发中,为确保数据传输和数据存储的安全,可通过特定的算法,将数据明...
    99+
    2024-04-02
  • C# 使用SHA1算法对密码进行加密
    C#中如何使用SHA1对密码进行加密呢?先声明一下,对于编程小编在这个方面还是个小白,如果小编有说的不对的地方,请各位大佬联系小编,小编好进行修改。好了不说废话了上图。在这里呢小编创...
    99+
    2024-04-02
  • Oracle中怎么进行数据加密和解密操作
    在Oracle中进行数据加密和解密操作通常使用DBMS_CRYPTO包。以下是一个简单的示例,演示如何使用DBMS_CRYPTO包进...
    99+
    2024-04-08
    oracle
  • jmeter接口测试之使用rsa算法加密解密的代码
    本篇介绍jmeter 使用rsa算法进行加密参数 如果测试过程中,部分接口采用了rsa加密算法,我们的jmeter 也是可以直接拿来调用的,不需要开发配合去掉加密代码! 直接上代码 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作