johank
Newbie
Offline
Activity: 14
Merit: 125


August 30, 2018, 03:28:29 PM 

Hi I've written a paper entitled: "Anonymous Atomic Swaps Using Homomorphic Hashing". It is available at https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3235955. Briefly, an atomic swap is the exchange of crypto between two parties using two transactions. Each transaction uses a hashedtimelockcontract (HTLC) to lock the coins being sent to the other party. The hash used in both transactions are the same, linking the transactions. The paper describes how homomorphic hashing can be used to set up the HTLC's but each with a different hash, thus breaking the public link between the two transactions. The two hashes are related by a secret shared between the two parties, enabling the swap to proceed as per normal. As soon as the first party claims their coins using their prehash, the second party can use the shared secret and the prehash used by the first party to determine the prehash they have to use to claim their coins. Any comments are welcome. I would like to hear thoughts on this.









"Governments are good at cutting off the heads of a centrally
controlled
networks like Napster, but pure P2P networks like Gnutella and Tor seem
to be holding their own."  Satoshi



Advertised sites are not endorsed by the Bitcoin Forum. They may be unsafe, untrustworthy, or illegal in your jurisdiction. Advertise here.

aliashraf

Very impressive work. Atomic swap is an important field and sooner or later it will disruptively change the scene of crypto exchange. Using this technology to reach anonymity is of urgent importance as well. Thank you for sharing. I checked your paper carefully and other than one issue I found no weakness or any ambiguity in it, very elegant and straightforward. But the issue I encountered: Using ℎ(s) = s ^{n} mod p as a hash function is suspected to correlativity, although you have calculated it for small spaces by simulation, for larger spaces it remains unsolved. Generally the basic idea of having a homomorphic hash function, e.g. h(a+b) = h(a)+h(b) is suspected to correlativity problem as far as I can understand. Suppose we are trying to have a hash near to a value. We primarily generate a large number of hashes for a series of random numbers. Then we would be able to find a combination of calculated hashes that sum up to a desired proximity to our target and use the sum of their secrets. I would suggest using a large enough set of primary hashes makes it possible to find an exact match. Am I missing something?




johank
Newbie
Offline
Activity: 14
Merit: 125


August 30, 2018, 11:08:21 PM Last edit: August 31, 2018, 05:30:45 AM by johank Merited by DarkStar_ (3), LeGaulois (1) 

Hi aliashraf
Firstly, thank you very much for your feedback. It is very insightfull.
You have mentioned a weakness that I have not considered and that I would like to address.
You are correct in that an attacker could try to guess the two secrets using the sum provided.
There are actually two attacks that I see possible. The first you have mentioned, but I also realised there is another possibility.
If the sum t is very low or very high, very few secrets will be candidates to generate that sum. For example, if we use n = 3 and 8 bit representation with p = 257 and the sum is 2, then the secrets must be 1 and 1. The same for very high sums. If the sum is 33162750 and the secrets are limited to max 255 then the secrets must both be 255.
This attack can easily be solved by limiting the sums we find acceptable to the range (2/3*p)^{3} < t < p^{3}.
The second attack is the one you mentioned. To analyse this attack it is necessary to determine the effective search space that will result from using the equation s_{1}^{3} + s_{2}^{3} = t, for a given t.
Suppose the attacker launches a brute force attack on this equation, what will the effective search space be?
The attacker will have to start with s_{1} = 1 and solve for f = floor((t  s_{1}^{3})^{1/3}) and c = ceil((t  s_{1}^{3})^{1/3}).
If f = c they would have solved the problem with s_{2} = f = c for a given s_{1}.
The error in t is (s_{1}^{3} + c^{3})  t or (s_{1}^{3} + f^{3})  t.
The attacker can 'ride the curve' closer to t by starting from a point to search for (s_{1}^{3} + c^{3})  t = 0. But there is no guarantee that it will end in a solution. (s_{1}^{3} + c^{3})  t has many jump discontinuities. As soon as it gets close to 0 it jumps. According to estimates on a small space, there are approximately 40% * t^{1/3} discontinuities. The attacker will therefore still have to search about 40% * t^{1/3} of the space.
Using the limits for t previously set, I hypothesize the search space would therefore be between 25% * p and 40% * p.
Assuming a bit space of 256 bits is used in the hash, this would still be a large space.
I understand from your description of the attack, that you would look for values near the total. And that if you have enough randomly selected hashes, you would find an exact match by moving in on the exact match. But (s_{1}^{3} + c^{3})  t has many jump discontinuities. And any starting point could lead to a solution, but most starting points wouldn't.
So even a random attack would be faced with the same search space. And it has to be an exact match, or the secrets would be slightly out and not match the required hashes.
Again, thank you for your feedback and insights. They are greatly appreciated.
Please feel free to provide further comment. If I have not explained myself correctly, please ask for clarrification.
If I have made reasoning errors, please bring them to my attention
Regards
Johan




johank
Newbie
Offline
Activity: 14
Merit: 125


August 31, 2018, 09:12:31 AM Last edit: August 31, 2018, 09:38:17 AM by johank 

Hi
I think I can prove the difficulty of finding e = 0 for e = s_{1}^{3} + c^{3}  t [where c = ceil((t  s_{1}^{3})^{1/3}) ] scales with increasing size of space. (e is the error) (please refer to previous post)
First define b = ceil(a, d) where b is the number greater than a with d decimal places, e.g. b = ceil(a,0) wil give the integer larger than a and b=ceil(a,1) will give the number larger than a and divisible by 0.1
Then observe that b = ceil(10 * a, 0) = 10 * ceil(a, 1). That is, we can multiply a by 10 and then ceil to closest integer, or we can ceil to closest 0.1 and then multiply by 10.
Then scale space with m so that s_{1}^{'} = 10^{m} * s_{1}, t^{'} = 10^{3*m} * t,
e = (s_{1}^{'})^{3} + (ceil((t^{'}  (s_{1}^{'})^{3})^{1/3},0))^{3}  t^{'}
e = (10^{m} * s_{1})^{3} + (ceil((10^{3*m}*t  (10^{m}*s_{1})^{3})^{1/3},0))^{3}  10^{3*m}*t
e = (10^{m} * s_{1})^{3} + (ceil(10^{m}*(t  (s_{1})^{3})^{1/3},0))^{3}  10^{3*m}*t
e = (10^{m} * s_{1})^{3} + (10^{m}*ceil((t  (s_{1})^{3})^{1/3},m))^{3}  10^{3*m}*t
e = 10^{3*m} * (s_{1}^{3} + (ceil((t  (s_{1})^{3})^{1/3},m))^{3}  t)
If we now increase m, the ceil can be approximated by removing it and this then reduces to
e = 10^{3*m} * (s_{1}^{3} + (t  (s_{1})^{3})  t)
e = 10^{3*m} * 0
Therefore e reduces to 0 for all values of s_{1} and t if m becomes large enough.
Effectively as m increases the search space changes from integer space to rational space.
Thus the search for a unique solution to (s_{1}^{3} + c^{3})  t becomes intractable.
As before comments and questions are welcome.





aliashraf

OP, I've just finished reading your latest posts, meanwhile I was (and still I am) independently investigating your proposed hash function being secure enough against a range of heuristic/brute force attacks like the one I've suggested previously. I've to admit (somewhat intuitively for now) you are in the right direction and for s1 and s2 being mutually coprimes with p, where p is a large enough number and n a small odd integer like 3, a good security against reverse hash attacks seems to be provable. I'll compare my results with yours and will keep you informed  @gmaxwell, I afraid your CoinSwap proposal is not atomic swap because of its use of escrow (not trusted tho). Its advantage (which is so common for your works) is its compatibility with bitcoin machine language that is not the case with Op's proposal. Obviously, implementing this proposal (given it would be approved both mathematically and computationally) needs extending bitcoin machine to support the homomorphic hash under consideration (MUL and ADD opcodes are both disabled and useless because of overflow problem). Greg, if this hash function h(s,n,p) = s^{n}%p could provably resist against complicated brute force/heuristic attacks that take advantage of its homomorphism, when s,n and p are selected properly, this proposal would be a game changer in cryptoanonymity domain. I would like to take advantage of this case as an exemplary to prove myself right about the infinite possibilities for improving bitcoin and the unacceptable consequences of extreme conservatism.




johank
Newbie
Offline
Activity: 14
Merit: 125


September 01, 2018, 01:56:40 PM Last edit: September 01, 2018, 03:14:38 PM by johank 

@gmaxwell,
Thank you for making me aware of the CoinSwap and the Adaptor signatures. I was not aware of this work and will update my paper to reference and discuss how it compares to my work. I will also discuss this here as you asked how they compare.
As I understand from what I have read on the CoinSwap method it has the following features relevant to your question: 1) It runs on current cryptocurrencies without them needing modification and no novel cryptography is needed; 2) It uses scripts that are frequently used, so that it can blend in with the environment; 3) It uses between 4 and 6 transactions to execute, of which the first two are 2of2 multisignature transactions; and 4) All the coins that are being swapped are swapped together.
From my understanding of the Adaptor signature it has the following features relevant to your question 1) It would require a soft fork to implement Schnorr signatures; 2) It will use Schnorr signatures to release coins; 3) It uses 4 transactions to execute; and 4) All the coins that are being swapped are swapped together.
If there is something I do not understand correctly, please bring this to my attention.
The main features of my proposal that are relevant to your question are: 1) It would require a soft fork to implement the needed homomorphic hash opcode; 2) It will use the created homomorphic hash code to release coins; 3) It uses a minimum of 2 transactions to execute; and 4) The coins can be swapped in a variety of combinations.
Let me explain at the hand of the items above what the differences therefore are.
The CoinSwap does not require modification; the Adaptor signature does but it seems a BIP is in the process. My proposal will require due investigation to make sure it is secure and would then require a BIP.
The CoinSwap blends in much more with the environment than the other two which require special opcodes. But this might not be as safe as it sounds. It is true that the CoinSwap multisig transactions would not be found among all the other multisigs, but what would happen in practice is that someone would investigate a person by following the history of their coins. If they encounter a multisig transaction they would as a matter of course search for another multisig transaction for the same amount around the same block height. If they found such a multisig they would fork their investigation to follow both coin histories.
In my opinion any anonymous swap of coins will leave some sort of fingerprint. That cannot be eliminated. What needs to happen is for that the anonymous swap must be the standard method of swapping crypto assets and it must be possible for the swap to be broken up into smaller transactions with different amounts. That way if an investigation is following coins and it finds a swap has occurred, it must search for an unknown number of transactions in a sea of similar transactions.
That brings me to the last point. To my understanding the CoinSwap and Adaptor signature methods swap coin for coin in a fixed set of transactions. In other words A gives 1 BTC to B in TX1 and B gives 1 BTC to A in TX2. In my proposal I make the point that implies the following is possible: 1) A creates 3 transactions with amounts 0.2 BTC, 0.3 BTC and 0.5 BTC to send to B; and 2) B creates 2 transactions with amounts 0.4 BTC and 0.6 BTC to send to A.
The amounts all add to 1 BTC, each transaction will have a different hash, all hashes are related by a set of shared secrets, and if A claims a single transaction in (2) B will be able to claim all transactions in (1). These transactions can also happen in different blocks. This is a very important point that is not made in any of the literature that I read on the CoinSwap and Adaptor signature methods. I suspect it is possible for the Adaptor signature methods but not for CoinSwap.
But to hide the swap with the homomorphic opcode that flags it as a swap, these swaps would need to be the standard method of crypto asset swapping. I believe this is true no matter which of these three methods are used, even for the CoinSwap method for reasons mentioned above.
On a side note, a homomorphic hash might also have applications other than atomic swaps. For example: 1) Alice generates a secret s1 and Bob generates a secret s2; 2) they both hash their secrets to generate h1 and h2; 3) they sum the hashes to generate ht 4) They can now use this ht in a transaction 5) If either s1 or s2 is revealed the other party can determine st which is the preimage of ht. At this time this transaction is a bit of a hammer looking for a nail. I mention it because someone might be able to use it and it helps you to understand the possible value of the proposed homomorphic hash.
I hope this answers your question to your satisfaction. If you have any further questions on this, please let me know.

@aliashraf
I look forward to hearing from you regarding any results your investigation produces.




andytoshi
Full Member
Offline
Activity: 174
Merit: 132



September 01, 2018, 03:13:52 PM 

You can do adaptorsignature based atomic swaps in Bitcoin without Schnorr; see https://eprint.iacr.org/2018/472 which has a full security proof (and security model, which is a nontrivial thing to define for transitive atomic swaps). Adaptor signatures can be used to make arbitrary sets of transactions atomic; and to even add transactions to these sets after the protocol has started. They are definitely not restricted to pairwise exchange, though in practice I expect you'll find it's hard to coordinate much else. It is not possible to do a crosschain atomic swap with only two transactions because you need at least one transaction on each chain, and the first transaction on each chain can be invalidated by publishing a conflicting transaction alongside it.




aliashraf


September 01, 2018, 07:13:59 PM 

You can do adaptorsignature based atomic swaps in Bitcoin without Schnorr; see https://eprint.iacr.org/2018/472 which has a full security proof (and security model, which is a nontrivial thing to define for transitive atomic swaps). Adaptor signatures can be used to make arbitrary sets of transactions atomic; and to even add transactions to these sets after the protocol has started. They are definitely not restricted to pairwise exchange, though in practice I expect you'll find it's hard to coordinate much else. Interestingly, the idea of your referenced source, multihop locks, shares the concept of employing homomorphic hash functions with this proposal. It is not possible to do a crosschain atomic swap with only two transactions because you need at least one transaction on each chain, and the first transaction on each chain can be invalidated by publishing a conflicting transaction alongside it.
I doubt it. Using this proposal: Alice issues tx1 on aliceChain sending m aliceCoins to Bob hashlocked with H(s1) after privately handing Bob (t, H(s1), H(s2)) Bob does the same by issuing tx2 on bobCahin hashlocked with H(s2), AFTER tx1 is confirmed on aliceChain. Now Alice should wait for tx2 to get confirmed before spending its outpoint and Bob should wait for Alice spending tx2 (and revealing s2) to be able to calculate s1 = ts2 and spend tx1's outpoint.




vlad.gelfer
Newbie
Offline
Activity: 1
Merit: 0


September 01, 2018, 07:43:30 PM 

Hi johank!
I really like the idea. So you're talking about the homomorphic hashing functions. But why not just use the ellipticcurve arithmetics? Indeed this is what it is  oneway homomorphic transformation.
Am I misunderstanding something? Thanks in advance.




johank
Newbie
Offline
Activity: 14
Merit: 125


September 01, 2018, 07:56:10 PM 

Hi vlad.gelfer You are correct, you can use EC. Specifically the proposal by Andrew Poelstra is a manner to use Schnorr signatures on EC curves to achieve this. From what I have learnt they approaches achieves something very similar. The main differences are that this proposal would use 2 transactions and Andrew's would use 4 and that there is already a BIP in the works to make Schnorr signatures part of Bitcoin. What I am interested in seeing is what else the Scriptless Script's of Andrew can achieve. As for this proposal, the following example is another type of transaction that it could be applied to (as discussed in previous post): 1) Alice generates a secret s1 and Bob generates a secret s2; 2) they both hash their secrets to generate h1 and h2; 3) they sum the hashes to generate ht 4) They can now use this ht in a transaction 5) If either s1 or s2 is revealed the other party can determine st which is the preimage of ht.
Hope this answers your question




andytoshi
Full Member
Offline
Activity: 174
Merit: 132



September 02, 2018, 01:39:06 AM 

It is not possible to do a crosschain atomic swap with only two transactions because you need at least one transaction on each chain, and the first transaction on each chain can be invalidated by publishing a conflicting transaction alongside it.
I doubt it. Using this proposal: Alice issues tx1 on aliceChain sending m aliceCoins to Bob hashlocked with H(s1) after privately handing Bob (t, H(s1), H(s2)) Bob does the same by issuing tx2 on bobCahin hashlocked with H(s2), AFTER tx1 is confirmed on aliceChain. Now Alice should wait for tx2 to get confirmed before spending its outpoint and Bob should wait for Alice spending tx2 (and revealing s2) to be able to calculate s1 = ts2 and spend tx1's outpoint. I count four transactions in what you described.




aliashraf


September 02, 2018, 05:03:05 AM 

It is not possible to do a crosschain atomic swap with only two transactions because you need at least one transaction on each chain, and the first transaction on each chain can be invalidated by publishing a conflicting transaction alongside it.
I doubt it. Using this proposal: Alice issues tx1 on aliceChain sending m aliceCoins to Bob hashlocked with H(s1) after privately handing Bob (t, H(s1), H(s2)) Bob does the same by issuing tx2 on bobCahin hashlocked with H(s2), AFTER tx1 is confirmed on aliceChain. Now Alice should wait for tx2 to get confirmed before spending its outpoint and Bob should wait for Alice spending tx2 (and revealing s2) to be able to calculate s1 = ts2 and spend tx1's outpoint. I count four transactions in what you described. Actually, the spend transactions are not part of the protocol itself because both parties would be able to do it as regular transactions for other purposes but if you feel more comfortable counting this way, I've no objections.




empty[g]
Newbie
Offline
Activity: 7
Merit: 9


September 02, 2018, 08:37:19 AM Last edit: September 02, 2018, 08:49:42 AM by empty[g] 

Hi, I have read the paper several times and after so much thinking about it i still can't understand your proof of 'no collisions', and i can't see a reason for proofing it, i think if we don't have a high chance of collisions that would be enough. About the proof its self; as i see it, you can't use rule of signs when you are using modular math. s _{1}^{n}s _{2}^{n}=0 (mod p) means s _{1}^{n}s _{2}^{n}=kp where k is a member of Integers numbers, so for a fixed s _{1} not only s _{2} but k would be a variable. also the board of the function is limited from 0 to P1 and as a result, the talk of no collisions is meaningless out of a limited range for s, and you have mentioned s<p in the paper but i see no use for it in the part 4 of 'no collisions'. maybe i'm just wrong, please tell me if i am.




johank
Newbie
Offline
Activity: 14
Merit: 125


September 02, 2018, 01:49:35 PM 

@empty[g]
I understand the point you are trying to make. I had not considered that issue. That is why I prefer sharing work on these forums as you get people looking at your work which you do not come across in daily life. Your input is much appreciated.
I will consider the point you made and will see if I can find a solution. If you do find a solution I would appreciate if you share it.
Regards
Johan




johank
Newbie
Offline
Activity: 14
Merit: 125


September 04, 2018, 06:38:39 AM Last edit: September 04, 2018, 06:49:41 AM by johank 

Hi Hopefully this expanded proof of no collisions works. Please let me know if I have made any mistakes. I use the following theorem Theorem 9.5 Let p be a prime. The noncongruent numbers a _{1}; a _{2}; : : : ; a _{k} are roots of the polynomial congruence f(x) = 0 (mod p) if and only if there exist two integral polynomials q(x) and r(x) such that f(x) = (x  a _{1}).(x  a _{2}) . . . (x  a _{k}).q(x) + p.r(x) and deg r(x) < k. The proof is available at www2.math.uu.se/~astrombe/talteori2016/lindahl2002.pdfh _{1} = s _{1}^{n} mod p h _{2} = s _{2}^{n} mod p For collisions h _{1} = h _{2} and s _{1} != s _{2}Therefore determine roots of (s _{1}^{n}  s _{2}^{n}) = 0 (mod p) This is equivalent to s _{1}^{n}  s _{2}^{n} = t.p So for completeness sake we can find the roots of (s _{1}^{n}  s _{2}^{n}  t.p) = 0 (mod p) Applying the above theorem, we can set r(s _{1}) = t Then we have to find the roots of s _{1}^{n}  s _{2}^{n}There are three possibilities: 1) n is odd 2) n is even and has no odd factors 3) n is even and has odd factors  (1) if n is odd = (s _{1}  s _{2}).(s _{1}^{(n1)} + s _{1}^{(n2)}.s _{2} + ... + s _{1}.s _{2}^{(n2)} + s _{2}^{(n1)}) = (s _{1}  s _{2}).q(s _{1}) => 1 root s _{1} = s _{2}=> no collisions  (2) n is even = (s _{1}^{(n/2)}  s _{2}^{(n/2)}).(s _{1}^{(n/2)} + s _{2}^{(n/2)}) n/2 is even = (s _{1}^{(n/4)}  s _{2}^{(n/4)}).(s _{1}^{(n/4)} + s _{2}^{(n/4)}).(s _{1}^{(n/2)} + s _{2}^{(n/2)}) n/m is 2 = (s _{1}^{2}  s _{2}^{2}).q(s1) = (s _{1}  s _{2}).(s _{1} + s _{2}).q(s _{1}) => 2 roots s _{1} = s _{2} and s _{1} = s _{2}=> has collisions  (3) n is even = (s _{1}^{(n/2)}  s _{2}^{(n/2)}).(s _{1}^{(n/2)} + s _{2}^{(n/2)}) n/2 is even = (s _{1}^{(n/4)}  s _{2}^{(n/4)}).(s _{1}^{(n/4)} + s _{2}^{(n/4)}).(s _{1}^{(n/2)} + s _{2}^{(n/2)}) n/m is odd = (s _{1}^{(n/m)}  s _{2}^{(n/m)}).(s _{1}^{(n/m)} + s _{2}^{(n/m)}).q'(s1) = (s _{1}  s _{2}).(s _{1}^{(n/m1)} + ... + s _{2}^{(n/m1)}).(s _{1} + s _{2}).(s _{1}^{(n/m1)}  s _{1}^{(n/m2)}.s _{2} + ...  s _{1}.s _{2}^{(n/m2)} + s _{2}^{(n/m1)}).q'(s _{1}) => at least 2 roots s _{1} = s _{2} and s _{1} = s _{2}=> has collisions  Therefore to assure no collisions, n has to be odd and p must be a prime. As soon as I have a chance I will update the paper with these details.




empty[g]
Newbie
Offline
Activity: 7
Merit: 9


September 04, 2018, 08:14:30 AM 

Hi
Hopefully this expanded proof of no collisions works. Please let me know if I have made any mistakes.
I use the following theorem
as soon as i got the time i have something to share with you, but for now let me say i think there should be more conditions on P. i would try to update this post and tell you more in next 24 hours.




johank
Newbie
Offline
Activity: 14
Merit: 125


September 04, 2018, 02:25:02 PM Last edit: September 04, 2018, 02:48:58 PM by johank 

Hi
Just thought I might share this. It is a simple attack, that the following proof shows will not work
h = s^{n} mod p
Assume an attacker want to find a power m such that
h^{m} mod p = s
=> s = s^{(n.m)} mod p
=> s^{(n.m)}  s = 0 (mod p)
The attacker would have to solve the above congruence.
Using the theorem from my previous post, this implies that the congruence can be factorized to yield
s.(s^{(n.m1)}  1)
This yields roots s = 0, s = 1 and possibly s = 1 for all values of n and m
Therefore for s > 1 there are no values of m that can be used to determine the preimage s from the hash h.




empty[g]
Newbie
Offline
Activity: 7
Merit: 9

Hi
Hopefully this expanded proof of no collisions works. Please let me know if I have made any mistakes.
hi i think it is still wrong i can't find out what did you do wrong exactly in math, so i just say why i think the result is wrong. about the math: i think you did a mistake that you get here : "Then we have to find the roots of s _{1}^{n}  s _{2}^{n}" i repeat what i said before once : "the board of the function is limited from 0 to P1 and as a result, the talk of no collisions is meaningless out of a limited range for s, and you have mentioned s<p in the paper but i see no use for it in the part 4 of 'no collisions' " in general when a function is modulating it would have collisions unless we set a range on the input (here 's') any argue with no declaration on range of s for no collisions should be false. also i have written a simple c program that with brute force checks if there is collisions(i can share it if you ask me nice ) for every prime number less than 10,000 as P for every number less than the P is being tested as S for n=3 the largest number as p with no collisions was "1289" for n=5 the largest number as p with no collisions was "73" it shows that there are prime numbers that will give you collisions and there are ones that would not.  also sorry for not being on time as i promised in previous post




johank
Newbie
Offline
Activity: 14
Merit: 125


September 06, 2018, 08:27:23 AM 

Hi I agree with your assessment. I verified that there are collisions for n=3 and p = 1291. My mistake lies in assuming (s _{1}^{(n1)} + s _{1}^{(n2)}.s _{2} + ... + s _{1}.s _{2}^{(n2)} + s _{2}^{(n1)}) in (1)
if n is odd
= (s_{1} s_{2}).(s_{1}^{(n1)} + s_{1}^{(n2)}.s_{2} + ... + s_{1}.s_{2}^{(n2)} + s_{2}^{(n1)})
= (s_{1}  s_{2}).q(s_{1})
=> 1 root s_{1} = s_{2}
=> no collisions
has no roots mod p. This is incorrect. For example s _{1}^{2} + s _{1}.s _{2} + s _{2}^{2} mod 1291 has roots. Therefore you are correct that p would have to have a specific value to allow/disallow collisions. The problem is my previous proof regarding an attack on the system h ^{m} mod p = s where h = s ^{n} mod p is also incorrect. Specifically an attack could succeed if there are no collisions for a specific value of m Basically by raising the hash to the correct power, the secret can be discovered. From limited numerical simulation it seems that if there are no collisions, then a specific value om m exist for all s If collisions are possible, then this attack is not possible. The downside is then that it might make a brute force attack easier I am therefore going to remove the paper from SSRN, as this is a major problem.




