получение ошибки «Неверный размер ключа DES. Ключ должен быть ровно 8 байт» при шифровании сообщения в python - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть следующий код Java для кодирования строки с помощью ключа доступа

     public static String encrypt(String message, String passkey) throws Exception {
     final MessageDigest md = MessageDigest.getInstance("SHA-1");
     final byte[] digestOfPassword = md.digest(passkey.getBytes("utf-8"));
     final byte[] keyBytes = ( byte[])resizeArray(digestOfPassword, 24);
     for (int j = 0, k = 16; j < 8;) {
         keyBytes[k++] = keyBytes[j++];
     }

     final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
     final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
     final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
     cipher.init(Cipher.ENCRYPT_MODE, key, iv);

     final byte[] plainTextBytes = message.getBytes("utf-8");
     final byte[] cipherText = cipher.doFinal(plainTextBytes);

     String encryptedString = Base64.encodeBase64String(cipherText);         
     return encryptedString;
 }

Теперь я преобразовал тот же код в Python (Python 2.7), и я попытался, как показано ниже.

     def encrypt(message, passkey):
        hash_object = hashlib.sha1(passkey.encode("utf-8"))
        digested_passkey = hash_object.digest() //hashing
        key24 = "{: <24}".format(digested_passkey) // for resizing the   byte array to size 24  
        import pyDes
        des = pyDes.des(key24);(at this line I m getting the error "Invalid DES key size. Key must be exactly 8 bytes long".
        message = message.encode('utf-8')
        message = message + (16 - len(message) % 16) * chr(16 - len(message) % 16)  // this is for padding
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(des, AES.MODE_CBC, iv) 
        return base64.b64encode(iv + cipher.encrypt(message))

В строке des = pyDes.des (key24) я получаю сообщение об ошибке «Неверный размер ключа DES. Длина ключа должна быть ровно 8 байтов».

Пароль, который я отправил в качестве параметра,"f! 16 * hw $ sda66" Может кто-нибудь, пожалуйста, дайте мне знать, если что-то не так с строкой des = pyDes.des (key24)

1 Ответ

0 голосов
/ 11 декабря 2018

Я думаю, причина того, что вы получаете эту ошибку, состоит в том, что метод инициализации класса ожидает, что ключ будет ровно 8, если что-то еще вызывает ошибку, которую вы видите, это init изкласс, который вы вызываете из pyDes:

# Initialisation
def __init__(self, key, mode=ECB, IV=None, pad=None, padmode=PAD_NORMAL):
    # Sanity checking of arguments.
    if len(key) != 8:
        raise ValueError("Invalid DES key size. Key must be exactly 8 bytes long.")

Если вы сделаете это для отладки:

def encrypt(message, passkey):
hash_object = hashlib.sha1(passkey.encode("utf-8"))
digested_passkey = hash_object.digest() //hashing
key24 = "{: <24}".format(digested_passkey)
print len(key24)

Вы увидите, что длина ключа равна 24, поэтому я думаю, что этоне принимается.

Я могу ошибаться, но на первый взгляд кажется, что проблема.

...