版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/good123day/article/details/8523044
1. RSA算法初始化的时候一般要填入密钥长度,在96-1024bits间
密钥长度下限是96bits(12bytes)?
因为加密1byte的明文,需要至少1+11=12bytes长度的密钥,低于下限96bits时,一个byte都加密不了,无意义。
2.明文长度限制
明文长度(bytes) <= 密钥长度(bytes)-11.这样的话,对于上限密钥长度1024bits能加密的明文上限就是117bytes了.
如果明文长度大于那个最大明文长度了,就出现了分片加密,保证每片都别超过密钥长度(bytes)-11即可.
片数=(明文长度(bytes)/(密钥长度(bytes)-11))的整数部分+1,就是不满一片的按一片算
加密的明文长度不能超过RSA密钥的长度-11,比如:
1. 1024位的模长为128,加密时明文长度不能超过(128-11)即117个字节。
2. 2048位的模长为256,加密时明文长度不能超过(256-11)即245个字节
密文的长度:
1. 不分片:密文长度 = 密钥长度
2. 分片: 密文长度 = 密钥长度*分片数量
各种 padding 对输入数据长度的要求:
私钥加密:
RSA_PKCS1_PADDING RSA_size-11
RSA_NO_PADDING RSA_size-0
RSA_X931_PADDING RSA_size-2
公钥加密
RSA_PKCS1_PADDING RSA_size-11
RSA_SSLV23_PADDING RSA_size-11
RSA_X931_PADDING RSA_size-2
RSA_NO_PADDING RSA_size-0
RSA_PKCS1_OAEP_PADDING RSA_size-2 * SHA_DIGEST_LENGTH-2
现在中间件已实现每次可以超出以上明文长度的限制,主要取决于CSP加密接口函数:
BOOL CRYPTFUNC CryptEncrypt(
HCRYPTKEYhKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwBufLen);
该函数的最后一个参数表示接收返回密文的缓冲区长度,该长度根据不同算法有相应的计算方法,如下:
明文长度:DataLen
密文缓冲区长度:dwBufLen(实际应该大于等于该长度)
RAS 1024:
If ( 0 = = DataLen % 117 )
{
dwBufLen= ( DataLen / 117 ) * 128;
}
Else
{
dwBufLen= ( DataLen / 117 + 1 ) * 128;
}
RSA 2048:
If ( 0 = = DataLen % 245)
{
dwBufLen= ( DataLen / 245 ) * 256;
}
Else
{
dwBufLen= (DataLen / 245 + 1) * 256;
}
密钥长度下限是96bits(12bytes)?
因为加密1byte的明文,需要至少1+11=12bytes长度的密钥,低于下限96bits时,一个byte都加密不了,无意义。
2.明文长度限制
明文长度(bytes) <= 密钥长度(bytes)-11.这样的话,对于上限密钥长度1024bits能加密的明文上限就是117bytes了.
如果明文长度大于那个最大明文长度了,就出现了分片加密,保证每片都别超过密钥长度(bytes)-11即可.
片数=(明文长度(bytes)/(密钥长度(bytes)-11))的整数部分+1,就是不满一片的按一片算
加密的明文长度不能超过RSA密钥的长度-11,比如:
1. 1024位的模长为128,加密时明文长度不能超过(128-11)即117个字节。
2. 2048位的模长为256,加密时明文长度不能超过(256-11)即245个字节
密文的长度:
1. 不分片:密文长度 = 密钥长度
2. 分片: 密文长度 = 密钥长度*分片数量
各种 padding 对输入数据长度的要求:
私钥加密:
RSA_PKCS1_PADDING RSA_size-11
RSA_NO_PADDING RSA_size-0
RSA_X931_PADDING RSA_size-2
公钥加密
RSA_PKCS1_PADDING RSA_size-11
RSA_SSLV23_PADDING RSA_size-11
RSA_X931_PADDING RSA_size-2
RSA_NO_PADDING RSA_size-0
RSA_PKCS1_OAEP_PADDING RSA_size-2 * SHA_DIGEST_LENGTH-2
现在中间件已实现每次可以超出以上明文长度的限制,主要取决于CSP加密接口函数:
BOOL CRYPTFUNC CryptEncrypt(
HCRYPTKEYhKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwBufLen);
该函数的最后一个参数表示接收返回密文的缓冲区长度,该长度根据不同算法有相应的计算方法,如下:
明文长度:DataLen
密文缓冲区长度:dwBufLen(实际应该大于等于该长度)
RAS 1024:
If ( 0 = = DataLen % 117 )
{
dwBufLen= ( DataLen / 117 ) * 128;
}
Else
{
dwBufLen= ( DataLen / 117 + 1 ) * 128;
}
RSA 2048:
If ( 0 = = DataLen % 245)
{
dwBufLen= ( DataLen / 245 ) * 256;
}
Else
{
dwBufLen= (DataLen / 245 + 1) * 256;
}