Перенос функции хеширования JavaScript в Python

Я хочу преобразовать приведенную ниже функцию в Python, но предполагаю, что библиотека hashlib/Crypto работает иначе, чем crypto-js:

class captha {
    constructor() {
        this.RECAPTCHA_ENCRYPT_SECRET = CryptoJS.MD5("token"); // Chave secreta como WordArray
        console.info(this.RECAPTCHA_ENCRYPT_SECRET)
    }
    encryptToken(z) {
        return CryptoJS.TripleDES.encrypt(z, this.RECAPTCHA_ENCRYPT_SECRET, {
            mode: CryptoJS.mode.ECB
        }).toString();
    }

}

Я пытался

from Crypto.Hash import MD5

hash_obj = MD5.new(data=b"token")
hash_bytes = hash_obj.digest()


words = [int.from_bytes(hash_bytes[i:i+4], byteorder='little', signed=True) for i in range(0, len(hash_bytes), 4)]
sigBytes = len(hash_bytes)


print("Words:", words)
print("SigBytes:", sigBytes)

но это не сработало.

Каким образом ваш код не работает должным образом? Пожалуйста, подробно опишите конкретную проблему, которую вы наблюдаете, и какие отладки вы сделали. Чтобы узнать больше об этом сообществе и о том, как мы можем вам помочь, начните с тура и прочитайте Как спросить и связанные с ним ресурсы.

David 08.08.2024 19:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
6
1
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код JS не соответствует соглашениям об именах для JavaScript. Вот как я бы реструктурировал код. Это упрощает сравнение с портированной логикой Python ниже.

class Captcha {
  constructor() {
    this.RECAPTCHA_ENCRYPT_SECRET = CryptoJS.MD5("token")
    //console.info(this.RECAPTCHA_ENCRYPT_SECRET)
  }
  encryptToken(z) {
    return CryptoJS.TripleDES.encrypt(z, this.RECAPTCHA_ENCRYPT_SECRET, {
      mode: CryptoJS.mode.ECB
    }).toString()
  }
}

// Main
const token = "foo-bar-baz"
const captcha = new Captcha()
encryptedToken = captcha.encryptToken(token)
console.info(encryptedToken) // HxlKOMQzO4m+JjbWL6/AcA==
<script src = "https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js"></script>

Поскольку вы используете CryptoJS.TripleDES в JS, вам необходимо использовать класс DES3 из пакета Crypto.Cipher (cryptojs). Вам также необходимо убедиться, что вы используете режим электронной кодовой книги (ECB).

Вот эквивалентный порт Python для описанного выше метода шифрования.

import base64

from Crypto.Cipher import DES3
from Crypto.Hash import MD5
from Crypto.Util.Padding import pad

class Captcha:
    def __init__(self):
        self.RECAPTCHA_ENCRYPT_SECRET = MD5.new(b"token").digest()

    def encrypt_token(self, z):
        cipher = DES3.new(self.RECAPTCHA_ENCRYPT_SECRET, DES3.MODE_ECB)
        padded_z = pad(z.encode(), DES3.block_size)
        encrypted_token = cipher.encrypt(padded_z)
        return base64.b64encode(encrypted_token).decode()

if __name__ == "__main__":
    captcha = Captcha()
    token = "foo-bar-baz"
    encrypted_token = captcha.encrypt_token(token)
    print(encrypted_token)  # HxlKOMQzO4m+JjbWL6/AcA==

Другие вопросы по теме