Hi Martin, Thank you for the assistance! I am in the process of performing repeated experiments in which I extract the key bits from the ideal/Groebner basis, so reading off the solutions by hand is not ideal for repeated usage or the scenarios in which there are fewer equations than variables and I can't directly extract the key bits without solving for other variables too. I tried to extract the generators from the ideal and construct a polynomial sequence to solve and extract the key bits. I have tried doing this using the solve() function for linear equations, but I can't seem to find a way to specify that the solutions I am looking for are within GF(2).
Additionally, I have run into problems with the groebner_basis() function. For SR(i,1,1,4) the function seems to work correctly for all values of i. However, when I change the array size to even SR(2,2,2,4) the groebner_basis() function won't compute the Groebner basis of the polynomial system, it runs for a while, and aborts with an error message. I run the following: sage: sr = mq.SR(2,2,2,4,gf2=True,polybori=True,allow_zero_inversions=True) sage: R = sr.ring().base_ring() sage: P = sr.vector([R.random_element() for _ in range(sr.r*sr.c*sr.e)]) sage: K = sr.vector([R.random_element() for _ in range(sr.r*sr.c*sr.e)]) sage: C = sr(P, K) sage: F, s = sr.polynomial_system(P=P, C=C) sage: G = F.groebner_basis() And receive the following error: terminate called after throwing an instance of 'polybori::PBoRiError' what(): Built-in matrix-size exceeded! --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) <ipython-input-10-9eabeb133a4e> in <module> ----> 1 G = F.groebner_basis() /opt/sagemath-9.2/local/lib/python3.7/site-packages/sage/rings/polynomial/multi_polynomial_sequence.py in groebner_basis(self, *args, **kwargs) 534 [a, b, d] 535 """ --> 536 return self.ideal().groebner_basis(*args, **kwargs) 537 538 def monomials(self): /opt/sagemath-9.2/local/lib/python3.7/site-packages/sage/rings/polynomial/pbori/pbori.pyx in sage.rings.polynomial.pbori.pbori.BooleanPolynomialIdeal.groebner_basis (build/cythonized/sage/rings/polynomial/pbori/pbori.cpp:42313)() 5095 if "redsb" not in kwds: 5096 kwds["redsb"]=True -> 5097 sig_on() 5098 gb = self._groebner_basis(**kwds) 5099 sig_off() RuntimeError: Aborted Any help with getting past this would be appreciated. Thanks again, Sam On Friday, July 2, 2021 at 8:48:14 AM UTC+1 vesselin....@gmail.com wrote: > Thanks, Martin! > > > A workaround is to look at the linear equations directly and to extract > a solution from it “by hand > > Oh, you mean he can directly look at the ideal and extract the solutions > from there without having to compute the variety? > > For the particular SR(2,1,1,4) example the ideal would be > > sage: I > Ideal (k200, k201, k202 + 1, k203, x200, x201 + 1, x202 + 1, x203, w200, > w201 + 1, w202 + 1, w203 + 1, s100, s101, s102 + 1, s103 + 1, k100 + 1, > k101 + 1, k102 + 1, k103, x100 + 1, x101 + 1, x102 + 1, x103 + 1, w100 + 1, > w101, w102, w103, s000 + 1, s001 + 1, s002, s003, k000 + 1, k001, k002 + 1, > k003) of Boolean PolynomialRing in k200, k201, k202, k203, x200, x201, > x202, x203, w200, w201, w202, w203, s100, s101, s102, s103, k100, k101, > k102, k103, x100, x101, x102, x103, w100, w101, w102, w103, s000, s001, > s002, s003, k000, k001, k002, k003 > > The above are the linear equations you are referring to, right? > > Best, > Vesselin > > On Friday, July 2, 2021 at 12:13:04 AM UTC+1 Martin Albrecht wrote: > >> Hi Vesselin, >> >> Sorry! Name-clash: Sage uses SR for the “Symbolic Ring” and we use >> “mq.SR” for the small scale AES generator. This is what caused Dima’s >> confusion, that’s all. >> >> A workaround is to look at the linear equations directly and to extract a >> solution from it “by hand”, i.e. there’s a bug. >> >> Indeed, the bug is unrelated to PolyBoRi: >> >> sage: R = PolynomialRing(GF(2), 36, "x", order="lex") >> sage: I = Ideal([R.random_element(degree=1, terms=20) for _ in >> range(36)]) >> sage: I.groebner_basis() # bombs out >> RuntimeError: error in Singular function call 'groebner': >> int overflow in hilb 1 >> error occurred in or before standard.lib::stdhilb line 300: ` intvec hi = >> hilb( Id[1],1,W );` >> expected intvec-expression. type 'help intvec;' >> leaving standard.lib::stdhilb (0) >> >> FWIW: >> >> sage: I.groebner_basis(algorithm="singular:std") # works as expected >> >> >> Cheers, >> Martin >> >> Vesselin Velichkov <vesselin....@gmail.com> writes: >> > Hi Martin, >> > >> > Thank you for your reply! >> > >> > By "name clash" do you mean that both mq and BooleanPolynomialRing use >> the >> > same name i.e. "variety" for two different functions? >> > >> > Also, I didn't quite understand your solution -- the call to >> > G.ideal().variety() from your first example still fails on my side with >> the >> > same overflow error. The call to I.variety() in the second example >> succeeds >> > though. >> > >> > Also, what do you mean by reading off the solution directly? How can >> one do >> > that? >> > >> > Thanks again! >> > >> > Best, >> > Vesselin >> > >> > On Thursday, July 1, 2021 at 11:19:07 PM UTC+1 Martin Albrecht wrote: >> > >> >> Hi all, >> >> >> >> I think there’s a name clash here. mq.SR is a thing I wrote ages ago >> for >> >> producing systems of equations for small-scale variants of AES (not >> the >> >> symbolic ring). >> >> >> >> The problem comes from the variety() call and I think Sam did find a >> bug: >> >> >> >> sage: sr = mq.SR(2,1,1,4, gf2=True, polybori=True, >> >> allow_zero_inversions=True) >> >> sage: P = sr.vector([0, 0, 1, 0]) >> >> sage: C = sr.vector([1, 0, 0, 0]) >> >> sage: F,s = sr.polynomial_system(P=P, C=C) >> >> sage: G = F.groebner_basis() # this succeeds >> >> sage: G.ideal().variety() >> >> >> >> More directly: >> >> >> >> sage: B = BooleanPolynomialRing(36, "x") >> >> sage: I = Ideal([B.random_element(degree=1) for _ in range(36)]) >> >> sage: I.variety() >> >> >> >> RuntimeError: error in Singular function call 'groebner': >> >> int overflow in hilb 1 >> >> error occurred in or before standard.lib::stdhilb line 300: ` intvec >> hi = >> >> hilb( Id[1],1,W );` >> >> expected intvec-expression. type 'help intvec;' >> >> leaving standard.lib::stdhilb (0) >> >> leaving standard.lib::groebner (1104) >> >> >> >> @Sam: as a workaround, you can “read off” the solution directly. >> >> >> >> Cheers, >> >> Martin >> >> >> >> Dima Pasechnik <dim...@gmail.com> writes: >> >> > Don't do Groebner bases over SR, use a proper polynomial ring. >> >> > >> >> > On Thu, Jul 1, 2021 at 4:56 PM Sam Ratcliffe >> >> > <samuel.r...@hotmail.co.uk> wrote: >> >> >> >> >> >> I am using the SageMath implementation of SR and wish to recover >> all >> >> solutions to a polynomial system using the variety function for ideals >> as >> >> specified here: >> >> >> https://doc.sagemath.org/html/en/reference/cryptography/sage/crypto/mq/sr.html >> >> >> >> >> >> >> When I run the following (as available on the above link): >> >> >> >> >> >> sage: sr = mq.SR(1,1,1,4, gf2=True, polybori=True) >> >> >> sage: K = sr.base_ring() >> >> >> sage: a = K.gen() >> >> >> sage: K = [a] >> >> >> sage: P = [1] >> >> >> sage: F,s = sr.polynomial_system(P=P, K=K) >> >> >> sage: I = F.ideal() >> >> >> sage: for V in I.variety(): >> >> >> ....: for k,v in sorted(V.items()): ....: print("{} {}".format(k, >> v)) >> >> ....: print("\n") >> >> >> >> >> >> -- >> >> >> You received this message because you are subscribed to the Google >> >> Groups "sage-support" group. >> >> >> To unsubscribe from this group and stop receiving emails from it, >> send >> >> an email to sage-support...@googlegroups.com. >> >> >> To view this discussion on the web visit >> >> >> https://groups.google.com/d/msgid/sage-support/535596c4-8138-4894-b7c0-13293904ee30n%40googlegroups.com >> >> >> . >> >> >> >> >> >> -- >> >> >> >> _pgp: https://keybase.io/martinralbrecht >> >> _www: https://malb.io >> >> _prn: he/him or they/them >> >> >> >> >> >> >> -- >> >> _pgp: https://keybase.io/martinralbrecht >> _www: https://malb.io >> _prn: he/him or they/them >> >> -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-support/83cf75ff-47e4-4113-b97a-7416f6c64f50n%40googlegroups.com.