[セットトップ]pythonはaes暗号解読、RSA署名とチェックマーク、RSA暗号解読を実現し、インタフェースを呼び出す
最近の作業ではpythonで呼び出しインタフェースのサンプルコードを実現する必要があり、プロセスは多くの暗号化アルゴリズムに関連しており、共有する価値がある.まず,公開鍵と秘密鍵がどのように生成され,javaプラットフォームと互換性があるかについて,多くの方法を試みた.最終的にopensslコマンドを使用することを決定する前提としてopensslをインストールする必要があり、Cryptoライブラリは公開鍵の秘密鍵ペアを生成するプロセス:秘密鍵を生成する:
秘密鍵に基づいて公開鍵を生成します.
このときの秘密鍵はそのまま使用できないため、PKCS#8符号化が必要となる
コマンドには、入力秘密鍵ファイルがrsa_であることが示されています.private_key.pem、出力秘密鍵ファイルpkcs 8_rsa_private_key.pemは、二次暗号化(-nocrypt)を一切採用しない場合に一対の公開鍵と秘密鍵を取得し、相手の公開鍵を取得し、自分の公開鍵のフォーマットで置き換えるだけで使用できます~~グローバル変数を抽出し、管理しやすいようにしたほうがいいです.コードを変更する必要はありません
ファイルGl.py
知識点:コードをデバッグするときにも小さな問題やテクニックimportに遭遇したとき、同じ名前のクラスがあれば別名をつけることができます.このクラスに方法が見つからないことを伝えるCipher import PKCS1_v1_5,from Crypto.Signature import PKCS1_v1_5 as pk、これは注意が必要です.また、辞書内の一重引用符を二重引用符に変更するには、jsonを使用します.dumpsメソッド
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メソッド