diff --git a/lib/modules/Crypto/des3.pike b/lib/modules/Crypto/des3.pike
index a62481ea10ae9281f67dc8bc3b49c80b20e640b3..e1d72af22792d0bb15df46c037fedc54d218285c 100644
--- a/lib/modules/Crypto/des3.pike
+++ b/lib/modules/Crypto/des3.pike
@@ -16,21 +16,31 @@ int query_key_size() { return 16; }
 
 int query_block_size() { return 8; }
 
+private array(string) split_key(string key)
+{
+  string k1 = key[..7];
+  string k2 = key[8..15];
+  string k3 = (strlen(key) > 16) ? key[16..] : k1;
+  return ({ k1, k2, k3 });
+}
+
 /* An exception will be raised if key is weak */
 object set_encrypt_key(string key)
 {
-  pipe :: set_encrypt_key(key[..7], key[8..], key[..7]);
+  array(string) keys = split_key(key);
+  pipe :: set_encrypt_key( @ keys);
   /* Switch mode of middle crypto */
-  d[1]->set_decrypt_key(key[8..]);
+  d[1]->set_decrypt_key(keys[1]);
   return this_object();
 }
 
 /* An exception will be raised if key is weak */
 object set_decrypt_key(string key)
 {
-  pipe :: set_decrypt_key(key[..7], key[8..], key[..7]);
+  array(string) keys = split_key(key);
+  pipe :: set_decrypt_key( @ keys);
   /* Switch mode of middle crypto */
-  d[1]->set_encrypt_key(key[8..]);
+  d[1]->set_encrypt_key(keys[1]);
   return this_object();
 }