RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n及e1),(n及e2)就是密钥对。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;
e1和e2可以互换使用,即:
A=B^e2 mod n;B=A^e1 mod n;
补充回答:
对明文进行加密,有两种情况需要这样作:
1、您向朋友传送加密数据,您希望只有您的朋友可以解密,这样的话,您需要首先获取您朋友的密钥对中公开的那一个密钥,e及n。然后用这个密钥进行加密,这样密文只有您的朋友可以解密,因为对应的私钥只有您朋友拥有。
2、您向朋友传送一段数据附加您的数字签名,您需要对您的数据进行MD5之类的运算以取得数据的"指纹",再对"指纹"进行加密,加密将使用您自己的密钥对中的不公开的私钥。您的朋友收到数据后,用同样的运算获得数据指纹,再用您的公钥对加密指纹进行解密,比较解密结果与他自己计算出来的指纹是否一致,即可确定数据是否的确是您发送的、以及在传输过程中是否被篡改。
密钥的获得,通常由某个机构颁发(如CA中心),当然也可以由您自己创建密钥,但这样作,您的密钥并不具有权威性。
计算方面,按公式计算就行了,如果您的加密强度为1024位,则结果会在有效数据前面补0以补齐不足的位数。补入的0并不影响解密运算。
———————————在python中用M2Crypto包实现————————————
这个程序是验证M2Crypto替换POW的效率(时间和内存),结论如下:
Lib Time(500x100 times sign&verify) Mem python used (before threads start) Mem python used (after thread run, threads closed but python doesn't exit)
POW 41s 3.3M - 3.4M 3.9M - 4.0M
M2Crypto0.18 44s 3.3M - 3.4M 3.9M - 4.0M
No RSA, just a+b <1s 3.3M - 3.4M 3.9M - 4.0M
from M2Crypto import BIO, RSA, EVP
import config
import POW
import datetime, threading, time
private_key = """-----BEGIN RSA PRIVATE KEY-----
MIIBPAIBAAJBAMC3aHYeDQNksuWKNd7amAZWvawuyUFOsbEUN4bTWWPC0noozS1o
d3Bal8q8W7SXx1oDihbm90t90HpwV++RFnECAwEAAQJBAKvyeQf6pA3FCUF44bvn
OgFd33oDfJoChtTCfxCS/ozcuFG9mFeKjqxbqTDrBtrX3Stx644iZV/AFZSQoWFP
smkCIQDqeTC6R6cv4VGyvdzbfEHaY0r8hIdpFOQwJt/462giXwIhANJozqGUq5TG
LcJz4wNVWZgn6FJPjCbxrM4Oaqr+GJkvAiAJOES7PnALiO+eeKrDkqpAPSFItqlg
b2rdndm2vwL0PwIhALHsAl7MEtM5SdSWni5ha+OoS2He9kqwLkoIEtcJCs/tAiEA
qIPk7tyVeR8JlTSUiFTus1JjYDmKObJ+ZyfeJucO3No=
-----END RSA PRIVATE KEY-----"""
public_key = """-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMC3aHYeDQNksuWKNd7amAZWvawuyUFO
sbEUN4bTWWPC0noozS1od3Bal8q8W7SXx1oDihbm90t90HpwV++RFnECAwEAAQ==
-----END PUBLIC KEY-----"""
data = "12dfuilfalfjadoighaiwlhtfalihsalkahjflkajgaklaklhalfhawklfhawkfasdaksjlhawifhyawiofhawifhquioghaeughautguoqhfaiofghaiourthq3iothfioahaiwofhawiorhawiofahfioadfhadwiofuawiofaiofhaiofhasdiofhasifhifhifhasdkljfhsadklfasdhashfilsahffhasdkfasdfj;asdfjdas;klfjnsdklnsadklfnsdklfhadl;fsj;lasjf;lkdfjdsa;klfjdlkfjdkfjds;lafhaofhawifwaqfniowfnwafldsaknfdaslkfndaklfjiojioajfaiopfnaklfnaklnfklanfalkfnklanklfdnlakfnklafnaklfnaklfnsklafnkldafinaigvn0irnifgjhaoihaiofjaoifjoiaje[qtobeornottobethat'saquestionjapfjpiofjapfiajipawjaiopjaproiajlafjasdklfjasdklfjdalfjlaa;fjad;lff'alfjkal;fja'luiopdfxghfxdgfdyuiop[afhdmfn9zfinkbdfrmh;io/ljrpjilnj[RQ"
threads = 500
times = 100
def verify():
rsa = RSA.load_key_string(private_key)
digest = EVP.MessageDigest('sha1')
digest.update(data)
signature = rsa.sign(digest.digest())
rsa_pub = RSA.load_pub_key_bio(BIO.MemoryBuffer(public_key))
digest2 = EVP.MessageDigest('sha1')
digest2.update(data)
if not rsa_pub.verify(digest2.digest(), signature):
raise Exception("Failed!")
def verifyByPOW():
digest = POW.Digest(POW.SHA1_DIGEST)
digest.update(data)
private = POW.pemRead(POW.RSA_PRIVATE_KEY, private_key, 'pass')
signature = private.sign(digest.digest(), POW.SHA1_DIGEST)
public = POW.pemRead(POW.RSA_PUBLIC_KEY, public_key, 'pass')
digest2 = POW.Digest(POW.SHA1_DIGEST)
digest2.update(data)
if not public.verify(signature, digest2.digest(), POW.SHA1_DIGEST):
raise Exception("Failed!")
class ThreadTest(threading.Thread):
def __init__(self, index, times):
threading.Thread.__init__(self)
self.times = times
self.id = index
def run(self):
a = 1478904489
for i in xrange(times):
a += a
verify()
#verifyByPOW()
print "Thread test %s Finished at %s" % (self.id, str(datetime.datetime.now()))
def main():
print ""n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
start = datetime.datetime.now()
for i in xrange(threads):
t = ThreadTest(i, times)
t.start()
time.sleep(300)
end = datetime.datetime.now()
# see the used time between two package
print "total time is %s" % (end - start)
# use linux tools, such as command "top" to see the memory useage before and after the method to see whether M2Crypto
# has momery leak(assume POW has no memory leak problem)
if __name__ == '__main__':
main()
posted on 2007-11-21 11:52
保尔任 阅读(498)
评论(0) 编辑 收藏 所属分类:
Security