Abstract 1 Introduction 2 Notation and Basic Facts 3 Main Theorem and Lemma 4 How Theorem 4 follows from Lemma 5 5 Proof of Lemma 5 6 Conclusion and Open Problems References

Time-Space Tradeoffs of Truncation with Preprocessing

Krzysztof Pietrzak ORCID IST, Klosterneuburg, Austria Pengxiang Wang ORCID EPFL, Lausanne, Switzerland
Abstract

Truncation of cryptographic outputs is a technique that was recently introduced in Baldimtsi et al. [2]. The general idea is to try out many inputs to some cryptographic algorithm until the output (e.g. a public-key or some hash value) falls into some sparse set and thus can be compressed: by trying out an expected 2k different inputs one will find an output that starts with k zeros.

Using such truncation one can for example save substantial gas fees on Blockchains where storing values is very expensive. While [2] show that truncation preserves the security of the underlying primitive, they only consider a setting without preprocessing. In this work we show that lower bounds on the time-space tradeoff for inverting random functions and permutations also hold with truncation, except for parameters ranges where the bound fails to hold for “trivial” reasons.

Concretely, it’s known that any algorithm that inverts a random function or permutation with range N making T queries and using S bits of auxiliary input must satisfy STNlogN. This lower bound no longer holds in the truncated setting where one must only invert a challenge from a range of size N/2k, as now one can simply save the replies to all N/2k challenges, which requires S=logNN/2k bits and allows to invert with T=1 query.

We show that with truncation, whenever S is somewhat smaller than the logNN/2k bits required to store the entire truncated function table, the known STNlogN lower bound applies.

Keywords and phrases:
Time-Space Lower Bounds, Blockchains
Copyright and License:
[Uncaptioned image] © Krzysztof Pietrzak and Pengxiang Wang; licensed under Creative Commons License CC-BY 4.0
2012 ACM Subject Classification:
Theory of computation Interactive proof systems
; Theory of computation Cryptographic protocols ; Security and privacy Information-theoretic techniques
Editor:
Niv Gilboa

1 Introduction

1.1 Truncation

In [2] Baldimtsi, Chalkias, Chatzigiannis and Kelkar suggested truncation as a technique to shorten outputs of cryptographic primitives like hash values, signatures or public keys. The technique applies whenever there’s a part of the input that can be chosen arbitrarily, like the randomness in signing and key generation or parts of the input when hashing. The general idea is to simply try out many different inputs until the output lands in some sparse domain, say it starts with Δ zeros, and such an output can be encoded using Δ less bits than a general output.

While the applicability of this technique is limited by the fact that finding an output that starts with Δ zeros will require around 2Δ invocations of the primitive (so e.g., compressing by 20 bits already requires around a million invocations), in [2] interesting applications are identified where this can make a big difference, including in the context of the Ethereum blockchain, where saving a few bits to be stored on-chain can lead to significant savings. We discuss another application to proofs of space as used in the Chia network in the open problems Section 6.

While truncation puts extra burden on the evaluator (say, a signer), there’s no extra cost for the parties that use the output (say, verify the signature). Moreover [2] show that truncation preserves security in the bit security framework of [9]. Informally, a primitive has bit security κ, if every adversary who breaks the security with advantage ϵ must run in time 2κϵ.

1.2 Time-Space Tradeoffs

While the preservation of bit security under truncation gives some confidence in this technique, it only considers a setting without precomputation. Unfortunately, truncation can decrease the security of primitives when the adversary is given some auxiliary input. Let us illustrate this considering the one-wayness of a permutation over n bits, which we’ll denote with f:[N][N] where N=2n. A random permutation f does have n bits of bit security, i.e., given a random y[N], finding x,f(x)=y will require N/2 invocations to f in expectation. But given S bits of advice (that depend on f but not the challenge y), it’s possible to invert f using just T invocations whenever

STNlog(N) (1)

The general idea is to compute and store values x0,xT,x2T, where xi=f(xi1). On challenge y one now applies f until one of the stored xiT values is hit, and then continues to apply f to x(i1)T until one hits y. For functions the best space-time tradeoff are somewhat worse. For random functions an attack with

S2TΘ(N2log(N))

is achieved by Hellman tables [7] or rainbow tables [8]. So, any permutation can be inverted with time and space, e.g. T=SN1/2 while random functions can be inverted with T=SN2/3 (for functions that are not random the existing bounds are somewhat worse [5]).

De, Trevisan and Tulsiani [4] (building on work by Yao [11], Gennaro-Trevisan [6] and Wee [10]) prove that the attack as in eq. (1) is basically optimal as any adversary who inverts a random permutation or function with a range of size N must satisfy

STΩ(N) (2)

Note that the above is seemingly wrong if T=0 or S=0 as one can invert with no space but N queries or NlogN space and no queries. The proof of the lower bound assumes adversary must always query f on its output, so T is at least 1, and S is assumed to be at least logN which is required to store the challenge.

The same lower bound applies for random functions, though note that in this case it’s not matching the upper bound. The actual lower bound is slightly more general showing that STΩ(ϵN) must hold for any adversary who inverts with some probability ϵ, but for this introduction we assume ϵ is some constant.

1.3 Time-Space Tradeoffs with Truncation

Now consider the truncated setting, where we have a random function or permutation f:[N][N], but must only invert it on outputs sampled from some truncated range, say where the first Δ bits are set to zero. We’ll denote this range with [δN] where δ=2Δ.

Now one can store the δN preimages of f on [δN] using S=δNlogN bits, and using this advice, it’s possible to find the preimage x,f(x)=y for any y[δN] without invoking f at all. As outlined above, this means T=1, but it still contradicts the lower-bound from eq. (2) as δNlogNΩ(N) for δo(1/logN).

The main result in this work is Theorem 4, which basically states that the issue just described is the only reason for the lower bound to fail: as long as S is too small to basically store the entire function table of the truncated function, the STΩ(N) lower bound applies. While we state and prove the bound for functions, it can easily be adapted to permutations. We discuss other truncated primitive in the open problems Section 6.

The technical result implying Theorem 4 is stated in Lemma 5. It uses a so-called compression argument: it shows how an adversary that inverts a random function f can be turned into an encoding for the function table of f, where the length of the encoding depends on the space and time efficiency of the adversary. As the function table of a random function is incompressible, as stated in Fact 1, we can derive a lower bound on the space and time complexity of the adversary.

1.4 The Compression Argument

The starting point for proving the Lemma is a proof of the STNlogN lower bound for inverting random functions from [1]. This proof is less elegant than the proof of De et al. from [4], which uses a high level argument about sets, while [1] provide pseudocode of the encoding and argue about the length of its output.

Their encoding is basically Algorithm 1 in this paper for δ=1. It takes as input an adversary 𝒜 who is guaranteed to invert some function f:[N][N] on an ϵ fraction of the range and making no more than T queries.

𝒜 is then invoked on some challenges, and every time 𝒜 inverts a challenge we get one entry in the function table “for free”. With every invocation, 𝒜 can make up to T queries to f, and those queries can later no longer be used as challenges, i.e., we “spoil” up to T of the ϵN challenges with every succesful inversion. Overall we can get 𝒜 to invert something in the order of ϵN/T challenges before running out of unspoiled challenges, and thus get an encoding that is around ϵN/T bits shorter than the function table. As a random function is incompressible, this then implies that the advice used by 𝒜 must be around SϵN/T. That’s how the STΩ(ϵN) lower bound in [1] is proven.

In the truncated setting when δ1, 𝒜 is only guaranteed to invert on an ϵ fraction of the sparse domain [δN], and the above argument would only gives us a SδϵN/T bound.

A key observation is the fact that we get a SϵN/T lower bound even in the truncated case if we assume that not much more than a δ fraction of the queries made by 𝒜 map to the sparse [δN] domain, as then each compressed entry only spoils around δT of the [ϵN] available challenges.

To prove our lemma we now make a case distinction. If for every compressed value we typically do not spoil more than Tg12δT potential challenges, we use the observation above, so in this case we use basically the same argument as in [1].

In the other case the queries made by 𝒜 fall into the sparse [δN] set at least 12 times more often than a random query would. Knowing that the output f(x) on a query x is in [δN] means we can encode it using just logNlog1/δ bits. We will encode the positions of the queries made by 𝒜 that fall into [δN] (there are around ϵδN such queries) and then encode each output using just logNlog1/δ bits. As the queries that fall into [δN] are sufficiently dense (i.e., 12 times denser than a random query would), encoding those positions uses a bit less per entry than the log1/δ bits we save knowing the entry is in [δN]. So overall we save ϵδN bits, and thus for this case can conclude (again using the incompressibility of a random function table) that the space used by 𝒜 must be at least SϵδN.

2 Notation and Basic Facts

We use brackets like (x1,x2,) or {x1,x2,} to denote ordered sets (aka. lists) and unordered sets, respectively. [N] denotes some domain of size N, and for notational convenience we assume N=2n is a power of two and identify [N] with {0,1}n. For some Δn and δ=2Δ, we’ll denote with [δN] some subset of [N] of size δN (the truncated range), say 0Δ{0,1}nΔ, the set of n bits strings that start with Δ zeros, but in principle any subset whose elements can be compressed to (not much more than) nΔ bits will do.

For a function f:[N][M] and a set S[N], we denote with f(S) the set {f(S[1]),,f(S[|S|])}, similarly for a list L[N], f(L) is the list (f(L[1]),,f(L[|L|])).

Randomized adversaries are treated as if they were deterministic. However, this is w.l.o.g. as they are only invoked within encoding/decoding procedures that have access to a shared randomness that can be used to derandomize them.

The following well known fact captures the fact that one cannot compress a random string.

Fact 1 (from [4]).

For any randomized encoding procedure 𝖤𝗇𝖼:{0,1}r×{0,1}n{0,1}m and decoding procedure 𝖣𝖾𝖼:{0,1}r×{0,1}m{0,1}n where

Prx{0,1}n,rU|r|[𝖣𝖾𝖼(r,𝖤𝗇𝖼(r,x))=x]δ

we have mnlog(1/δ)

Fact 2.

If a set X is at least ϵ dense in Y, i.e., XY,|X|ϵ|Y|, and Y is known, then X can be encoded using |X|log(e/ϵ) additional bits.

This fact follows from the inequality (nϵn)(en/ϵn)ϵn, which implies log(nϵn)ϵnlog(e/ϵ). Encoding X can be done by identifying which ϵ|Y| elements to choose from Y.

3 Main Theorem and Lemma

De, Trevisan and Tulsiani [4] show that the simple time-space tradeoff eq. (1) for inverting permutations is basically tight.

Theorem 3 ([4], as stated in [1]).

Fix some ϵ0 and an oracle algorithm 𝒜𝖺𝗎𝗑 that takes an advice string 𝖺𝗎𝗑 of length |𝖺𝗎𝗑|=S and makes at most T oracle queries. If with non-neglibile probability for a random function (or permutation) f:[N][N] there exists a string 𝖺𝗎𝗑 such that

Pry[N][f(𝒜𝖺𝗎𝗑f(y))=y]ϵ

then

TSΩ(ϵN). (3)

In this work we show that this result extends to the case where the challenge comes from a sparse set [δN]

Theorem 4 (main).

Fix some ϵ0 and an oracle algorithm 𝒜𝖺𝗎𝗑 that takes an advice string 𝖺𝗎𝗑 of length |𝖺𝗎𝗑|=S and makes at most T oracle queries. If with non-neglibile probability for a random function (or permutation) f:[N][N] there exists a string 𝖺𝗎𝗑 such that

Pry[δN][f(𝒜𝖺𝗎𝗑f(y))=y]ϵ

then either

SΩ(δϵN)orTSΩ(ϵN). (4)

The theorem is proven using a compression argument as stated in the following lemma.

Lemma 5 (generalized version of a Lemma from [1]).

Let 𝒜𝖺𝗎𝗑,T,S,ϵ and f be as Theorem 4, and assume TδϵN/40. There are randomized encoding and decoding procedures 𝖤𝗇𝖼,𝖣𝖾𝖼 such that if f:[N][N] is a function and for some 𝖺𝗎𝗑,|𝖺𝗎𝗑|=S

Pry[δN][f(𝒜𝖺𝗎𝗑f(y))=y]ϵ

then

PrrU|r|[𝖣𝖾𝖼(r,𝖤𝗇𝖼(r,𝖺𝗎𝗑,f))=f]0.9 (5)

and the length of 𝖤𝗇𝖼(r,𝖺𝗎𝗑,f) is at most

NlogN=|f|ϵδN2Tg+S+log(N) (6)

Moreover for some Tg,1TgT which is defined by the encoding algorithm: if Tg12δT, we can improve the length of the encoding to

NlogN=|f|ϵδN2Tg+S+log(N)δϵN (7)

The Tg above is the average number of f queries that land in the sparse set (i.e., x s.t. f(x)[δN]) that 𝒜𝖺𝗎𝗑f (when invoked by 𝖤𝗇𝖼 as defined by Algorithm 1 below) makes for every value it inverts. As 𝒜 makes at most T queries per challenge we have TgT. For a random query x[N] we have f(x)[δN] with probability δ, so if Tg is significantly larger than δT, this means that the queries made by 𝒜𝖺𝗎𝗑 are special in the sense that they map to [δN] much more often than random queries would. We use this crucial observation for a case distinction, deriving the left or the right hand side of eq. (4), depending on whether Tg is below or above 12δT.

4 How Theorem 4 follows from Lemma 5

4.1 Proof of Thm. 4 if 𝑻𝒈𝟏𝟐𝜹𝑻

If Tg12δT, the theorem follows from Lemma 5 using Fact 1 as follows: assume the function table of f in the lemma is chosen uniformly at random (i.e., x in Fact 1 is a uniform NlogN bit string), then the term in eq. (6) can be lower bounded as

NlogN=|f|ϵδN2Tg+S+log(N)NlogNlog(1/0.9).

Reordering we get

SϵδN2Tglog(N)log(1/0.9)

using our assumption that Tg12δT

SϵN24Tlog(N)log(1/0.9)
TSϵN24Tlog(N)Tlog(1/0.9).

So TSΩ(ϵN) as claimed (on the rhs of eq. (4) in the Theorem). Note that the extra assumption that TϵN/40 in the lemma doesn’t matter, as if it’s not satisfied the theorem is trivially true.

4.2 Proof of Thm. 4 if 𝑻𝒈>𝟏𝟐𝜹𝑻

If Tg>12δT, the theorem again follows from Lemma 5 using Fact 1, i.e., we again assume the function table of f in the lemma is chosen uniformly at random (i.e., x in Fact 1 is a uniform NlogN bit string), and now the term in eq. (7) can be lower bounded as

NlogN=|f|ϵδN2Tg+S+log(N)δϵNNlogNlog(1/0.9).

Note that, as in this case we use eq. (7) rather than eq. (6), we have an extra δϵN term on the lhs. Reordering we get

SϵδN2Tglog(N)log(1/0.9)+δϵN

and thus SΩ(δϵN) as claimed.

5 Proof of Lemma 5

We always assume that if A𝖺𝗎𝗑f(y) outputs some value x, it makes the query f(x) at some point. This is basically w.l.o.g. as we can turn any adversary into one satisfying this by making at most one extra query. If at some point A𝖺𝗎𝗑f(y) makes an oracle query x where f(x)=y, then we also w.l.o.g. assume that right after this query A outputs x and stops.

Algorithm 1 Enc.
Algorithm 2 Dec.

5.1 The Size of the Encoding

We will now upper bound the size of the encoding of G,f(Q),(|q1|,,|q|G||),f([N]{G1Q}) as output in line (15) of the 𝖤𝗇𝖼 algorithm.

Let Tg:=|B|/|G| be the average number of elements we added to the bad set B for every element added to the good set G, then

|G|Nϵδ/2Tg. (8)

To see this we note that when we leave the while loop (see line (8) of the algorithm 𝖤𝗇𝖼) it holds that

|B||J|/2=ϵδN/2 so |G|=|B|/Tg|J|/2Tg=Nϵδ/2Tg (9)
G:

Instead of G we will actually encode the set π1(G)={c1,,c|G|}, from this encoding 𝖣𝖾𝖼 (who gets r, and thus knows π) can then reconstruct G=π(π1(G)). We claim that the elements in c1<c2<<c|G| are whp. at least ϵδ/2 dense in [c|G|] (equivalently, c|G|2|G|/ϵδ). By Fact 2 we can thus encode π1(G) using |G|log(2e/ϵδ)+logN bits (the extra logN bits are used to encode the size of G which is required so decoding later knows how to parse the encoding). To see that the ci’s are ϵδ/2 dense whp. consider line (9) in 𝖤𝗇𝖼 which states c:=min{c>c:yc{JB}}. If we replace JB with J, then the ci’s would be whp. close to ϵδ dense in [N] as JN has size ϵδN and the yi are uniformly random. As |B|<|J|/2, using JB instead of J will decrease the density by at most a factor 2. If we don’t have this density, i.e., c|G|>2|G|/ϵδ, we consider encoding to have failed.

(|q1|,,|q|G||):

Require |G|logT bits as each qiqiT. A more careful argument (using Fact 2 and that the qi are on average at most Tg) requires |G|log(eTg) bits.

f([N]{G1Q}):

Requires (N|G||Q|)logN bits (using that G1Q= and |G1|=|G|).

𝖺𝗎𝗑:

Is S bits long.

f(Q):

This is a list of |Q| elements in [N] and can be encoded using |Q|logN bits, but we’ll encode it with less if Tg is large.

Summing up we get

|𝖤𝗇𝖼(r,𝖺𝗎𝗑,f)|
= |G|log(2e/ϵδ)+logNencoding of G+|Q|logNf(Q)+|G|log(eTg)(|q1|,,|q|G||)+(N|G||Q|)logNf([N]{G1Q})+S𝖺𝗎𝗑
= |G|log(2e2Tg/ϵδ)+(N|G||Q|)logN+|Q|logN+S+logN.

Using the assumption TgTϵδN/40 in the statement of the lemma, which in turn implies log(2e2Tg/ϵδ)log(N)1, we get

|G|(logN1)+(N|G||Q|)logN+|Q|logN+S+logN
= (N|Q|)logN+|Q|log(N)|G|+S+logN
= NlogN|G|+S+logN

Plugging in the bound from eq. (8) for |G| we get

|𝖤𝗇𝖼(r,𝖺𝗎𝗑,f)|NlogNNδϵ2Tg+S+logN

proving eq. (6) in the Lemma.

5.2 Improved bound if 𝑻𝒈>𝟏𝟐𝜹𝑻

We’ll now prove a bound on the length of the encoding as stated in eq. (7) in the lemma. Here we assume that Tg is large, i.e., Tg>12δT. The bound on the length of the encoding improves the expression we got without this assumption, i.e., eq. (6), by δϵN bits. We will achieve this by improving the length of the encoding of f(Q) from the trivial |Q|log(N) to |Q|log(N)δϵN by exploiting the fact that now a large fraction of the elements in f(Q) falls into the sparse set [δN], i.e.,

Claim 6.

If Tg>12δT, f(Q) can be encoded using |Q|logNδϵN bits.

With this claim we can improve eq. (5.1) to (N|Q|)logN+|Q|log(N)|G|+S+logN, which now gives eq. (7) from the Lemma.

It remains to prove the claim. By eq. (8) and eq. (9) |G|δϵN/2Tg, |Q|T|G| and |B|δϵN/2, which implies

|B|/|Q|δϵN/2T|G|Tg/T12δ

I.e., a 12δ fraction of the queries made during decoding falls into B[δN]. Using this with Fact 2 we can encode which of the |B| queries from Q map into B using |B|log(e/12δ) bits. For any xB, we can encode f(x) using log(N)log(1/δ) bits as f(x)[δN].

We can now encode f(Q) by first encoding the positions of B in Q, and then f(B) and f(QB) separately, which requires

(|Q||B|)logN+|B|(log(e/10δ)+log(N)log(1/δ))
= |Q|logN+|B|log(e/12)
|Q|logN|B|2
|Q|logNδϵN

bits as claimed.

6 Conclusion and Open Problems

In this work we showed that the known time-space tradeoff STN for inverting random functions or permutations f:[N][N] also holds for truncated outputs almost up to the point where S is big enough to store the entire truncated function table. This shows that the general idea of truncating cryptographic primitives as suggested in [2] is secure even when preprocessing is considered (as long as the truncated function table is big enough so it can’t be stored in practice).

While in this paper we only considered one-wayness of random functions, we believe that our result can be adapted to time-space lower bounds for other primitives, showing the bounds apply also for their truncated analogues. An interesting example considered in [2] is the discrete logarithm problem, for which a ST2N time-space lower bound is known [3].

A likely more challenging but particularly interesting case is the adaption of the “beyond Hellman” proofs of space from [1] to the truncated setting. The key primitive in [1] are functions [N][N] for which a time-space lower bound of SkTNk (for any constant k) can be proven. This improves on the STN lower bound for “normal” functions, and the reason this doesn’t contradict known upper bounds (by rainbow tables) is the fact that those functions cannot be efficiently evaluated in forward direction (but their entire function table can be computed in time N). A proof that truncation is secure for these functions would allow for better security. Currently those functions are deployed in the proof of space underlying the chia.net blockchain, but there’s a trade-off that farmers (who are supposed to dedicate space analogous to miners dedicating computation in Bitcoin) can make: by dropping a few bits of every entry, they save space at the cost of having to do some extra computation when computing the proofs111https://github.com/Chia-Network/drplotter. One could use a truncated version of those functions, which would make the initialization of the space for the farmers somewhat more costly, but it would make such “bit dropping” attacks much less attractive.

References

  • [1] Hamza Abusalah, Joël Alwen, Bram Cohen, Danylo Khilko, Krzysztof Pietrzak, and Leonid Reyzin. Beyond hellman’s time-memory trade-offs with applications to proofs of space. In Tsuyoshi Takagi and Thomas Peyrin, editors, ASIACRYPT 2017, Part II, volume 10625 of LNCS, pages 357–379. Springer, Heidelberg, December 2017. doi:10.1007/978-3-319-70697-9_13.
  • [2] Foteini Baldimtsi, Konstantinos Chalkias, Panagiotis Chatzigiannis, and Mahimna Kelkar. Truncator: Time-space tradeoff of cryptographic primitives. Cryptology ePrint Archive, Paper 2022/1581, 2022. URL: https://eprint.iacr.org/2022/1581.
  • [3] Henry Corrigan-Gibbs and Dmitry Kogan. The discrete-logarithm problem with preprocessing. In Jesper Buus Nielsen and Vincent Rijmen, editors, Advances in Cryptology – EUROCRYPT 2018 – 37th Annual International Conference on the Theory and Applications of Cryptographic Techniques, Tel Aviv, Israel, April 29 – May 3, 2018 Proceedings, Part II, volume 10821 of Lecture Notes in Computer Science, pages 415–447. Springer, 2018. doi:10.1007/978-3-319-78375-8_14.
  • [4] Anindya De, Luca Trevisan, and Madhur Tulsiani. Time space tradeoffs for attacks against one-way functions and PRGs. In Tal Rabin, editor, CRYPTO 2010, volume 6223 of LNCS, pages 649–665. Springer, Heidelberg, August 2010. doi:10.1007/978-3-642-14623-7_35.
  • [5] Amos Fiat and Moni Naor. Rigorous time/space tradeoffs for inverting functions. In Cris Koutsougeras and Jeffrey Scott Vitter, editors, Proceedings of the 23rd Annual ACM Symposium on Theory of Computing, May 5-8, 1991, New Orleans, Louisiana, USA, pages 534–541. ACM, 1991. doi:10.1145/103418.103473.
  • [6] Rosario Gennaro and Luca Trevisan. Lower bounds on the efficiency of generic cryptographic constructions. In 41st FOCS, pages 305–313. IEEE Computer Society Press, November 2000. doi:10.1109/SFCS.2000.892119.
  • [7] Martin E. Hellman. A cryptanalytic time-memory trade-off. IEEE Trans. Inf. Theory, 26(4):401–406, 1980. doi:10.1109/TIT.1980.1056220.
  • [8] Philippe Oechslin. Making a faster cryptanalytic time-memory trade-off. In Dan Boneh, editor, Advances in Cryptology – CRYPTO 2003, 23rd Annual International Cryptology Conference, Santa Barbara, California, USA, August 17-21, 2003, Proceedings, volume 2729 of Lecture Notes in Computer Science, pages 617–630. Springer, 2003. doi:10.1007/978-3-540-45146-4_36.
  • [9] Shun Watanabe and Kenji Yasunaga. Bit security as computational cost for winning games with high probability. In Mehdi Tibouchi and Huaxiong Wang, editors, Advances in Cryptology – ASIACRYPT 2021 – 27th International Conference on the Theory and Application of Cryptology and Information Security, Singapore, December 6-10, 2021, Proceedings, Part III, volume 13092 of Lecture Notes in Computer Science, pages 161–188. Springer, 2021. doi:10.1007/978-3-030-92078-4_6.
  • [10] Hoeteck Wee. On obfuscating point functions. In Harold N. Gabow and Ronald Fagin, editors, 37th ACM STOC, pages 523–532. ACM Press, May 2005. doi:10.1145/1060590.1060669.
  • [11] Andrew Chi-Chih Yao. Coherent functions and program checkers (extended abstract). In 22nd ACM STOC, pages 84–94. ACM Press, May 1990. doi:10.1145/100216.100226.