首页 > 解决方案 > 提供了密钥和iv,加密后我得到不同的值,然后是预期的

问题描述

我正在使用的解密代码

from Cryptodome.Cipher import AES
import binascii

data = '48fcbd0c1e1643bd618c010e57142a1e45c7fd5e36374eb1738f5b9ab6b4ce67bfea3e226426d43a2aaf9140eced8547d7a6199bde167a9e20de0a87f5c9a9a34361dce8d1d8c35a00018895c200bedebf24c30c920c134e5f956d1dfd1201abc3410c093adae070d7771bb5f99145351620573e6fff748ee3b260c9c2a483b886f331497c4023eb370ad1f881a4d165bf5cc8eb9e4008529e6ad2b759767c4cd65f764ffd6412fb58ce5914e2a5280024ac353b5d3b69707afe0c2ad138ffa85b712de22fb84ff2276fe360d6f87abc7879c3e592ec36055da14952eb0c1c973d8f55bd4b662593875b29b83be90b2b4f944b1ed036d4d2e3912ab11c42f77444c93e94d953023a27e8dbd24d7df17c27de5f0bf1ad334d833a8fa78d7ffc85179dc1ade4c32ced6bd902e8ddedad7305db5d2d1e33e5d96cb4422b4dc8f9ab6bb1e88685c44f6bfcc97d1d6b59ab96578c443103f5d4ae72b4cf09a87935e217ae9457a37433b97f6ba7700e1c5960cfefd255f0c740259f8e3c0ac8e9bee82b36742f5922d14964015dce9b2a8a014494821a98224811f2649e92d0372603fd569103be7763065bb9bc2a6a08a9f8da0ce1b567028ae41b83a8e2d19f6f98e22290aaca549c25318cd57f85b0dd9fde9c93f9f790b93a3f4f1787c34382b2b3b9190702723a1fd451c0e285b9258bd6e89b6bf3682760b1273c1a5c7781bac7db9c024e981099181b03c8f85ce0accfa4e1448539b1b62733192a8e2cf98741cfc60e13753c4ca55b26a40fdf0616445a9a46428adc0852c5c84d0a3878ee32f3d1b88cf7cf19a58bb69fb3f4cc43baa67012cc1947da6c0253c9cc291cfcc721faf0e3c16e738c52b94308d7c51a6bc929b8b106dfe546066215a84d410644d5bc6a4b5feae10a377ec57ca3ddce6073aa6f7e968ef97ac1e52a449c1290aa06442e8c15e0aef8d75a6348a3be2869fd90a944867ea7779c01530f73170adf5509fbf3600825758f85372afedb56'
key = '24305c3a354951afe96d1800ad9299bf'
iv = 'heF9BATUfWuISyO8'
data = binascii.unhexlify(data)
decrypter = AES.new(key, AES.MODE_CBC, iv)

plaintext = decrypter.decrypt(data)
print plaintext

加密代码

from Cryptodome.Cipher import AES
import binascii

BS = 16


def pad(s): return s + (BS - len(s) % BS) * chr(BS - len(s) % BS)

key = '24305c3a354951afe96d1800ad9299bf'
iv = 'heF9BATUfWuISyO8'
data = 'wifi&app_name=MLB9Innings17&app_version=21&app_version_name=2.0.2&country_code=in&device_brand=Videocon&device_carrier=Jio+4G&device_cpu_type=armv8l&device_model=V502430&google_aid=b2753f4e-8aad-44dd-b7b6-823923eb5d67&google_ad_tracking_disabled=0&insdate=1495711043&installer=com.android.vending&install_referrer=utm_source%3D%28not+set%29%26utm_medium%3D%28not+set%29&language=en&mat_id=cc92c5ce-b617-4b6a-b1ce-596da5077425&mobile_country_code=405&mobile_network_code=872&os_version=6.0&screen_density=2.0&screen_layout_size=1280x720&sdk_version=3.11.4&conversion_user_agent=Dalvik%2F2.1.0+%28Linux%3B+U%3B+Android+6.0%3B+V502430+Build%2FMRA58K%29&currency_code=USD&revenue=0.0&system_date=1495711261'


data = pad(data)
encrypter = AES.new(key, AES.MODE_CBC, iv)
encryptedData = encrypter.encrypt(data)
print binascii.hexlify(encryptedData)

我的任务是首先解密给定的数据然后对其进行加密,但是即使我使用了类似的密钥和 iv,加密值的输出与解密代码中提供的加密数据也不匹配。

标签: python-2.7encryptionaes

解决方案


使用第一个代码解密会产生以下明文:

connection_type=wifi&app_name=MLB9Innings17&app_version=21&app_version_name=2.0.2&country_code=in&device_brand=Videocon&device_carrier=Jio+4G&device_cpu_type=armv8l&device_model=V502430&google_aid=b2753f4e-8aad-44dd-b7b6-823923eb5d67&google_ad_tracking_disabled=0&insdate=1495711043&installer=com.android.vending&install_referrer=utm_source%3D%28not+set%29%26utm_medium%3D%28not+set%29&language=en&mat_id=cc92c5ce-b617-4b6a-b1ce-596da5077425&mobile_country_code=405&mobile_network_code=872&os_version=6.0&screen_density=2.0&screen_layout_size=1280x720&sdk_version=3.11.4&conversion_user_agent=Dalvik%2F2.1.0+%28Linux%3B+U%3B+Android+6.0%3B+V502430+Build%2FMRA58K%29&currency_code=USD&revenue=0.0&system_date=1495711261

该明文对应于第二个密码,但connection_type=在开头还包含数据,这会影响整个密文,这是现代算法的特征。如果明文显示为十六进制:

636f6e6e656374696f6e5f747970653d77696669266170705f6e616d653d4d4c4239496e6e696e67733137266170705f76657273696f6e3d3231266170705f76657273696f6e5f6e616d653d322e302e3226636f756e7472795f636f64653d696e266465766963655f6272616e643d566964656f636f6e266465766963655f636172726965723d4a696f2b3447266465766963655f6370755f747970653d61726d76386c266465766963655f6d6f64656c3d5635303234333026676f6f676c655f6169643d62323735336634652d386161642d343464642d623762362d38323339323365623564363726676f6f676c655f61645f747261636b696e675f64697361626c65643d3026696e73646174653d3134393537313130343326696e7374616c6c65723d636f6d2e616e64726f69642e76656e64696e6726696e7374616c6c5f72656665727265723d75746d5f736f757263652533442532386e6f742b73657425323925323675746d5f6d656469756d2533442532386e6f742b736574253239266c616e67756167653d656e266d61745f69643d63633932633563652d623631372d346236612d623163652d353936646135303737343235266d6f62696c655f636f756e7472795f636f64653d343035266d6f62696c655f6e6574776f726b5f636f64653d383732266f735f76657273696f6e3d362e302673637265656e5f64656e736974793d322e302673637265656e5f6c61796f75745f73697a653d31323830783732302673646b5f76657273696f6e3d332e31312e3426636f6e76657273696f6e5f757365725f6167656e743d44616c76696b253246322e312e302b2532384c696e75782533422b552533422b416e64726f69642b362e302533422b563530323433302b4275696c642532464d524135384b2532392663757272656e63795f636f64653d55534426726576656e75653d302e302673797374656d5f646174653d313439353731313236312020

您还可以看到它以两个0x20(空格)结尾,即没有使用任何常用的填充,如 PKCS7 或零填充(请注意,PyCryptodome 不会隐式填充和取消填充)。

为了使第二个代码生成第一个代码中使用的密文,您必须connection_type=在第二个代码的明文开头添加两个0x20字节,并且不必使用 PKCS7 填充(即该pad函数不得应用):

from Crypto.Cipher import AES
import binascii

key = '24305c3a354951afe96d1800ad9299bf'
iv = 'heF9BATUfWuISyO8'
data = 'connection_type=wifi&app_name=MLB9Innings17&app_version=21&app_version_name=2.0.2&country_code=in&device_brand=Videocon&device_carrier=Jio+4G&device_cpu_type=armv8l&device_model=V502430&google_aid=b2753f4e-8aad-44dd-b7b6-823923eb5d67&google_ad_tracking_disabled=0&insdate=1495711043&installer=com.android.vending&install_referrer=utm_source%3D%28not+set%29%26utm_medium%3D%28not+set%29&language=en&mat_id=cc92c5ce-b617-4b6a-b1ce-596da5077425&mobile_country_code=405&mobile_network_code=872&os_version=6.0&screen_density=2.0&screen_layout_size=1280x720&sdk_version=3.11.4&conversion_user_agent=Dalvik%2F2.1.0+%28Linux%3B+U%3B+Android+6.0%3B+V502430+Build%2FMRA58K%29&currency_code=USD&revenue=0.0&system_date=1495711261  '

encrypter = AES.new(key, AES.MODE_CBC, iv)
encryptedData = encrypter.encrypt(data)
print binascii.hexlify(encryptedData) # 48fcbd0c1e1643bd618c010e57142a1e45c7fd5e36374eb1738f5b9ab6b4ce67bfea3e226426d43a2aaf9140eced8547d7a6199bde167a9e20de0a87f5c9a9a34361dce8d1d8c35a00018895c200bedebf24c30c920c134e5f956d1dfd1201abc3410c093adae070d7771bb5f99145351620573e6fff748ee3b260c9c2a483b886f331497c4023eb370ad1f881a4d165bf5cc8eb9e4008529e6ad2b759767c4cd65f764ffd6412fb58ce5914e2a5280024ac353b5d3b69707afe0c2ad138ffa85b712de22fb84ff2276fe360d6f87abc7879c3e592ec36055da14952eb0c1c973d8f55bd4b662593875b29b83be90b2b4f944b1ed036d4d2e3912ab11c42f77444c93e94d953023a27e8dbd24d7df17c27de5f0bf1ad334d833a8fa78d7ffc85179dc1ade4c32ced6bd902e8ddedad7305db5d2d1e33e5d96cb4422b4dc8f9ab6bb1e88685c44f6bfcc97d1d6b59ab96578c443103f5d4ae72b4cf09a87935e217ae9457a37433b97f6ba7700e1c5960cfefd255f0c740259f8e3c0ac8e9bee82b36742f5922d14964015dce9b2a8a014494821a98224811f2649e92d0372603fd569103be7763065bb9bc2a6a08a9f8da0ce1b567028ae41b83a8e2d19f6f98e22290aaca549c25318cd57f85b0dd9fde9c93f9f790b93a3f4f1787c34382b2b3b9190702723a1fd451c0e285b9258bd6e89b6bf3682760b1273c1a5c7781bac7db9c024e981099181b03c8f85ce0accfa4e1448539b1b62733192a8e2cf98741cfc60e13753c4ca55b26a40fdf0616445a9a46428adc0852c5c84d0a3878ee32f3d1b88cf7cf19a58bb69fb3f4cc43baa67012cc1947da6c0253c9cc291cfcc721faf0e3c16e738c52b94308d7c51a6bc929b8b106dfe546066215a84d410644d5bc6a4b5feae10a377ec57ca3ddce6073aa6f7e968ef97ac1e52a449c1290aa06442e8c15e0aef8d75a6348a3be2869fd90a944867ea7779c01530f73170adf5509fbf3600825758f85372afedb56

推荐阅读