RSA非对称加密算法解析:密钥、明文及密文长度的约定--以及使用RSA算法实现登录时的前后端的加解密

1、RSA算法基础

RSA算法是一种非对称加密算法,非对称即:加解密用的不是同一个秘钥,它有一对秘钥,分为公钥和私钥。公钥加密,一般是客户端进行处理;私钥解密,一般是后端处理。公钥要暴露给加密方使用,私钥则要藏起来,一般由服务器管理。

1.1关于秘钥长度

一般来说,我们默认使用或常用的秘钥长度值是1024bit位,即1024/8=128byte,目前主流可选值:1024、2048、3072、4096,最小好像是512位,但如果老大就要256位的,也是有解决办法的,参考本文最底部。在使用RSA加密的过程中,显然秘钥长度越长,加密的强度也就越强,同时程序计算的时间也会变长。秘钥长度增加一倍,密钥对生成的时间就增加16倍,公钥加密操作时长增加4倍,私钥解密操作时长增加8倍,所以秘钥长度视情况而定,不宜太大,否则效率低下。

1.2关于明文长度

一般来说,如果我们“定长定量自己可控可理解”的加密(比如下面加密代码),则可以视明文长度=秘钥bit长度值/8-11,比如我下面使用的秘钥长度是1024bit,那么她一次可加密的明文长度就是:1024/8-11=117byte,所以当明文较长时或不确定时,就需要进行分块加密,而每一块就是117byte。

1.3关于密文长度

分段加密后,每一块明文加密后的密文长度=密钥的长度,比如我下面使用的秘钥是 1024bit,那么在此条件下生成的每一块的密文长度1024bit/8=128Byte

所以在加密和解密的过程中都需要判断明文或密文的长度,然后分块进行。RSA加解密对内容的长度是有限制的,如果加密数据过大会抛出如下异常:

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes

2、java实现RSA加解密以及密钥对的生成:

package com.util;

import java.io.ByteArrayOutputStream;
import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;


/**
 * SRA算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值