[セットトップ]pythonはaes暗号解読、RSA署名とチェックマーク、RSA暗号解読を実現し、インタフェースを呼び出す


最近の作業ではpythonで呼び出しインタフェースのサンプルコードを実現する必要があり、プロセスは多くの暗号化アルゴリズムに関連しており、共有する価値がある.まず,公開鍵と秘密鍵がどのように生成され,javaプラットフォームと互換性があるかについて,多くの方法を試みた.最終的にopensslコマンドを使用することを決定する前提としてopensslをインストールする必要があり、Cryptoライブラリは公開鍵の秘密鍵ペアを生成するプロセス:秘密鍵を生成する:
openssl genrsa -out rsa_private_key.pem 1024   


秘密鍵に基づいて公開鍵を生成します.
openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout

このときの秘密鍵はそのまま使用できないため、PKCS#8符号化が必要となる
openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt

コマンドには、入力秘密鍵ファイルがrsa_であることが示されています.private_key.pem、出力秘密鍵ファイルpkcs 8_rsa_private_key.pemは、二次暗号化(-nocrypt)を一切採用しない場合に一対の公開鍵と秘密鍵を取得し、相手の公開鍵を取得し、自分の公開鍵のフォーマットで置き換えるだけで使用できます~~グローバル変数を抽出し、管理しやすいようにしたほうがいいです.コードを変更する必要はありません
ファイルGl.py
#!-*- coding:utf-8 -*-  
'''  
Created on 2013-6-15  
  
@author: shangwei  
'''  
'''  
      
'''  
from Crypto.PublicKey import RSA  
'''  
publickey        
privatekey          
'''  
publickey = RSA.importKey(open('rsa_public_key.pem','r').read())  
privatekey=RSA.importKey(open('pkcs8_rsa_private_key.pem','r').read())  
merchantaccount='YB010000000xx'  
URL='xxx.xxx.com' 
    #!-*- coding:utf-8 -*-  
    '''  
    Created on 2013-5-24  
      
    @author: shangwei  
    '''  
    from Crypto import Random  
    from Crypto.Cipher import PKCS1_v1_5  
    from Crypto.Hash import SHA  
    from hashlib import sha1  
    from rsa import key, common, encrypt  
    from urllib import urlencode   
    import base64  
    import hmac  
    from Crypto.PublicKey import RSA  
    import urllib  
    import urllib2  
    import time    
    import json  
    from Crypto.Signature import PKCS1_v1_5 as pk  
    import Gl  
    class MerchantAPI:  
          
        def doPost(self,url,values):  
            '''  
            post    
              URL  
                     
            '''  
            req = urllib2.Request(url)  
            data = urllib.urlencode(values)  
            res = urllib2.urlopen(req, data)  
            ret = res.read()  
            return ret  
      
          
        def doGet(self,url,values):  
            '''  
            get    
              URL  
                     
            '''  
            REQUEST = url + "?" + urllib.urlencode(values)  
            ret = urllib2.urlopen(REQUEST).read()    
            return ret  
            
        @staticmethod  
        def _pkcs7padding(data):  
            """  
                 
            size 16  
            999999999=>9999999997777777  
            """  
            size = AES.block_size  
            count = size - len(data)%size  
            if count:  
                data+=(chr(count)*count)  
            return data  
          
          
      
          
          
        @staticmethod  
        def _depkcs7padding(data):  
            """  
                 
            """  
            newdata = ''   
            for c in data:  
                if ord(c) > AES.block_size:  
                    newdata+=c  
            return newdata  
          
          
        '''  
        aes  base64    
        '''  
        def aes_base64_encrypt(self,data,key):  
              
            """  
            @summary:   
                1. pkcs7padding  
                2. aes encrypt  
                3. base64 encrypt  
            @return:   
                string  
            """  
            cipher = AES.new(key)  
            return base64.b64encode(cipher.encrypt(self._pkcs7padding(data)))  
      
      
        def base64_aes_decrypt(self,data,key):  
            """  
            1. base64 decode  
            2. aes decode  
            3. dpkcs7padding  
            """  
            cipher = AES.new(key)  
            return self._depkcs7padding(cipher.decrypt(base64.b64decode(data)))          
              
        '''  
        rsa    
        '''  
        def rsa_base64_encrypt(self,data,key):  
            '''  
            1. rsa encrypt  
            2. base64 encrypt  
            '''  
            cipher = PKCS1_v1_5.new(key)   
            return base64.b64encode(cipher.encrypt(data))  
          
        '''  
        rsa    
        '''  
        def rsa_base64_decrypt(self,data,key):  
            '''  
            1. base64 decrypt  
            2. rsa decrypt  
                  
              
           key = RSA.importKey(open('privkey.der').read())  
            >>>  
            >>> dsize = SHA.digest_size  
            >>> sentinel = Random.new().read(15+dsize)      # Let's assume that average data length is 15  
            >>>  
            >>> cipher = PKCS1_v1_5.new(key)  
            >>> message = cipher.decrypt(ciphertext, sentinel)  
            >>>  
            >>> digest = SHA.new(message[:-dsize]).digest()  
            >>> if digest==message[-dsize:]:                # Note how we DO NOT look for the sentinel  
            >>>     print "Encryption was correct."  
            >>> else:  
            >>>     print "Encryption was not correct."  
            '''  
            cipher = PKCS1_v1_5.new(key)  
            return cipher.decrypt(base64.b64decode(data), Random.new().read(15+SHA.digest_size))  
              
        '''  
        RSA    
        '''  
        def sign(self,signdata):  
            '''  
            @param signdata:           
            '''  
              
            h=SHA.new(signdata)  
            signer = pk.new(Gl.privatekey)  
            signn=signer.sign(h)  
            signn=base64.b64encode(signn)  
            return  signn  
             
        '''  
        RSA    
          :      ,   The signature is authentic  
                    ,   "The signature is not authentic."  
        '''  
        def checksign(self,rdata):  
              
            signn=base64.b64decode(rdata.pop('sign'))  
            signdata=self.sort(rdata)  
            verifier = pk.new(Gl.publickey)  
            if verifier.verify(SHA.new(signdata), signn):  
                print "The signature is authentic."  
            else:  
                print "The signature is not authentic."  
               
          
              
              
          
        def sort(self,mes):  
            '''  
                 java treemap,  
              key ,        value      
                   
            '''  
            _par = []  
             
            keys=mes.keys()  
            keys.sort()  
            for v in keys:  
                _par.append(str(mes[v]))  
            sep=''  
            message=sep.join(_par)  
            return message  
          
        '''  
                    
        '''  
        def requestprocess(self,mesdata):  
            '''  
                :  
            1、      mes  key     value     signdata  
            2、 signdata       rsa  ,    signn,  base64    
            3、   signn   mesdata       data  
            4、 encryptkey16    data  AES    BASE64,      data  
            5、     publickey encryptkey16     RSA  BASE64  ,      encryptkey  
            '''  
            signdata=self.sort(mesdata)  
            print '             :'+signdata         
            signn=self.sign(signdata)  
      
                
            mesdata['sign']=signn  
            print mesdata  
            encryptkey = '1234567890123456'  
            data=self.aes_base64_encrypt(json.dumps(mesdata),encryptkey)  
          
            print '    data='+data  
            values={}  
            values['merchantaccount']=Gl.merchantaccount  
            values['data']=data  
            values['encryptkey']=self.rsa_base64_encrypt(encryptkey,Gl.publickey)  
            return values  
          
          
        '''  
                      
        '''  
        def result_decrypt(self,result):  
            '''  
            1、     json  data encryptkey   ,        
            2、      encryptkey  RSA  ,      encryptkey。    :rsa_base64_decrypt  
            3、     encryptkey data  AES  。    :base64_aes_decrypt  
            '''  
            result=json.loads(result)  
            kdata=result['data']  
            kencryptkey=result['encryptkey']  
            print '       data='+kdata  
            print '       encryptkey='+kencryptkey  
            cryptkey=self.rsa_base64_decrypt(kencryptkey,Gl.privatekey)  
            print '    encryptkey='+cryptkey  
            rdata=self.base64_aes_decrypt(kdata,cryptkey)  
            print '    data='+rdata  
            return rdata  
         
        def testCreditPayAsync(self):  
            '''  
                     :  
                :openssl genrsa -out rsa_private_key.pem 1024   
                    : openssl rsa -in rsa_private_key.pem -out rsa_public_key.pem -pubout  
                          ,    PKCS#8  :   
            openssl pkcs8 -topk8 -in rsa_private_key.pem -out pkcs8_rsa_private_key.pem -nocrypt  
                         rsa_private_key.pem,       pkcs8_rsa_private_key.pem,         (-nocrypt)   
                :  
            1、      mes  key     value     signdata  
            2、 signdata       rsa  ,    signn,  base64    
            3、   signn   mes       data  
            4、 encryptkey16    data  AES    BASE64,      data  
            5、     publickey encryptkey16     RSA  BASE64  ,      encryptkey  
            6、 merchantaccount,       data,       encryptkey    post   URL  http://xxxx/xxx/api/xxx/xxx/xxx/xxx  
            7、     json  data encryptkey   ,        
            8、      encryptkey  RSA  ,      encryptkey。    :rsa_base64_decrypt  
            9、     encryptkey data  AES  。    :base64_aes_decrypt  
            '''  
            transtime=int(time.time())  
            od=str(random.randint(10, 100000))  
            mesdata={"merchantaccount":Gl.merchantaccount,"cardno":"xxxx758xxxx23xxxx","validthru":"04xx","cvv2":"200","phone":"1581xxxxxxx",  
    "orderid":"33hhkssseef3u"+od,"transtime":transtime,"currency":156,"amount":2,"productcatalog":"1","productname":"","productdesc":"",  
    "userip":"192.168.5.251","identityid":"ee","identitytype":6,"other":"","callbackurl":"http://IP/webtest/callback.do"}  
            values=self.requestprocess(mesdata)  
            url='http://'+Gl.URL+'/xxxx'  
            print url  
            result=self.doPost(url, values)  
            print result  
            rdata=json.loads(self.result_decrypt(result))  
            self.checksign(rdata)  
    if __name__=='__main__':  
        mer=MerchantAPI()  
        mer.testCreditPayAsync()  

知識点:コードをデバッグするときにも小さな問題やテクニックimportに遭遇したとき、同じ名前のクラスがあれば別名をつけることができます.このクラスに方法が見つからないことを伝えるCipher import PKCS1_v1_5,from Crypto.Signature import PKCS1_v1_5 as pk、これは注意が必要です.また、辞書内の一重引用符を二重引用符に変更するには、jsonを使用します.dumpsメソッド