Зашифруйте строку ключом из 56 символов - PullRequest
1 голос
/ 26 мая 2019

У меня есть ключ, который содержит 56 символов.И именно это должно быть одинаковое значение, то есть оно не может укоротить ключ.Этот ключ зашифрован в формате base64.Если есть способ, чтобы ключ был короче, фактическое значение ключа не должно быть изменено.Теперь мне нужно зашифровать строку с помощью алгоритма triple (DES3, pkcs7), используя этот ключ, и отправить его в формате base64.

Позвольте мне подчеркнуть, что ключ используется в качестве идентификатора. И я не могу использовать другой алгоритм.

init_key = "YTAzZTYyNDNiMTljMzg0YzYxY2NhMGU4NjU1ODc2N2FkYTAwMGJiOQ==" 

Мы получили довольно неплохую функцию, направляя друзей,Я буду кодировать это ниже.Но в этой функции ключ был сокращен, чтобы не допустить ошибки.Я прочитал об этом алгоритме, написав ввод 56 байтов или ....

Видимо, этот ключ правильный.Мой метод, вероятно, неверен, или он должен сократить ключ, например, в этом цикле.Потому что тот же ключ используется с кодом PHP следующим образом.

function encrypt_pkcs7 ($str, $key)
    {
        $key = base64_decode($key);
        $cipherText = OpenSSL_encrypt($str, "DES-EDE3", $key, 
        OPENSSL_RAW_DATA);
        return base64_encode($cipherText);
    }

Теперь я прошу вас дать мне рекомендации о том, как решить эту проблему.Может быть, я должен использовать модуль, отличный от DES3.Спасибо за сочувствие ко мне.

def pad(text,pad_size=16):
    text_length = len(text)
    last_block_size = text_length % pad_size
    remaining_space = pad_size - last_block_size

    text = text + '='*remaining_space

    return text

def encrypt_DES3(terminal_id,order_id,amount):
    """

    :param terminal_id: String-for example: EUDuTQrp
    :param order_id: integer- for example: 123456
    :param amount: integer - for example: 60000
    :return: encrypt "terminal_id;oreder_id;integer"
    """
    secret_key_text = "YTAzZTYyND122331"   ## you can only have key of size 16 or 24
    text = terminal_id + ';' + str(order_id) + ';' + str(amount)
    text = pad(text,8)
    cipher = DES3.new(secret_key_text, DES3.MODE_ECB)
    my_export = cipher.encrypt(text)

    return base64.b64encode(my_export)

Но ошибка, которую я продолжаю получать, заключается в следующем.

File "<pyshell#18>", line 1, in <module>
encrypt_DES3('EUDuTQrp',123456,60000)
File "<pyshell#17>", line 17, in encrypt_DES3
cipher = DES3.new(key, DES3.MODE_ECB)
File "/usr/lib/python3/dist-packages/Crypto/Cipher/DES3.py", line 
113, in new
return DES3Cipher(key, *args, **kwargs)
File "/usr/lib/python3/dist-packages/Crypto/Cipher/DES3.py", line 
76, in __init__
blockalgo.BlockAlgo.__init__(self, _DES3, key, *args, **kwargs)
File "/usr/lib/python3/dist-packages/Crypto/Cipher/blockalgo.py", 
line 141, in __init__
self._cipher = factory.new(key, *args, **kwargs)
ValueError: Invalid key size (must be either 16 or 24 bytes long)
...