全文均从网络上总结而来,链接见每个点后。
1、基础
RSA算法非常简单,概述如下:
找两素数p和q
取 n=p*q
取 m=(p-1)*(q-1)
取任何一个数 e,要求满足 e<m 并且 e 与 m 互质(就是最大公因数为1)
取 d 使 d*e%m == 1
这样最终得到三个数: n e d
设消息为数M (M <n),设 c=(M**e)%n 就得到了加密后的消息c;设 m=(c**d)%n 则 m == M,从而完成对c的解密。
注:**表示次方,上面两式中的d和e可以互换。
在对称加密中:
n e 两个数构成公钥,可以告诉别人; n d 两个数构成私钥,d 自己保留,不让任何人知道。
给别人发送的信息使用d加密,只要别人能用e解开就证明信息是由你发送的,构成了签名机制。
别人给你发送信息时使用e加密,这样只有拥有d的你能够对其解密。
rsa的安全性在于对于一个大数n,没有有效的方法能够将其分解。从而在已知n e情况下无法获得d;同样在已知n d情况下无法求得e。
参考:http://www.xfocus.net/articles/200503/778.html
参考:http://zh.wikipedia.org/zh/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95
2、重要点
1. 非对称加密算法中1024 bit密钥的强度相当于对称加密算法80bit密钥的强度。有资料上说以当前的软硬件水平,破解1024bit的RSA加密密文,需要一套10亿美金的系统使用若干十年的时间,所以2015年前,1024bit的还无需太担心暴力破解的危险。
2. 密钥长度增长一倍,公钥操作所需时间增加约4倍,私钥操作所需时间增加约8倍,公私钥生成时间约增长16倍。
3. 一次能加密的密文长度与密钥长度成正比, len_in_byte(raw_data) = len_in_bit(key)/8 -11,如1024bit的密钥,一次能加密的内容长度为 1024/8 -11 = 117 byte。所以非对称加密一般都用于加密对称加密算法的密钥,而不是直接加密内容。
4. 加密后密文的长度为密钥的长度,如密钥长度为1024b(128Byte),最后生成的密文固定为 1024b(128Byte)。
5.With every doubling of the RSA key length, decryption is 6-7 times slower.
6.密钥长度指的是 n 的长度。
参考:http://dustin.javaeye.com/blog/763931
参考:http://www.javamex.com/tutorials/cryptography/rsa_key_length.shtml
3、长度总结
加密时,一次加密,输入的长度限制: len_in_byte(raw_data) = len_in_byte(key)-11;输出的长度固定为:len_in_byte(key)。
签名时,在openssl中,是先把待签名的 str 转换成 DER 编码,再对此编码后的进行 RSA_private_encrypt。由此,一次签名,输入的长度限制: der_in_byte(raw_data_derEncoded) = len_in_byte(key)-11;输出的长度固定为 key(即n) 的长度。
参考:《openssl编程.pdf》(p181 24.4 X509_SIG)
参考:http://topic.csdn.net/u/20090604/20/940b8794-836f-4f9e-95b3-665fddcb13cb.html