添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

getting the error "Invalid DES key size. Key must be exactly 8 bytes long" while encrypting message in python

Ask Question

I have the below java code to encode a string with a pass key

     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;

Now I converted the same code into python(Python 2.7), and I tried as below.

     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))

At the line des = pyDes.des(key24), I am getting the error "Invalid DES key size. Key must be exactly 8 bytes long."

The passkey that I sent as parameter is "f!16*hw$sda66" Can anyone please let me know if there is anything wrong with the line des = pyDes.des(key24)

I hope you know "DESede" is Triple DES. That's why the key in the Java version is 24 bytes. – rustyx Dec 11, 2018 at 11:36

I think the reason you are getting this error is because the Class initialisation method is expecting the key to be exactly 8, if it's anything else it raises the error you are seeing, this is the init of the class you are calling from 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.")

If you do this for debugging:

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)

You will see the length of the key is 24, which is why I think it is not being accepted.

I might be wrong but at a quick glance that looks like the issue.

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.