PythonがJavaインタフェースを呼び出す——データ暗号化解読

4388 ワード

この間pythonプログラムを書きました.httpリクエストとデータの暗号化復号について、やっと完成しました.長い時間を経て、たくさんの穴を埋めましたが、記録して、分かち合う価値があります.最初の文章なので、干物がいっぱいあるはずです.
このニーズの背景には、社内ユーザーと外部ユーザーに分けて、何で区別するかということがあります.もちろん、携帯電話番号で簡単に区別できるので、携帯電話番号で区別することにしました.しかし、携帯電話番号を取得することは会社の上層部にとって、少し安全上の危険性があると思います.保険のためにデータを暗号化して復号する方法は、要求側が要求を送信するときに、公開鍵を送信すると同時に、他のパラメータもあります.相手は公開鍵に基づいて暗号化し、データを返し、要求側は秘密鍵に基づいて復号します.后で他の同僚とこのことを话す时、彼はこのように卵の役に立たないようだと言って、自分で公键を送って、データを受け取って自分で更に解読して、もし他の人がこの方法と伝送のパラメータを知っていたら、彼もデータを得ることができて、私は本当にこのようなことだと感じます.

1、javaインタフェースを呼び出す
2、暗号化を使用するアルゴリズムを確定する
3、セグメント復号
具体的な過程はこうです:1、httpリクエストにとって、比較的簡単で、ネット上で既成の例を見つけることができて、注意しなければならないのはheaderの中の内容を正しく書くことです.Content-type、Accept注意してください.こちらはjson形式のデータを受信しているので、acceptはアプリケーション/jsonで、次は私がネット上で探した例です.

#!/usr/bin/env python
#coding=utf8
 
import httplib, urllib
 
httpClient = None
try:
    params = urllib.urlencode({'name': 'tom', 'age': 22})
    headers = {"Content-type": "application/x-www-form-urlencoded"
                    , "Accept": "text/plain"}
 
    httpClient = httplib.HTTPConnection("localhost", 80, timeout=30)
    httpClient.request("POST", "/test.php", params, headers)
 
    response = httpClient.getresponse()
    print response.status
    print response.reason
    print response.read()
    print response.getheaders() #     
except Exception, e:
    print e
finally:
    if httpClient:
        httpClient.close()


インタフェースがオンであればstatusは200,reasonはOKであり,他のステータスコードが現れたら具体的に解析する.
2、普通はすぐに调通することができて、それから帰ってきたデータを処理します.暗号解読については、ネットで検索してみましたが、pythonについては多くのモジュールが操作できますが、最後にM 2 Cryptoを選択して操作しました.【サーバーpythonバージョンの制限のためか、ローカルでは使えますが、サーバーでは使えません】以前はRSAを使って操作してみましたが、私がインタフェースに伝えるPublicKeyのタイプや長さに問題があり、ずっとデータを返すことができず、インタフェースが受け取るPublicKeyは文字列で、私がRSAで生成したPublickey全体を相手に伝えたことがあり、後で一緒に調整したとき、それぞれのテストでパラメータタイプが一致していないことや、PublicKeyの長さが一致していないことが判明しました.このときパラメータkeyのアルゴリズムが一致しないことによる長さが一致していないのではないかと思いましたが、途中で他のモジュールも交換しましたが失敗し、最後にopensslでPublicKey,PrivateKeyを生成することを選びました.このときのPublicKeyは相手javaが生成した長さと同じで、やっと戻ってきたデータを見ることができました.
次にpythonでopensslを使用して公開鍵と秘密鍵を生成します.
os.system('rm ./privatekey.pem ./publickey.pem')
os.system('openssl genrsa -out ./privatekey.pem')
os.system('openssl rsa -pubout -in ./privatekey.pem -out ./publickey.pem')

しかし、私はやはり喜ぶのが早すぎて、データは戻ってきましたが、まだ解読されていません.復号も頭が痛くて、関数で復号できると思っていたが、結局半日調整した.中にはbase 64で符号化する段階があり、復号の過程にも関与している.だから、私はデータを手に入れてから復号し、復号してから復号します.
               ,json      python       
data = = json.loads(response.read())

base64        ,      ,           
data = base64.b64decode(data)

今すぐ解読できると思いますか?too young too simple、相手がどんなモードで暗号化ブロックを埋めているか知っていますか?つまりpaddingパラメータは何ですか?このパラメータには4つの値があります:no_padding,pkcs1_padding,sslv23_padding,pkcs1_oaep_padding、私が相手に聞く時、相手はぼんやりした顔をして私を見ていて、私は1つずつ試してみるしかありません.どうせ4つですか.試してみるのはpkcs 1_padding、デフォルトはこれかもしれませんが、具体的には深く研究していません.
3、このパラメータを確定した後、人の心を奮い立たせる時で、運行した後にやっと人類が理解できるデータを見ることができて、しかし依然として1つの問題があって、私が1つのパラメータを修正した後に、意外にもまた間違いを報告して、間違いは覚えていないで、どうせデータの比較的に大きい意味で、これは実は復号アルゴリズムの能力を超えて、1024ビットの鍵に対して、暗号化バイトは最長117で、復号バイトは最長128なので、セグメント復号が必要です.次はセグメント解読ですが、このネットでも検索できます.
def decodeSplit(message,clientPriKey):
        """
                   base64   ,      base64      RSA    
       64 key.size/8,     512
       """
        message = base64.b64decode(base64.b64decode(message))
        count = len(message)
        if count>64:
                jiemi=""
                index=0
                while index64 else count-index
                        submsg = message[index:index+i]
                        index+=i
                        j = rsa.decrypt(submsg,clientPriKey)
                        jiemi+=j
                return jiemi
        else:
                jiemi = rsa.decrypt(message,clientPriKey)
                return jiemi

これができたら完全なデータが見えて、やっと成功しました.
以下は参考資料ですが、不完全な可能性がありますので、漏れたらご了承ください.権利侵害があれば、ご連絡ください.
参考資料:1、http://hgoldfish.com/blogs/article/57/2、http://betazk.github.io/2014/10/python%E8%BF%9E%E6%8E%A5.net%E7%AB%AF%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98%E5%9B%9E%E9%A1%BE/3、http://blog.csdn.net/nyist327/article/details/48352253