I apologize for the theoretical nature of this question, but It has cost me a lot of sleep over the past months. Querying my immediate peers has so far failed to produce results. I assume this question belongs to the domains of Cryptography & Game-Theory, hence I hope to be in the right forum.
Question
Is it possible to design a process or method that allows an operator to run a program that generates a public and private key-pair, executes a set of operations using the private key as input and produces a result. It then exports the result and public-key after which the context self-destructs, permanently deleting the private key in such a way that eliminates all suspicion that the secret could somehow have been retained or duplicated by the operator.
Pseudo code of the imagined program:
main () {
public, secret = generateAsymmetricKeyPair()
result = someOperations(secret)
publish(public, result)
destroy(secret)
}
The source of the program is assumed to be transparently available to the general public.
Upon program completion regardless if the secret was truly lost or not,
the public
and the result
should be possible to publish while
the method itself should serve as proof that the operator has no upper hand in
any potential recovery of the secret
in comparison to a third party.
What I have so far
I've looked into TEEs as a potential secure context for the imaginary graybox but unless I misunderstand it does not divert suspicion from the operator any more than running the program on a cloud VM without ssh-keys. Both approaches also fail to present proof of deletion without a hands on inspection (requiring a trusted arbitrator). And in turn might generate an unintentional incentive to possess the hardware that executed the operation.
Smart-contracts all operate in a completely transparent manner which leaves little room for random secrets.
My most creative idea to date is to train a chimpanzee to operate a raspberry and equip it with a pack of remotely
detonated explosives, start a live broadcast and once the public
and result
is successfully transmitted;
obliterate both hardware and operator.
One obvious flaw with this approach is that the broadcast does not necessary display the destruction of the secret, rather it shows
that a piece of hardware and an assumed operator was violently removed from the equation.
I feel sorry for the monkey, please help me understand if an "trust-less blind execution environment" can be designed; if not, then why?
Update: Practical example
The following article was brought to my attention: https://decrypt.co/41402/the-690-million-bitcoin-wallet-that-hackers-are-trying-to-crack
The game described by the article is one potential practical application for the imagined graybox.
If we pretend that the wallet address is the public-key and the mentioned wallet.dat
in the article could be seen as the result
. The secret key is believed to be contained by the result.
Had the puzzle been generated by the proposed program, it could've been expressed as:
main () {
public, secret = generateAsymmetricKeyPair()
result = scrypt(secret, randomBytes(8))
publish(public, result)
destroy(secret)
}
Now we have a game with two sides, one bets that the secret can be recovered and stakes computational resources to brute-force the result. The other party bets against the recovery and does so by signing over value to the public-key. Disregarding speculation whether or not the secret is contained by the result, the game in the article has two additional problems:
Inspecting the public wallet address in a block explorer shows that the operator deposited the initial value in 2013, and in 2015 there was a single withdrawal which tells us that the operator had access to the secret at least up until that point. There is suspicion that the operator has retained the secret.
Further inspection of public transactions shows that the secret is not required to add more value to the wallet and latest addition was made on 20th of September. As an operator, If I would attempt to generate a similar lottery with a small initial value, a third party could increase the stake in my game beyond the point where I can protect my person against potential suspicion of having retained the secret. Let me rephrase that; It allows third parties to "put a bounty on the operators head". I don't possess the resources nor the stomach for such games.
So my question is: Is it theoretically possible to design a method that produces a valid "void-pair" or in this example a "void-wallet" that is provably owner-less?
generateSymmetricKeyPair
where I guess there should begenerateAsymmetricKeyPair
. See this for what a Symmetric Key Pair is. Independently: an improvement of the pseudocode invokesdestroy
beforepublish
. – fgrieu Sep 23 '20 at 18:51process
renamed tosomeOperations
, the idea is that it is a function that generates a cryptographic puzzle. – telamon Sep 23 '20 at 21:46