php 편집기 Baicao는 Go 언어를 사용하여 사용자 정의 io.Reader 인터페이스를 통해 RSA 개인 키를 결정적으로 생성하는 방법을 소개합니다. RSA는 데이터 암호화 및 디지털 서명에 일반적으로 사용되는 비대칭 암호화 알고리즘입니다. RSA 개인 키를 생성할 때 일반적으로 임의의 소스에서 난수를 가져와야 하지만 때로는 특정 규칙에 따라 결정적 개인 키를 생성해야 합니다. 이 기사에서는 사용자 정의 io.Reader 인터페이스를 구현하고 이 인터페이스를 사용하여 결정적 RSA 개인 키를 생성하는 방법을 자세히 설명합니다. 이 기사를 읽으면 암호화 응용 프로그램에 더 많은 유연성과 제어 기능을 제공하는 유용한 기술을 배우게 됩니다.
아마도 답을 얻지 못한 채 남아 있는 이유로 무제한 RSA 공개/개인 키를 생성해야 합니다. 이것은 매우 안전한 용도로 사용되지 않으므로 나에게 하지 말라고 말하지 마십시오. 예, 이상적이지 않다는 것을 알고 있습니다. "무한"이라는 말은 알 수 없는 수(수십억 ~ 수조)가 필요하며 사용하기 전에 생성하는 것이 불가능하다는 것입니다.
이 작업은 무한한 공간을 소비하고 생성하는 데 무한한 시간이 걸리기 때문에 런타임에 이 작업을 수행해야 합니다.
그러나 특정 입력에 대해 동일한 키 쌍도 필요합니다. 이는 입력을 기반으로 rsa 키를 결정론적으로 다시 생성해야 함을 의미합니다.
저는 go를 사용합니다. 일반적으로 다음 명령을 사용하여 키를 만듭니다.
으아악물론, 문제는 rand.reader
是由 crypto/rand
가 제공되기 때문에 시드가 불가능하다는 점입니다.
저는 목표를 달성하기 위해 독자적인 독자 구현을 제공하는 것이 가능할 것이라고 생각했습니다. generatekey
의 소스 코드를 보고 그것이 소수를 찾고 있다는 것을 알았습니다. 그래서 반환된 "무작위" 소수를 제어할 수 있도록 자체 리더를 구현하여 필요한 경우 동일한 키를 생성할 수 있도록 했습니다.
그러면 이렇게 키 생성을 호출할 수 있습니다
으아악컴파일되지만 포인터가 0이기 때문에 런타임에 충돌이 발생합니다. 나는 go에 꽤 만족하지만, rsa의 구현은 내 이해를 넘어서는 것입니다. 이를 달성하기 위한 더 나은 방법을 찾거나 독자들에게 효과가 있도록 하기 위해 내가 해야 할 일을 찾고 있습니다.
여기서 유일하게 어려운 요구 사항은 rsa.generatekey
또는 호환 가능한 대체 키를 사용하여 특정 입력에 대해 동일한 키를 생성할 수 있어야 한다는 것입니다. 입력은 출력과 동일한 키를 얻는 한 말 그대로 무엇이든 될 수 있습니다.
여기 현재 https://go.dev/play/p/jd1naopr5ad의 위치를 보여주는 Go 놀이터 링크가 있습니다.
read
方法未执行预期操作。它不会用随机字节填充输入 p
字节切片。如果您查看 crypto/rand.read
입력 바이트 조각을 다른 판독기에 전달하는 메소드의 유닉스 구현입니다. 따라서 기본적으로 바이트 슬라이스를 난수로 채워야 합니다. 예:
놀이터 링크 입니다.
업데이트
Erwin이 답변에서 언급했듯이 maybereadrand
라는 함수가 있습니다. 이 함수는 랜드 판독기에서 1바이트를 읽을 확률이 50%로, 함수를 비결정적으로 만듭니다. 하지만 read 메소드에 if 문을 추가하면 문제를 해결할 수 있습니다. 입력 슬라이스의 길이가 1이면 모든 것을 무시하고 반환합니다. 그렇지 않으면 입력 슬라이스에 소수를 제공하십시오:
이 snippet에서는 2개의 키를 만들었고 둘 다 동일합니다. p>
위 내용은 Go를 사용하여 사용자 정의 io.Reader로 RSA 개인 키를 결정적으로 생성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!