実現したいこと
pythonで作っているスマホアプリから、公開鍵で暗号化されたユーザネーム(bytes型)をbase64でエンコード
↓
bytes型のデータをPHPで作った自作APIへ送る
↓
API側で送られてきたデータを秘密鍵で復号
ということがしたいです。
これまでの取り組み
pythonでurlに暗号化・base64でのエンコードがされていないユーザネーム(str型)をURL+"?username=ユーザネーム"のようにして送り、
サーバ側でGET['username']で取り出し、処理することに成功しました。
python
1 url = "http://192.168.11.69/api/get_id_password.php?username="+input_username 2 json_data = requests.get(url)
しかし、送るユーザネームを暗号化・base64でエンコードした場合、URL(str型)にユーザネーム(bytes型)を連結することができず、渋々str型に変換したらPHP側でbytes型に戻せなくて困っています。
そこで、アプリ側(python)でpayloadを設定してPHPで取り出せるようにしようとしていますが上手くいきません。
該当のソースコード
アプリ側(python)でpayloadを設定してPHPで取り出せるようにしようとしています。
python
1#省略 2#公開鍵での暗号に使用 3from Crypto.PublicKey import RSA 4from Crypto.Cipher import PKCS1_OAEP 5import base64 6#省略 7 with open('public.key', 'rb') as f: 8 public_key = f.read() #.keyファイル読み取り 9 key = RSA.importKey(public_key) 10 cipher_rsa = PKCS1_OAEP.new(key) #公開鍵の読み込み 11 c_username = cipher_rsa.encrypt(input_username.encode()) #暗号化されたバイナリデータ 12 base64_username = base64.b64encode(c_username) 13 14 url = "http://192.168.11.69/api/get_id_password.php" 15 payload = {"username":base64_username} 16 json_data = requests.get(url,payload) 17 if str(json_data) == '<Response [200]>': 18 id = json_data.json()['id'] 19 hashed_password = json_data.json()['password'] 20 #省略
PHP
1 $request_body = file_get_contents('php://input'); 2 $data = json_decode($request_body); 3 if(isset($data["username"])){ 4 $key = file_get_contents('秘密鍵の場所'); 5 openssl_private_decrypt(base64_decode($data['username']), $username, $key); 6 //以後省略
python側のエラー
File "C:\tenko\tenko.kv", line 54, in <module> on_press: app.root.login.check() File "C:\tenko\main.py", line 45, in check id = json_data.json()['id'] File "C:\Users\Owner\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\models.py", line 975, in json raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
教えていただきたいこと
GETでもPOSTでもペイロードでも、どんな方法でもいいのでbytes型のデータをAPIに送る方法を教えてください!!!
補足情報(FW/ツールのバージョンなど)
PHP7.4.26
Python3.10.9
ここから新しく追加
謝辞
この質問と酷似した内容の質問を新たに投稿してしまいました。すみませんでした。
なので、この質問に編集で追記するという形で新たにやったことについての質問の回答を受け付けたいと思います。すみませんでした。
該当のソースコード(GETを使う方法)
送信側(Python)
python
1#省略 2 with open('public.key', 'rb') as f: 3 public_key = f.read() #.keyファイル読み取り 4 key = RSA.importKey(public_key) 5 cipher_rsa = PKCS1_OAEP.new(key) #公開鍵の読み込み 6 c_username = cipher_rsa.encrypt(input_username.encode()) #暗号化されたバイナリデータ 7 base64_username = base64.b64encode(c_username) 8 str_username = base64_username.decode('utf-8') 9 10 url = "http://192.168.11.69/api/get_id_password.php?username="+str_username 11 url_text = open('url.txt', 'w') #手動でアクセスできるようにURLを保存 12 url_text.write(url) 13 url_text.close() 14 json_data = requests.get(url) 15 print(json_data) 16 if str(json_data) == '<Response [200]>': 17 id = json_data.json()['id']
送信側エラー(Python)
on_press: app.root.login.check() File "C:\tenko\main.py", line 49, in check id = json_data.json()['id'] File "C:\Users\Owner\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\models.py", line 975, in json raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
受信側(PHP)
PHP
1//省略 2 if(isset($_GET["username"])){ 3 var_dump($_GET["username"]); 4 $replaced = str_replace(' ', '+', $_GET['username']); 5 var_dump($replaced); 6 var_dump(base64_decode($replaced )); 7 $key = file_get_contents('秘密鍵のパス'); 8 openssl_private_decrypt(base64_decode($replaced ), $username, $key); 9 var_dump($username); 10//省略 11$array = [ 'id'=>$data['id'], 'password'=>$data['password'] ]; 12print json_encode($array); 13 }
受信側エラー(PHP)
URL:http://192.168.11.69/api/get_id_password.php?username=T55LIv6zH7GSG6iYzxJszz94kTFKaKGCX/A7HoiGJg0HS7qv6uLK4t06iMdrNdQ9wNr/SkYo+Fkn7j8hrkMFqlZ7FbqeKHJTJj92EY+bjC5T+gcW9DmOl2DYNa11RpZfnKuMsssELhaTqPCGECSBf0u/zfWwJWbql+s+uzhJofTD+VSo2ekmX5Z6saTKUxejFaxkMJ7hvNmZlg1zC7aFPCCTaOFWPLmixdBies5+y4egtBqvE/ANDC9uN+7oojVi2fAs4GiASQgES6QsJSBdWXffGPpG+Vdo7CrLnidBSXlJkPAHbq/W8OoRbjpHgH0B/TfE7jeC3Rjr7bCA1VJSWQ==
※1ファイルに記録したURLを直接ブラウザに貼り付けました。
※2ver_dump()の結果も含まれています
※var_dump($_GET["username"]); string(344) "T55LIv6zH7GSG6iYzxJszz94kTFKaKGCX/A7HoiGJg0HS7qv6uLK4t06iMdrNdQ9wNr/SkYo Fkn7j8hrkMFqlZ7FbqeKHJTJj92EY bjC5T gcW9DmOl2DYNa11RpZfnKuMsssELhaTqPCGECSBf0u/zfWwJWbql s uzhJofTD VSo2ekmX5Z6saTKUxejFaxkMJ7hvNmZlg1zC7aFPCCTaOFWPLmixdBies5 y4egtBqvE/ANDC9uN 7oojVi2fAs4GiASQgES6QsJSBdWXffGPpG Vdo7CrLnidBSXlJkPAHbq/W8OoRbjpHgH0B/TfE7jeC3Rjr7bCA1VJSWQ==" ※var_dump($replaced); string(344) "T55LIv6zH7GSG6iYzxJszz94kTFKaKGCX/A7HoiGJg0HS7qv6uLK4t06iMdrNdQ9wNr/SkYo+Fkn7j8hrkMFqlZ7FbqeKHJTJj92EY+bjC5T+gcW9DmOl2DYNa11RpZfnKuMsssELhaTqPCGECSBf0u/zfWwJWbql+s+uzhJofTD+VSo2ekmX5Z6saTKUxejFaxkMJ7hvNmZlg1zC7aFPCCTaOFWPLmixdBies5+y4egtBqvE/ANDC9uN+7oojVi2fAs4GiASQgES6QsJSBdWXffGPpG+Vdo7CrLnidBSXlJkPAHbq/W8OoRbjpHgH0B/TfE7jeC3Rjr7bCA1VJSWQ==" ※var_dump(base64_decode($replaced )); string(256) "O�K"�������l�?x�1Jh��_�;��& K�������:��k5�=���JF(�Y'�?!�C�V{��(rS&?v���.S��9��`�5�uF�_�����.����$�K����%f��>�8I����T���&_�z���S��d0��ٙ� s��< �h�V<����bz�~ˇ���� /n7��5b��,�h�IK�,% ]Yw��F�Wh�*˞'AIyI��n����n:G�}�7��7�������RRY" ※var_dump($username); NULL <br /> <b>Notice</b>: Trying to access array offset on value of type bool in <b>C:\xampp\htdocs\api\get_id_password.php</b> on line <b>39</b><br /> <br /> <b>Notice</b>: Trying to access array offset on value of type bool in <b>C:\xampp\htdocs\api\get_id_password.php</b> on line <b>39</b><br /> ※print json_encode($array); {"id":null,"password":null}
該当のソースコード(POSTを使う方法)
送信側(python)
python
1 with open('public.key', 'rb') as f: 2 public_key = f.read() #.keyファイル読み取り 3 key = RSA.importKey(public_key) 4 cipher_rsa = PKCS1_OAEP.new(key) #公開鍵の読み込み 5 c_username = cipher_rsa.encrypt(input_username.encode()) #暗号化されたバイナリデータ 6 base64_username = base64.b64encode(c_username) 7 payload = {'username': base64_username} 8 #str_username = base64_username.decode('utf-8') 9 10 url = "http://192.168.11.69/api/get_id_password.php" 11 url_text = open('url.txt', 'w') 12 url_text.write(url) 13 url_text.close() 14 json_data = requests.post(url,payload) 15 print(json_data) 16 if str(json_data) == '<Response [200]>': 17 id = json_data.json()['id']
送信側エラー(python)
File "C:\tenko\main.py", line 50, in check id = json_data.json()['id'] File "C:\Users\Owner\AppData\Local\Programs\Python\Python310\lib\site-packages\requests\models.py", line 975, in json raise RequestsJSONDecodeError(e.msg, e.doc, e.pos) requests.exceptions.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
受信側(PHP)
PHP
1<?php 2 header('Content-Type: application/json; charset=UTF-8'); 3 $request_body = file_get_contents('php://input'); 4 $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN'); 5 $data = json_decode($request_body,true); 6//省略 7 8 if(isset($data["username"])){ 9 10 $key = file_get_contents('秘密鍵のパス'); 11 openssl_private_decrypt(base64_decode($data['username']), $username, $key); 12 13//省略 14 $array = [ 'id'=>$data['id'], 'password'=>$data['password'] ]; 15 print json_encode($array); 16 } 17?>
POSTの時は、PHP側のエラーを見ることができませんでした。(それをする技術がない)
コードが間違っている箇所がございましたら、ばんばん指摘してください。

回答2件
あなたの回答
tips
プレビュー