RSA关于加密长度限制的解决办法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RSA关于加密长度限制的解决办法
RSA关于加密长度限制的解决办法
因为rsa采⽤分块进⾏加密的,所以有长度限制.如果加密信息较多,可分段加解密(不建议对⼤量信息rsa加密,效率低效):正常加密情形如下:
public static String encrypt(String source, String publicKey)
throws Exception {
Key key = getPublicKey(publicKey);
/** 得到Cipher对象来实现对源数据的RSA加密 */
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher. ENCRYPT_MODE, key);
byte[] b = source.getBytes();
/** 执⾏加密操作 */
byte[] b1 = cipher.doFinal( b);
return new String(Base64. encodeBase64(b1),"UTF-8");
}
分段加密如下:
public static byte[] encryptByPublicKey( byte[] data, String publicKeyStr) throws Exception
{
PublicKey publicKey = RSAEncrypt.loadPublicKeyByStr(publicKeyStr);
Cipher cipher = null;
// 使⽤默认RSA
cipher = Cipher.getInstance("RSA" );
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
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;
}
即把超过117(加密)和128(解密)长度的原⽂内容分割成多个部分,依次加解密,再合并.
参考下⾯⽂件。