We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
FV cipher-text data change during decryption.
## Description
During the decryption process, the ciphertext was soft copied and it changed the ciphertext value during decryption. So we lose the value of ciphertext.
## How to Reproduce
1. Create a ciphertext
2. Decrypt that ciphertext
3. Retry to decrypt the same ciphertext (wrong result)


--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `syft/frameworks/torch/he/fv/decryptor.py`
Content:
```
1 from numpy.polynomial import polynomial as poly
2 
3 
4 from syft.frameworks.torch.he.fv.plaintext import PlainText
5 from syft.frameworks.torch.he.fv.util.operations import get_significant_count
6 from syft.frameworks.torch.he.fv.util.operations import poly_add_mod
7 from syft.frameworks.torch.he.fv.util.operations import poly_mul_mod
8 
9 
10 class Decryptor:
11     """Decrypts Ciphertext objects into Plaintext objects.
12 
13     Args:
14         context (Context): Context for extracting encryption parameters.
15         secret_key: A secret key from same pair of keys(secretkey or publickey) used in encryptor.
16     """
17 
18     def __init__(self, context, secret_key):
19         self._context = context
20         self._coeff_modulus = context.param.coeff_modulus
21         self._coeff_count = context.param.poly_modulus
22         self._secret_key = secret_key.data
23 
24     def decrypt(self, encrypted):
25         """Decrypts the encrypted ciphertext objects.
26 
27         Args:
28             encrypted: A ciphertext object which has to be decrypted.
29 
30         Returns:
31             A PlainText object containing the decrypted result.
32         """
33 
34         # Calculate [c0 + c1 * sk + c2 * sk^2 ...]_q
35         temp_product_modq = self._mul_ct_sk(encrypted.data)
36 
37         # Divide scaling variant using BEHZ FullRNS techniques
38         result = self._context.rns_tool.decrypt_scale_and_round(temp_product_modq)
39 
40         # removing leading zeroes in plaintext representation.
41         plain_coeff_count = get_significant_count(result)
42         return PlainText(result[:plain_coeff_count])
43 
44     def _mul_ct_sk(self, encrypted):
45         """Calculate [c0 + c1 * sk + c2 * sk^2 ...]_q
46 
47         where [c0, c1, ...] represents ciphertext element and sk^n represents
48         secret key raised to the power n.
49 
50         Args:
51             encrypted: A ciphertext object of encrypted data.
52 
53         Returns:
54             A 2-dim list containing result of [c0 + c1 * sk + c2 * sk^2 ...]_q.
55         """
56         phase = encrypted[0]
57 
58         secret_key_array = self._get_sufficient_sk_power(len(encrypted))
59 
60         for j in range(1, len(encrypted)):
61             for i in range(len(self._coeff_modulus)):
62                 phase[i] = poly_add_mod(
63                     poly_mul_mod(
64                         encrypted[j][i], secret_key_array[j - 1][i], self._coeff_modulus[i]
65                     ),
66                     phase[i],
67                     self._coeff_modulus[i],
68                 )
69 
70         return phase
71 
72     def _get_sufficient_sk_power(self, max_power):
73         """Generate an list of secret key polynomial raised to 1...max_power.
74 
75         Args:
76             max_power: heighest power up to which we want to raise secretkey.
77 
78         Returns:
79             A 2-dim list having secretkey powers.
80         """
81         sk_power = [[] for _ in range(max_power)]
82 
83         sk_power[0] = self._secret_key
84 
85         for i in range(2, max_power + 1):
86             for j in range(len(self._coeff_modulus)):
87                 sk_power[i - 1].append(poly.polypow(self._secret_key[j], i).astype(int).tolist())
88         return sk_power
89
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/syft/frameworks/torch/he/fv/decryptor.py b/syft/frameworks/torch/he/fv/decryptor.py
--- a/syft/frameworks/torch/he/fv/decryptor.py
+++ b/syft/frameworks/torch/he/fv/decryptor.py
@@ -1,3 +1,4 @@
+import copy
 from numpy.polynomial import polynomial as poly
 
 
@@ -32,7 +33,7 @@
         """
 
         # Calculate [c0 + c1 * sk + c2 * sk^2 ...]_q
-        temp_product_modq = self._mul_ct_sk(encrypted.data)
+        temp_product_modq = self._mul_ct_sk(copy.deepcopy(encrypted.data))
 
         # Divide scaling variant using BEHZ FullRNS techniques
         result = self._context.rns_tool.decrypt_scale_and_round(temp_product_modq)

{"golden_diff": "diff --git a/syft/frameworks/torch/he/fv/decryptor.py b/syft/frameworks/torch/he/fv/decryptor.py\n--- a/syft/frameworks/torch/he/fv/decryptor.py\n+++ b/syft/frameworks/torch/he/fv/decryptor.py\n@@ -1,3 +1,4 @@\n+import copy\n from numpy.polynomial import polynomial as poly\n \n \n@@ -32,7 +33,7 @@\n         \"\"\"\n \n         # Calculate [c0 + c1 * sk + c2 * sk^2 ...]_q\n-        temp_product_modq = self._mul_ct_sk(encrypted.data)\n+        temp_product_modq = self._mul_ct_sk(copy.deepcopy(encrypted.data))\n \n         # Divide scaling variant using BEHZ FullRNS techniques\n         result = self._context.rns_tool.decrypt_scale_and_round(temp_product_modq)\n", "issue": "FV cipher-text data change during decryption.\n## Description\r\nDuring the decryption process, the ciphertext was soft copied and it changed the ciphertext value during decryption. So we lose the value of ciphertext.\r\n## How to Reproduce\r\n1. Create a ciphertext\r\n2. Decrypt that ciphertext\r\n3. Retry to decrypt the same ciphertext (wrong result)\r\n\n", "before_files": [{"content": "from numpy.polynomial import polynomial as poly\n\n\nfrom syft.frameworks.torch.he.fv.plaintext import PlainText\nfrom syft.frameworks.torch.he.fv.util.operations import get_significant_count\nfrom syft.frameworks.torch.he.fv.util.operations import poly_add_mod\nfrom syft.frameworks.torch.he.fv.util.operations import poly_mul_mod\n\n\nclass Decryptor:\n    \"\"\"Decrypts Ciphertext objects into Plaintext objects.\n\n    Args:\n        context (Context): Context for extracting encryption parameters.\n        secret_key: A secret key from same pair of keys(secretkey or publickey) used in encryptor.\n    \"\"\"\n\n    def __init__(self, context, secret_key):\n        self._context = context\n        self._coeff_modulus = context.param.coeff_modulus\n        self._coeff_count = context.param.poly_modulus\n        self._secret_key = secret_key.data\n\n    def decrypt(self, encrypted):\n        \"\"\"Decrypts the encrypted ciphertext objects.\n\n        Args:\n            encrypted: A ciphertext object which has to be decrypted.\n\n        Returns:\n            A PlainText object containing the decrypted result.\n        \"\"\"\n\n        # Calculate [c0 + c1 * sk + c2 * sk^2 ...]_q\n        temp_product_modq = self._mul_ct_sk(encrypted.data)\n\n        # Divide scaling variant using BEHZ FullRNS techniques\n        result = self._context.rns_tool.decrypt_scale_and_round(temp_product_modq)\n\n        # removing leading zeroes in plaintext representation.\n        plain_coeff_count = get_significant_count(result)\n        return PlainText(result[:plain_coeff_count])\n\n    def _mul_ct_sk(self, encrypted):\n        \"\"\"Calculate [c0 + c1 * sk + c2 * sk^2 ...]_q\n\n        where [c0, c1, ...] represents ciphertext element and sk^n represents\n        secret key raised to the power n.\n\n        Args:\n            encrypted: A ciphertext object of encrypted data.\n\n        Returns:\n            A 2-dim list containing result of [c0 + c1 * sk + c2 * sk^2 ...]_q.\n        \"\"\"\n        phase = encrypted[0]\n\n        secret_key_array = self._get_sufficient_sk_power(len(encrypted))\n\n        for j in range(1, len(encrypted)):\n            for i in range(len(self._coeff_modulus)):\n                phase[i] = poly_add_mod(\n                    poly_mul_mod(\n                        encrypted[j][i], secret_key_array[j - 1][i], self._coeff_modulus[i]\n                    ),\n                    phase[i],\n                    self._coeff_modulus[i],\n                )\n\n        return phase\n\n    def _get_sufficient_sk_power(self, max_power):\n        \"\"\"Generate an list of secret key polynomial raised to 1...max_power.\n\n        Args:\n            max_power: heighest power up to which we want to raise secretkey.\n\n        Returns:\n            A 2-dim list having secretkey powers.\n        \"\"\"\n        sk_power = [[] for _ in range(max_power)]\n\n        sk_power[0] = self._secret_key\n\n        for i in range(2, max_power + 1):\n            for j in range(len(self._coeff_modulus)):\n                sk_power[i - 1].append(poly.polypow(self._secret_key[j], i).astype(int).tolist())\n        return sk_power\n", "path": "syft/frameworks/torch/he/fv/decryptor.py"}], "after_files": [{"content": "import copy\nfrom numpy.polynomial import polynomial as poly\n\n\nfrom syft.frameworks.torch.he.fv.plaintext import PlainText\nfrom syft.frameworks.torch.he.fv.util.operations import get_significant_count\nfrom syft.frameworks.torch.he.fv.util.operations import poly_add_mod\nfrom syft.frameworks.torch.he.fv.util.operations import poly_mul_mod\n\n\nclass Decryptor:\n    \"\"\"Decrypts Ciphertext objects into Plaintext objects.\n\n    Args:\n        context (Context): Context for extracting encryption parameters.\n        secret_key: A secret key from same pair of keys(secretkey or publickey) used in encryptor.\n    \"\"\"\n\n    def __init__(self, context, secret_key):\n        self._context = context\n        self._coeff_modulus = context.param.coeff_modulus\n        self._coeff_count = context.param.poly_modulus\n        self._secret_key = secret_key.data\n\n    def decrypt(self, encrypted):\n        \"\"\"Decrypts the encrypted ciphertext objects.\n\n        Args:\n            encrypted: A ciphertext object which has to be decrypted.\n\n        Returns:\n            A PlainText object containing the decrypted result.\n        \"\"\"\n\n        # Calculate [c0 + c1 * sk + c2 * sk^2 ...]_q\n        temp_product_modq = self._mul_ct_sk(copy.deepcopy(encrypted.data))\n\n        # Divide scaling variant using BEHZ FullRNS techniques\n        result = self._context.rns_tool.decrypt_scale_and_round(temp_product_modq)\n\n        # removing leading zeroes in plaintext representation.\n        plain_coeff_count = get_significant_count(result)\n        return PlainText(result[:plain_coeff_count])\n\n    def _mul_ct_sk(self, encrypted):\n        \"\"\"Calculate [c0 + c1 * sk + c2 * sk^2 ...]_q\n\n        where [c0, c1, ...] represents ciphertext element and sk^n represents\n        secret key raised to the power n.\n\n        Args:\n            encrypted: A ciphertext object of encrypted data.\n\n        Returns:\n            A 2-dim list containing result of [c0 + c1 * sk + c2 * sk^2 ...]_q.\n        \"\"\"\n        phase = encrypted[0]\n\n        secret_key_array = self._get_sufficient_sk_power(len(encrypted))\n\n        for j in range(1, len(encrypted)):\n            for i in range(len(self._coeff_modulus)):\n                phase[i] = poly_add_mod(\n                    poly_mul_mod(\n                        encrypted[j][i], secret_key_array[j - 1][i], self._coeff_modulus[i]\n                    ),\n                    phase[i],\n                    self._coeff_modulus[i],\n                )\n\n        return phase\n\n    def _get_sufficient_sk_power(self, max_power):\n        \"\"\"Generate an list of secret key polynomial raised to 1...max_power.\n\n        Args:\n            max_power: heighest power up to which we want to raise secretkey.\n\n        Returns:\n            A 2-dim list having secretkey powers.\n        \"\"\"\n        sk_power = [[] for _ in range(max_power)]\n\n        sk_power[0] = self._secret_key\n\n        for i in range(2, max_power + 1):\n            for j in range(len(self._coeff_modulus)):\n                sk_power[i - 1].append(poly.polypow(self._secret_key[j], i).astype(int).tolist())\n        return sk_power\n", "path": "syft/frameworks/torch/he/fv/decryptor.py"}]}