2013-08-16 2 views
1

사용자가 제공 한 초기 키를 사용하여 공개/개인 키 쌍을 생성 할 수있는 방법을 찾고 있습니다. 이것이 계층 적 키 생성 또는 다중 레벨 키 생성 또는 다른 것으로 불리는 지 여부는 알 수 없습니다. 더 높은 수준의 키가 더 낮은 수준의 데이터를 해독 할 수 있다는 것은 중요하지 않습니다. 단지 다른 키를 사용하여 쌍이 생성되어야합니다.초기 키를 사용하여 공개/개인 키 쌍 생성

몇 가지 기사가 있지만 이론적 인 내용입니다. RSA에서이를 달성 할 수있는 방법이 있습니까?

+0

그것은이다 물론 가능할 수도 있지만,이 경우 왜 그런지 묻는 것이 중요합니다. 임의로 생성 된 (그리고 아마도 서명 된) 키로는 수행 할 수없는 키로 무엇을하고 싶습니까? crypto.stackexchange.com에 대한 질문입니다. (먼저 FAQ를 확인하십시오.) –

+1

이 질문은 암호화 (crypto.stackexchange.com)에 관한 내용이므로 토픽이 아닌 것 같습니다. –

답변

2

실제로 꽤 쉽습니다.

RSA 키 쌍을 생성하는 알고리즘은 대수적 속성을 충족하고 적절한 크기의 크고 소수의 집합을 찾는 것으로 귀결됩니다. 2048 비트 RSA 키가 필요한 경우 일반적으로 길이가 1024 비트 인 2 소수를 찾습니다.

소수를 찾는 과정은 시행 착오 : 그것은 소수 경우 무작위로 적절한 크기의 정수 및 테스트를 선택 . 그렇지 않은 경우 다시 시도하십시오.

현실적으로 알고리즘을 구동하는 랜덤 제네레이터는 적절한 엔트로피 (예 : 128 비트의 진정한 무작위성)의 비밀을 뿌린 결정 론적 PRNG입니다.

귀하의 경우 PRNG 시드는 사용자 비밀 또는 다른 키 (물론 비밀 임)에서 파생 될 수 있습니다. 유도는 사용 암호화하는 라이브러리를 지정하지 않는 소금에 절인 KDF PBKDF2, HKDF 같은 등

수행해야합니다 : 그것은 무엇이든, 당신의 씨앗을 정의하는 것이 임의성을 그리는 방법 방법에 대한 명확해야 PRNG. (파이썬 2.x에서의)

예 :

from Crypto.PublicKey import RSA 
from Crypto.Hash import HMAC 
from struct import pack 

# The first key could also be read from a file 
first_key = RSA.generate(2048) 

# Here we encode the first key into bytes and in a platform-independent format. 
# The actual format is not important (PKCS#1 in this case), but it must 
# include the private key. 
encoded_first_key = first_key.exportKey('DER') 

seed_128 = HMAC.new(encoded_first_key + b"Application: 2nd key derivation").digest() 

class PRNG(object): 

    def __init__(self, seed): 
    self.index = 0 
    self.seed = seed 
    self.buffer = b"" 

    def __call__(self, n): 
    while len(self.buffer) < n: 
     self.buffer += HMAC.new(self.seed + 
           pack("<I", self.index)).digest() 
     self.index += 1 
    result, self.buffer = self.buffer[:n], self.buffer[n:] 
    return result 

second_key = RSA.generate(2048, randfunc=PRNG(seed_128)) 

단점은 염두에 두어야은 그 :

파생 된 키가 즉시 첫 번째 키가 손상으로 손상 얻을 것이다
  1. .
  2. 파생 된 키 알고리즘은 마술 엔트로피를 생성하지 않습니다, 같이 (첫 번째 키보다 더 강한 수 없습니다. 비밀 키 또는 암호가 짧은 경우, 당신이 약한 파생 된 키와 끝까지.
+0

키 쌍이 어떻게 될 수 있는지 이해할 수 없습니다. 이 두 가지 RFC는 파생 된 키에서만 반환되는 함수를 지정합니다. –

+0

파이썬에서 작은 예제를 추가했습니다. – SquareRootOfTwentyThree

관련 문제