실제로 꽤 쉽습니다.
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))
단점은 염두에 두어야은 그 :
파생 된 키가 즉시 첫 번째 키가 손상으로 손상 얻을 것이다
- .
- 파생 된 키 알고리즘은 마술 엔트로피를 생성하지 않습니다, 같이 (첫 번째 키보다 더 강한 수 없습니다. 비밀 키 또는 암호가 짧은 경우, 당신이 약한 파생 된 키와 끝까지.
그것은이다 물론 가능할 수도 있지만,이 경우 왜 그런지 묻는 것이 중요합니다. 임의로 생성 된 (그리고 아마도 서명 된) 키로는 수행 할 수없는 키로 무엇을하고 싶습니까? crypto.stackexchange.com에 대한 질문입니다. (먼저 FAQ를 확인하십시오.) –
이 질문은 암호화 (crypto.stackexchange.com)에 관한 내용이므로 토픽이 아닌 것 같습니다. –