Distributed Key Generation and Its Applications