----- Original Message ----- From: "David Barrett" <[EMAIL PROTECTED]> To: "'theory and practice of decentralized computer networks'" <[email protected]>
Sent: Saturday, July 07, 2007 5:53 PM
Subject: RE: [p2p-hackers] What's the risk of sharing private RSA keys?

Well, it's for part of a P2P system so it's loosely related. Basically, key
exchange is surprisingly expensive, and if you establish a ton of peer
connections - such as for a swarming download - then it can actually become
a bottleneck on low-end CPUs.

Take a look at ECC, we are at or near the tipping point where ECC becomes faster per security. Right now 2048-bit RSA is about the minimum that should be used, and I'm beginning to consider moving my recommendations to 2536-bit, but with ECC 256 bits is sufficient. Also keep in mind that you can and should cache the previous keys, so you can safely change keys only every TB or so. Just store a few thousand keys, that's only a couple hundred KB of storage space the users won't notice.

Basically here's what you'll want to do

Generate one time use 256-bit ECDH key pair on pre-established curve (fix it for all clients)
ECDSA= sign data with long term private 256-bit ECDSA key, use SHA-256
EPH_a = {version, generation time, local identifier, remote identifier, one-time use 256-bit public key, curve}
A={EPH_a, ECDSA(EPH_a)}
send A, receive B
B is identical in format to A, reverse the process, verify the ECDSA signature
Perform the ECDH key agreement this delivers a 256-bit shared secret SS
A->B Enc = HMAC_SHA-256(SS, "A->B Encryption") //(Key, Data)
A->B MAC = HMAC_SHA-256(SS, "A->B Authentication")
B->A Enc = HMAC_SHA-256(SS, "B->A Encryption")
B->A MAC = HMAC_SHA-256(SS, "B->A Authentication")
Note that for efficiency you only have to perform the keying process of the HMAC once. I may have missed some things that are necessary, this was only a very quick process.

With Crypto++ (which I find has more useful benchmarks than OpenSSL) a 1.83GHz Core 2 using just the 32-bit operations should be able to compute all of this in about 20-25ms, or less computation time in computation than the round trip for a single packet. Although this does not include direct verification of the keys which should probably be added. Using 64-bits the time can be cut approximately in half. If you use AES for the encryption and MACing it should be possible to achieve 50MB/sec without any stress. If you want maximum performance I would actually recommend moving to LibTomCrypt, Tom's work on that has delivered probably the highest performance for the primitives. Joe
_______________________________________________
p2p-hackers mailing list
[email protected]
http://lists.zooko.com/mailman/listinfo/p2p-hackers

Reply via email to