posts - 203,  comments - 45,  trackbacks - 0
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



标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
 
相关链接:
网站导航:




<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

常用链接

留言簿(3)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜