Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemath
GitHub Repository: sagemath/sagelib
Path: blob/master/sage/crypto/mq/mpolynomialsystemgenerator.py
4069 views
1
"""
2
Abstract base class for generators of MPolynomialSystems.
3
4
AUTHOR:
5
Martin Albrecht <[email protected]>
6
"""
7
8
from sage.structure.sage_object import SageObject
9
10
class MPolynomialSystemGenerator(SageObject):
11
"""
12
Abstract base class for generators of MPolynomialSystems.
13
"""
14
15
def __getattr__(self, attr):
16
"""
17
EXAMPLE::
18
19
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
20
sage: msg = MPolynomialSystemGenerator()
21
sage: msg.R
22
Traceback (most recent call last):
23
...
24
NotImplementedError
25
"""
26
if attr == "R":
27
self.R = self.ring()
28
return self.R
29
else:
30
raise AttributeError("'%s' object has no attribute '%s'"%(self.__class__,attr))
31
32
def varformatstr(self, name):
33
"""
34
Return format string for a given name 'name' which is
35
understood by print et al.
36
37
Such a format string is used to construct variable
38
names. Typically those format strings are somewhat like
39
'name%02d%02d' such that rounds and offset in a block can be
40
encoded.
41
42
INPUT:
43
name -- string
44
45
EXAMPLE::
46
47
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
48
sage: msg = MPolynomialSystemGenerator()
49
sage: msg.varformatstr('K')
50
Traceback (most recent call last):
51
...
52
NotImplementedError
53
"""
54
raise NotImplementedError
55
56
def varstrs(self, name, round):
57
"""
58
Return a list of variable names given a name 'name' and an
59
index 'round'.
60
61
This function is typically used by self._vars.
62
63
INPUT:
64
name -- string
65
round -- integer index
66
67
EXAMPLE::
68
69
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
70
sage: msg = MPolynomialSystemGenerator()
71
sage: msg.varstrs('K', i)
72
Traceback (most recent call last):
73
...
74
NotImplementedError
75
"""
76
raise NotImplementedError
77
78
def vars(self, name, round):
79
"""
80
Return a list of variables given a name 'name' and an
81
index 'round'.
82
83
INPUT:
84
name -- string
85
round -- integer index
86
87
EXAMPLE::
88
89
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
90
sage: msg = MPolynomialSystemGenerator()
91
sage: msg.vars('K',0)
92
Traceback (most recent call last):
93
...
94
NotImplementedError
95
"""
96
raise NotImplementedError
97
98
def ring(self):
99
"""
100
Return the ring in which the system is defined.
101
102
EXAMPLE::
103
104
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
105
sage: msg = MPolynomialSystemGenerator()
106
sage: msg.ring()
107
Traceback (most recent call last):
108
...
109
NotImplementedError
110
"""
111
raise NotImplementedError
112
113
def block_order(self):
114
"""
115
Return a block term ordering for the equation systems
116
generated by self.
117
118
EXAMPLE::
119
120
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
121
sage: msg = MPolynomialSystemGenerator()
122
sage: msg.block_order()
123
Traceback (most recent call last):
124
...
125
NotImplementedError
126
"""
127
raise NotImplementedError
128
129
def __call__(self, P, K):
130
"""
131
Encrypt plaintext P using the key K.
132
133
INPUT:
134
P -- plaintext (vector, list)
135
K -- key (vector, list)
136
137
EXAMPLE::
138
139
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
140
sage: msg = MPolynomialSystemGenerator()
141
sage: msg(None, None)
142
Traceback (most recent call last):
143
...
144
NotImplementedError
145
"""
146
raise NotImplementedError
147
148
def sbox(self):
149
"""
150
Return SBox object for self.
151
152
EXAMPLE::
153
154
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
155
sage: msg = MPolynomialSystemGenerator()
156
sage: msg.sbox()
157
Traceback (most recent call last):
158
...
159
AttributeError: '<class 'sage.crypto.mq.mpolynomialsystemgenerator.MPolynomialSystemGenerator'>' object has no attribute '_sbox'
160
"""
161
return self._sbox
162
163
def polynomial_system(self, P=None, K=None):
164
"""
165
Return a tuple F,s for plaintext P and key K where F is an
166
MPolynomialSystem and s a dictionary which maps key variables
167
to their solutions.
168
169
INPUT:
170
P -- plaintext (vector, list)
171
K -- key (vector, list)
172
173
EXAMPLE::
174
175
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
176
sage: msg = MPolynomialSystemGenerator()
177
sage: msg.polynomial_system()
178
Traceback (most recent call last):
179
...
180
NotImplementedError
181
"""
182
raise NotImplementedError
183
184
def random_element(self):
185
"""
186
Return random element. Usually this is a list of elements in
187
the base field of length 'blocksize'.
188
189
EXAMPLE::
190
191
sage: from sage.crypto.mq.mpolynomialsystemgenerator import MPolynomialSystemGenerator
192
sage: msg = MPolynomialSystemGenerator()
193
sage: msg.random_element()
194
Traceback (most recent call last):
195
...
196
NotImplementedError
197
"""
198
raise NotImplementedError
199
200
201