Android中正确使用Rsa加密算法

1、遇到问题

1.1、情况1

PublicKey对象创建失败

java.security.spec.InvalidKeySpecException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag

在这里插入图片描述

1.2、情况2

转换出现乱码

>%�n+At��gm�X'�o�1>m��WSO~���O<l@��t�U���~-��1D6�~$�|�5O�P���O��:Ӝ�ק�F8\�_��P�J�ޗ�w*�gJS;�O��>��,�G_gt���#��

2、正确的用法

服务端生成publickKey:

	String publicKeyString = (new BASE64Encoder()).encodeBuffer(key);

客服端处理返回的publicKey:

 /**
     * Rsa加密算法公钥加密
     *
     * @param data  要加密的内容
     * @param publicKey 公钥
     * @return byte[]
     * @throws Exception
     */
  public static byte[] encryptByPublicKey(byte[] data, byte[] publicKey) throws Exception {
      // 获取公钥对象
	  X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decode(publicKey, Base64.DEFAULT));
	  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);
  }


	/**
	 *	解密使用PKCS8EncodedKeySpec:
     *  Rsa加密算法私钥解密
     */
    public static byte[] decryptByPrivateKey(byte[] encrypted, byte[] privateKey) throws Exception {
        // 得到私钥对象
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKey, Base64.DEFAULT));
        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;
    }

	//调用方法
 	val rsaUserNameByte = StringUtil.encryptByPublicKey(userName.toByteArray(),publicKey!!.toByteArray())

	//获取加密后的信息
	val rsaUserNameStr = String(Base64.encode(rsaUserNameByte, Base64.DEFAULT))






原创不易,求个关注。

在这里插入图片描述

微信公众号:一粒尘埃的漫旅
里面有很多想对大家说的话,就像和朋友聊聊天。
写代码,做设计,聊生活,聊工作,聊职场。
我见到的世界是什么样子的?
搜索关注我吧。

公众号与博客的内容不同。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值