Tweakers, devs en mede hobbyisten,
Voor mijn domotica systeem (IP-symcon) ben ik een poging aan het doen om mijn Ecovacs stofzuiger te integreren. Ik heb hier een mooi voorbeeld voor gevonden in Python (link). Ik heb wel wat ervaring in Python maar dit is de eerste keer dat ik zo diep ga
, Maar tot nu toe gaat het redelijk. Het doel is om uit eindelijk een PHP module te bouwen voor IP-symcon. Maar voorlopig zullen het wat losse functies zijn die ik eerst werkend wil hebben. Met PHP heb ik wat meer ervaring maar op het gebeid van encryptie heb ik mij nog nooit aan gewaagd, ook zal de structuur in mijn code en de terminologie misschien niet altijd zo zijn als het hoort. Ook hier is nog veel te leren.
Ik ben hier net een paar weken mee bezig en ik ben in staat om de login URL zo goed als de reproduceren. Maar, helaas zwicht de API nog niet voor mijn programmeer kunsten...
Mijn vraag:
Wat gaat hier nou eindelijk mis? Mijn verdenking ligt bij de RSA encryptie of the base64 de- en encodeing. Maar, heb ik dit wel goed?
Python wpietri/sucks/__init__.py: regel 202:
PHP dixi/IPSEcovacs/firsttests.php: regel 53:
Gebruikte Library's en Versies:
phpseclib v1.0: http://phpseclib.sourceforge.net/
PHP v5.6
python v3.5.2
Wat ik heb geprobeerd:
- Eerst ben ik begonnen met de public key direct te importeren als als RSA key dit werkte niet... dit bleek via een X509 decryptie wel mogelijk.
- Ik ben wat aan het klooien geweest met de base64 encodeing en decoding (de restantjes staan nog in de functie. Deze gaven niet het gewenste resultaat (vreemd oogende outputs, in iedergeval anders dan de urls die in python krijg)
- Python geeft met de eerste b64decode() een ander resultaat als php dat doet hoewel het de zelfde hexadecimale string (dit is zichtbaar te maken met hex2bin()) is, ziet hij er anders uit:
Python
>>>>
PHP:
>>>>
Heeft dit gevolgen, ik weet het niet....
Met mijn PHP script dat ik nu in elkaar geknutseld heb [linkje]
ben ik in staat om zo goed als gelijke URL te genereren om in te loggen op de API
Hierbij heb ik van class "EcoVacsAPI" de functies __init__(), __sign(), __call_main_api(), md5() en encrypt() door gespit.
Edit:
Deze had ik nog willen toevoegen:
De response van de API, de python geeft een password error maar als ik de gegevens wel goed invul krijg ik netjes een key teurg voor de xmpp communicatie (de volgende stap):
Python: {'msg': '当前密码错误', 'data': None, 'time': 1533632529879, 'code': '1005'}
PHP {"code":"0002","msg":"接口鉴权失败","time":1533627991827}
Met vriendelijke groet,
Martijn
Voor mijn domotica systeem (IP-symcon) ben ik een poging aan het doen om mijn Ecovacs stofzuiger te integreren. Ik heb hier een mooi voorbeeld voor gevonden in Python (link). Ik heb wel wat ervaring in Python maar dit is de eerste keer dat ik zo diep ga
Ik ben hier net een paar weken mee bezig en ik ben in staat om de login URL zo goed als de reproduceren. Maar, helaas zwicht de API nog niet voor mijn programmeer kunsten...
Mijn vraag:
Wat gaat hier nou eindelijk mis? Mijn verdenking ligt bij de RSA encryptie of the base64 de- en encodeing. Maar, heb ik dit wel goed?
Python wpietri/sucks/__init__.py: regel 202:
Python:
202
203
204
205
206
207
208
| def encrypt(text): from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_v1_5 key = RSA.import_key(b64decode(EcoVacsAPI.PUBLIC_KEY)) cipher = PKCS1_v1_5.new(key) result = cipher.encrypt(bytes(text, 'utf8')) return str(b64encode(result), 'utf8') |
PHP dixi/IPSEcovacs/firsttests.php: regel 53:
PHP:
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
| function encrypt($plaintext) { global $key; //$key = base64_decode($key); //$key = bin2hex($key); $x509 = new File_X509(); $x509->loadX509($key); $pkey = $x509->getPublicKey(); $rsa = new Crypt_RSA(); $rsa->loadKey($pkey); $result = $rsa->encrypt($plaintext); //$result = hex2bin($result); $result = base64_encode($result); return $result; } // end of function encryptRSA |
Gebruikte Library's en Versies:
phpseclib v1.0: http://phpseclib.sourceforge.net/
PHP v5.6
python v3.5.2
Wat ik heb geprobeerd:
- Eerst ben ik begonnen met de public key direct te importeren als als RSA key dit werkte niet... dit bleek via een X509 decryptie wel mogelijk.
- Ik ben wat aan het klooien geweest met de base64 encodeing en decoding (de restantjes staan nog in de functie. Deze gaven niet het gewenste resultaat (vreemd oogende outputs, in iedergeval anders dan de urls die in python krijg)
- Python geeft met de eerste b64decode() een ander resultaat als php dat doet hoewel het de zelfde hexadecimale string (dit is zichtbaar te maken met hex2bin()) is, ziet hij er anders uit:
Python
code:
1
2
3
4
5
| from base64 import b64decode, b64encode PUBLIC_KEY = 'MIIB/TCCAWYCCQDJ7TMYJFzqYDANBgkqhkiG9w0BAQUFADBCMQswCQYDVQQGEwJjbjEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMCAXDTE3MDUwOTA1MTkxMFoYDzIxMTcwNDE1MDUxOTEwWjBCMQswCQYDVQQGEwJjbjEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDb8V0OYUGP3Fs63E1gJzJh+7iqeymjFUKJUqSD60nhWReZ+Fg3tZvKKqgNcgl7EGXp1yNifJKUNC/SedFG1IJRh5hBeDMGq0m0RQYDpf9l0umqYURpJ5fmfvH/gjfHe3Eg/NTLm7QEa0a0Il2t3Cyu5jcR4zyK6QEPn1hdIGXB5QIDAQABMA0GCSqGSIb3DQEBBQUAA4GBANhIMT0+IyJa9SU8AEyaWZZmT2KEYrjakuadOvlkn3vFdhpvNpnnXiL+cyWy2oU1Q9MAdCTiOPfXmAQt8zIvP2JC8j6yRTcxJCvBwORDyv/uBtXFxBPEC6MDfzU2gKAaHeeJUWrzRv34qFSaYkYta8canK+PSInylQTjJK9VqmjQ' print(b64decode(PUBLIC_KEY)) |
>>>>
code:
1
| b'0\x82\x01\xfd0\x82\x01f\x02\t\x00\xc9\xed3\x18$\\\xea`0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x05\x05\x000B1\x0b0\t\x06\x03U\x04\x06\x13\x02cn1\x150\x13\x06\x03U\x04\x07\x0c\x0cDefault City1\x1c0\x1a\x06\x03U\x04\n\x0c\x13Default Company Ltd0 \x17\r170509051910Z\x18\x0f21170415051910Z0B1\x0b0\t\x06\x03U\x04\x06\x13\x02cn1\x150\x13\x06\x03U\x04\x07\x0c\x0cDefault City1\x1c0\x1a\x06\x03U\x04\n\x0c\x13Default Company Ltd0\x81\x9f0\r\x06\t*\x86H\x86\xf7\r\x01\x01\x01\x05\x00\x03\x81\x8d\x000\x81\x89\x02\x81\x81\x00\xdb\xf1]\x0eaA\x8f\xdc[:\xdcM`\'2a\xfb\xb8\xaa{)\xa3\x15B\x89R\xa4\x83\xebI\xe1Y\x17\x99\xf8X7\xb5\x9b\xca*\xa8\rr\t{\x10e\xe9\xd7#b|\x92\x944/\xd2y\xd1F\xd4\x82Q\x87\x98Ax3\x06\xabI\xb4E\x06\x03\xa5\xffe\xd2\xe9\xaaaDi\'\x97\xe6~\xf1\xff\x827\xc7{q \xfc\xd4\xcb\x9b\xb4\x04kF\xb4"]\xad\xdc,\xae\xe67\x11\xe3<\x8a\xe9\x01\x0f\x9fX] e\xc1\xe5\x02\x03\x01\x00\x010\r\x06\t*\x86H\x86\xf7\r\x01\x01\x05\x05\x00\x03\x81\x81\x00\xd8H1=>#"Z\xf5%<\x00L\x9aY\x96fOb\x84b\xb8\xda\x92\xe6\x9d:\xf9d\x9f{\xc5v\x1ao6\x99\xe7^"\xfes%\xb2\xda\x855C\xd3\x00t$\xe28\xf7\xd7\x98\x04-\xf32/?bB\xf2>\xb2E71$+\xc1\xc0\xe4C\xca\xff\xee\x06\xd5\xc5\xc4\x13\xc4\x0b\xa3\x03\x7f56\x80\xa0\x1a\x1d\xe7\x89Qj\xf3F\xfd\xf8\xa8T\x9abF-k\xc7\x1a\x9c\xaf\x8fH\x89\xf2\x95\x04\xe3$\xafU\xaah\xd0' |
PHP:
PHP:
1
2
3
4
5
| $PUBLIC_KEY = 'MIIB/TCCAWYCCQDJ7TMYJFzqYDANBgkqhkiG9w0BAQUFADBCMQswCQYDVQQGEwJjbjEVMBMGA1UEBwwMRGVmYXVsdCBDaXR5MRwwGgYDVQQKDBNEZWZhdWx0IENvbXBhbnkgTHRkMCAXDTE3MDUwOTA1$ $echo = base64_decode($PUBLIC_KEY); echo bin2hex($echo); |
>>>>
code:
1
| 308201fd30820166020900c9ed3318245cea60300d06092a864886f70d01010505003042310b300906035504061302636e3115301306035504070c0c44656661756c742043697479311c301a060355040a0c1344656661756c7420436f6d70616e79204c74643020170d3137303530393035313931305a180f32313137303431353035313931305a3042310b300906035504061302636e3115301306035504070c0c44656661756c742043697479311c301a060355040a0c1344656661756c7420436f6d70616e79204c746430819f300d06092a864886f70d010101050003818d0030818902818100dbf15d0e61418fdc5b3adc4d60273261fbb8aa7b29a315428952a483eb49e1591799f85837b59bca2aa80d72097b1065e9d723627c9294342fd279d146d48251879841783306ab49b4450603a5ff65d2e9aa6144692797e67ef1ff8237c77b7120fcd4cb9bb4046b46b4225daddc2caee63711e33c8ae9010f9f585d2065c1e50203010001300d06092a864886f70d010105050003818100d848313d3e23225af5253c004c9a5996664f628462b8da92e69d3af9649f7bc5761a6f3699e75e22fe7325b2da853543d3007424e238f7d798042df3322f3f6242f23eb2453731242bc1c0e443caffee06d5c5c413c40ba3037f353680a01a1de789516af346fdf8a8549a62462d6bc71a9caf8f4889f29504e324af55aa68d0 |
Heeft dit gevolgen, ik weet het niet....
Met mijn PHP script dat ik nu in elkaar geknutseld heb [linkje]
ben ik in staat om zo goed als gelijke URL te genereren om in te loggen op de API
Hierbij heb ik van class "EcoVacsAPI" de functies __init__(), __sign(), __call_main_api(), md5() en encrypt() door gespit.
code:
1
2
| Python output: https://eco-nl-api.ecovacs.com/v1/private/nl/en/d252b60aae03e4123236560e644a2868/i_eco_e/1.3.5/c_googleplay/1/user/login?account=cW5ilB%2Fp59GQvP0BBQtri0GxAg9X3dphBYPeQwaG7CLbZ9hr7pj%2Bb%2B90F2UGeol%2Bb3g12M0e3fFvgXMmsKbmzre3lpU9RkfPzy71Nh6dMkr9Sd0GmWfMXOUWZPsuSZXoTbKS%2BGgNbmxXEmovHjHP36lCkQ5zRPC%2BX6ncZV3ijNI%3D&password=YFC50Ooo%2FIRFUzKxyuchtitM%2FGyWXtBUosoka%2Bs1rvFqTTYTtRunjrwD9uCPJKOhxclA2b4ojn7AqfNaGchjVMTwqcLZOK7sCzGkSzQ605Oi3%2FMhc5Eb9OcwFiPMnuE5x610AzeTBhtDiOuxP1FcRRndozG4XtQE6tYv9QtGa0k%3D&requestId=35d39fec6bb359e4cab2225ca3185d8d&authTimespan=1533632529513&authTimeZone=GMT-8&authAppkey=eJUWrzRv34qFSaYk&authSign=5bd06f0de6ae4a2945381281954ea324 PHP output: https://eco-nl-api.ecovacs.com/v1/private/nl/en/baf5351984bb840fc0007a9a66cba479/i_eco_e/1.3.5/c_googleplay/1/user/login?account=UZP0m7NrlrScwed2SwiSRVl2VVRn3TXcAmHvNZk8mS%2FYhmX3qGI1GZZfkfC4zrXx%2FGtGs%2Fs80HNQ%2ByY3zk1TZAS3q%2BStP8k5PY43SKvIffhNmBBv3SAw47zRSnoJxdHIndzoDB1gjFbnyCscE4Ui2GtsCVdbA8l9TsT2UwvuiZY%3D&password=14itA%2BXJks75hPc12JKFERx2KY9tzMSi%2FfmQoTnvtN%2BW%2BZyfYGAVVAmv7GV4M%2B7TaM5o1iDAJHA1yVdHpGXtOVVpEiDhVZlA2yoi1Xpdksd0AJWFdpMWY%2BWTPfUx524iWphClXDHehXdlxEHkcQ2NU%2BJ7%2BUiWjP4Gu%2Fi2cXsIp8%3D&requestId=baf5351984bb840fc0007a9a66cba479&authTimespan=1533559897000&authTimeZone=GMT-8&authAppkey=eJUWrzRv34qFSaYk&authSign=5e7a0a735ae4d5d29c282b820d62e729 |
Edit:
Deze had ik nog willen toevoegen:
De response van de API, de python geeft een password error maar als ik de gegevens wel goed invul krijg ik netjes een key teurg voor de xmpp communicatie (de volgende stap):
Python: {'msg': '当前密码错误', 'data': None, 'time': 1533632529879, 'code': '1005'}
PHP {"code":"0002","msg":"接口鉴权失败","time":1533627991827}
Met vriendelijke groet,
Martijn
[ Voor 7% gewijzigd door Verwijderd op 07-08-2018 12:07 ]