diff --git a/nacl/public.py b/nacl/public.py
index d9e45f70858ce060f32444c301a3a9260c5dd426..36a590d8ca0935a26a087d07f566bac7d0bd4a57 100644
--- a/nacl/public.py
+++ b/nacl/public.py
@@ -108,7 +108,17 @@ class Box(object):
         self._public_key = public_key
         self._private_key = private_key
 
-        self._shared_key = None
+        _shared_key_size = nacl.lib.crypto_box_BEFORENMBYTES
+        _shared_key = nacl.ffi.new("unsigned char[]", _shared_key_size)
+
+        if not nacl.lib.crypto_box_beforenm(
+                    _shared_key,
+                    self._public_key.encode(encoder=encoding.RawEncoder),
+                    self._private_key.encode(encoder=encoding.RawEncoder),
+                ):
+            raise CryptoError("Failed to derive shared key")
+
+        self._shared_key = nacl.ffi.buffer(_shared_key, _shared_key_size)[:]
 
     def encrypt(self, plaintext, nonce, encoder=encoding.RawEncoder):
         """
@@ -136,7 +146,7 @@ class Box(object):
                     padded,
                     len(padded),
                     nonce,
-                    self._beforenm()
+                    self._shared_key,
                 ):
             raise CryptoError("Encryption failed")
 
@@ -170,7 +180,7 @@ class Box(object):
                     padded,
                     len(padded),
                     nonce,
-                    self._beforenm()
+                    self._shared_key,
                 ):
             raise CryptoError(
                         "Decryption failed. Ciphertext failed verification")
@@ -179,21 +189,3 @@ class Box(object):
         plaintext = nacl.ffi.buffer(plaintext, len(padded))[box_zeros:]
 
         return plaintext
-
-    def _beforenm(self):
-        if self._shared_key is not None:
-            return self._shared_key
-
-        sharedkey_size = nacl.lib.crypto_box_BEFORENMBYTES
-
-        k = nacl.ffi.new("unsigned char[]", sharedkey_size)
-
-        if not nacl.lib.crypto_box_beforenm(
-                    k,
-                    self._public_key.encode(encoder=encoding.RawEncoder),
-                    self._private_key.encode(encoder=encoding.RawEncoder),
-                ):
-            raise CryptoError("Failed to derive shared key")
-
-        self._shared_key = nacl.ffi.buffer(k, sharedkey_size)[:]
-        return self._shared_key