동기
ECIES-P256은 ElGamal보다 훨씬 빠릅니다. 이미 몇몇 i2pd 이프사이트에는 ECIES-P256 암호화 타입이 존재하며, Java는 이와 상호 통신이 가능해야 합니다. i2pd는 2.16.0 릴리스(0.9.32 Java)부터 이를 지원합니다.
개요
이 제안서는 식별의 인증서 부분에 나타나거나 LeaseSet2에서 별도의 암호화 키 유형으로 나타날 수 있는 새로운 암호화 유형 ECIES-P256을 소개합니다. RouterInfo, LeaseSet1 및 LeaseSet2에 사용할 수 있습니다.
ElGamal 키 위치
복습으로, ElGamal 256바이트 공개 키는 다음 데이터 구조에서 찾을 수 있습니다. 공통 구조 사양을 참조하십시오.
라우터 식별 이것은 라우터의 암호화 키입니다.
목적지 목적지의 공개 키는 이전에 i2cp-to-i2cp 암호화를 위해 사용되었으나 버전 0.6에서 비활성화되었으며 현재 LeaseSet 암호화를 위한 IV를 제외하고는 사용되지 않습니다. 이는 폐기될 예정입니다. LeaseSet의 공개 키 대신 사용됩니다.
LeaseSet 이것이 목적지의 암호화 키입니다.
위 3번에서는 ECIES 공개 키가 여전히 256바이트를 차지하지만 실제 키 길이는 64바이트입니다. 나머지는 무작위 패딩으로 채워야 합니다.
- LS2 이것이 목적지의 암호화 키입니다. 키 크기는 64바이트입니다.
키 인증서의 EncTypes
ECIES-P256은 암호화 유형 1을 사용합니다. 암호화 유형 2와 3은 ECIES-P284 및 ECIES-P521에 예약되어야 합니다.
비대칭 암호화 사용
이 제안서는 다음에 대해 ElGamal의 대체를 설명합니다:
터널 빌드 메시지 (키는 RouterIdentity에 있음). ElGamal 블록은 512바이트입니다.
클라이언트 종단 간 ElGamal+AES/SessionTag (키는 LeaseSet에 있으며, 목적지 키는 사용되지 않음). ElGamal 블록은 514입니다.
netdb 및 기타 I2NP 메시지의 라우터 간 암호화. ElGamal 블록은 514바이트입니다.
목표
- 하위 호환성
- 기존 데이터 구조에 대한 변경 없음
- ElGamal보다 훨씬 더 CPU 효율적
비목표
- RouterInfo와 LeaseSet1은 ElGamal과 ECIES-P256을 함께 게시할 수 없음
정당성
ElGamal/AES+SessionTag 엔진은 항상 태그 부족에 걸려 I2P 통신에서 성능이 극도로 저하됩니다. 터널 구축은 가장 무거운 작업이며, 원본자는 터널 빌드 요청 당 ElGamal 암호화를 3번 실행해야 합니다.
필요한 암호 원시
EC P256 곡선 키 생성 및 DH
AES-CBC-256
SHA256
상세 제안
ECIES-P256과 함께 있는 목적지는 인증서에서 암호 유형 1로 게시됩니다. 식별 내 256바이트 중 처음 64바이트는 ECIES 공개 키로 해석되며 나머지는 무시해야 합니다. LeaseSet의 별도 암호화 키는 식별에서의 키 유형을 기반으로 합니다.
ElGamal/AES+SessionTags용 ECIES 블록
ECIES 블록은 ElGamal/AES+SessionTags를 위한 ElGamal 블록을 대체합니다. 길이는 514바이트입니다. 257바이트씩 두 부분으로 구성됩니다. 첫 번째 부분은 0으로 시작하고, 그 후 P256 임시 공개 키 64바이트이며 나머지 192바이트는 무작위 패딩입니다. 두 번째 부분은 0으로 시작하고, 그 후 AES-CBC-256 암호화된 256바이트가 ElGamal과 동일합니다.
터널 빌드 레코드용 ECIES 블록
터널 빌드 레코드는 동일하지만 블록의 선행 0이 없습니다. 터널은 라우터의 암호화 유형의 조합을 통해 이루어질 수 있으며 레코드마다 수행됩니다. 터널의 원본은 터널 참가자의 게시된 암호화 유형에 따라 레코드를 암호화하며, 참가자는 자신의 암호화 유형에 따라 해독합니다.
AES-CBC-256 키
이는 KDF가 x 좌표에 대해 SHA256인 ECDH 공유 키 계산입니다. Alice가 암호화자이고 Bob이 해독자라고 가정합니다. k는 Alice의 임시 P256 개인 키이며 P는 Bob의 공개 키라고 가정합니다. S는 공유 비밀 S(Sx, Sy)입니다. Alice는 k를 P와 “합의"하여 S를 계산합니다, 예: S = k*P.
K는 Alice의 임시 공개 키이며 p는 Bob의 개인 키라고 가정합니다. Bob은 수신한 메시지의 첫 번째 블록에서 K를 꺼내 S = p*K를 계산합니다.
AES 암호화 키는 SHA256(Sx)이고 iv는 Sy입니다.