Android Rsa指数与模加解密遇到的坑

综合技术 简书 (源链)

前言

关于用Rsa 非对称算法进行加解密,处了常规的生成公私钥密钥对外,还有一种方式就是通过指数与模的形式取得公钥或者私钥对象,从而进行加解密计算。

常用加解密情形

android端和服务端是如何使用指数和模进行数据的加解密?

主要有以下几种形式:

A.服务端根据客户端的特殊请求(可以是双方规定的请求每天第一次请求之类的动作)随机动态生成一组加密的公私钥的指数和模,并且将公钥或者私钥的指数和模通过加密的方式传递给客户端(可以是3des-cbc或者其他可靠的加密方式,保障秘钥信息的安全性)。然后客户端每次通讯都用解密后端公钥或者私钥对象进行加解密服务端的数据。

以上所述的场景一般都是用在银联pos端下发主秘钥的情形。

主要流程如下:

image.png

其中1,2个步奏是关键,部分公司 采用的方式都是客户端生成8*N字节的随机数上传给服务端生成公私钥对,客户端就行3des或者des 的cbc模式界面,具体看服务端和客户端的协议

B.请各位补充……….

遇到的坑

当然今天讲的并不是以上的知识点,在这边记录下遇到的坑给那些受到伤害的同行一些参考。

坑:

1.指数和模(这个是16进制的)获取错误。

2.填充方式错误,除了常见的rsa填充还有其他的填充方式,例如:

代码示例

获取公钥对象或者是私有对象,这边代码显示的是获取公钥对象

public static RSAPublicKey getPublicKey(String modulus, String exponent) {
        try {
            BigInteger b1 = new BigInteger(modulus, 16);  //此处为16进制数,模
            BigInteger b2 = new BigInteger(exponent, 16); //此处为16进制数,指数
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);
            return (RSAPublicKey) keyFactory.generatePublic(keySpec);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

公钥解密方式

//加密填充方式,列举常用的3种
  public static final String KEY_ALGORITHM = "RSA";
  public static final String ECB_PKCS1_PADDING = "RSA/ECB/PKCS1Padding";
  public static final String TRANSFORMATION = "RSA/ECB/NoPadding";
public static String decryptByPublicKeyNopadding(String data, String modules, String component)
            throws Exception {
        RSAPublicKey pubKey = RSAUtils.getPublicKey(modules, component);
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        cipher.init(Cipher.DECRYPT_MODE, pubKey);
        byte[] b = cipher.doFinal(Convert.str2Bcd(data));
        return Convert.bcd2Str(mainkey);
    }

遇到的坑主要是这边的填充方式填充错误,由于某种原因服务端的填充方式获取不到,所以只能一个个测试过去。填充方式也是寻求帮助后才找到的,希望对大家有用。

工具类bcd2Str代码(16进制字节数组转字符串)

public static String bcd2Str(byte[] b) {
        char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        StringBuilder sb = new StringBuilder(b.length * 2);
        for (int i = 0; i >> 4)]);
            sb.append(HEX_DIGITS[(b[i] & 0xF)]);
        }
        return sb.toString();
    }

关于怎么创建模和指数

请参考这篇文章:

https://my.oschina.net/mywiki/blog/1613886

您可能感兴趣的

android apk瘦身 瘦身意味了什么呢?人们瘦身味了更好的身体和更匀称的身材。那么app呢?提高下载转化率,用户在无wifi情况下少用流量!据调查:一个应用大小是 20MB ,有很多个潜在用户想要去下载尝试使用,结果有一半的用户嫌弃流量太耗费钱了,太大直接看都不看河在等待下载的过程中就取消下载,用户流失性太大,那么应用的...
采用jsoup爬取妹子图(www.mzitu.com)网站图片... 采用jsoup爬取妹子图(www.mzitu.com)网站图片 效果图 xiaogutu.gif 设计 sheji.png 优缺点 优点:无需自己搭建服务器 缺点:网...
Android Oreo adds Linux kernel reqs, debuts Projec... As Android 8.0 debuts a “Project Treble” update plan, all new Android 8.0 devices must run Linux 4.4 or later. Plus: Oreo and Linux 4.13 beef up secur...
视频控件 JiaoZiVideoPlayer v6.2.9 发布,优化代码... JiaoZiVideoPlayer v6.2.9 已发布,更新内容: 删除 demo 中的 picasso 修复滚动错误 优化代码 其他 bug 修复 JiaoZiVideoPlayer 是一款 Android 视频播放控件,特性如下: ...
Extensible ListListView extensible does not expand... Here is my layout code. When i click on the expandable list view it does not expand. However if i increase the height of list it expands. Is there a w...
简书责编内容来自:简书 (源链) | 更多关于

阅读提示:酷辣虫无法对本内容的真实性提供任何保证,请自行验证并承担相关的风险与后果!
本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » Android Rsa指数与模加解密遇到的坑



专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录