2017-02-24 1 views
1

BouncyCastle을 사용하여 공개 키를 생성하려고합니다 (Unity를 사용하고 있으며 ECDiffieHellmanCng에 액세스 할 수 없기 때문에). 그런 다음 공개 키를 서버로 전송합니다. 키 처리를 위해 ECDiffieHellmanCng을 사용하고 있습니다. 서버가 길이가 짧아서 내 키를 거부합니다. ECDiffieHellmanCng은 Bouncy 성에서 생성되는 것보다 훨씬 더 큰 공개 키를 생성합니다.BouncyCastle이 .Net의 ECDiffieHellmanCng보다 작은 키를 생성하는 이유

탄력있는 성에서 더 큰 키를 생성 할 수있는 방법이 있습니까?

키 비트 크기를 변경하려고했지만 오류 메시지가 표시됩니다. InvalidParameterException : 알 수없는 키 크기입니다.

키 BouncyCastle가 생성하는 :

3059301306072A8648CE3D020106082A8648CE3D03010703420004272F71C1D8B3DC0A7FCB1E9650EEF64EA8F639BEC97D49F8848455C2F5869F7324332D188129C84727F834EE7EE7D8EB7DFC8D40CD4ED219A4FBCEF6C15200F3

키 ECDiffieHellmanCng가 생성 :

45434B35420000000055CC8665A66A7CDF2E9BF7C69A25B322C72CDBDB1EA8F348050B0A7CF32F9AAD8

const string Algorithm = "ECDH"; 
    const int KeyBitSize = 256; 
    const int NonceBitSize = 128; 
    const int MacBitSize = 128; 
    const int DefaultPrimeProbability = 30; 

    IAsymmetricCipherKeyPairGenerator aliceKeyGen = GeneratorUtilities.GetKeyPairGenerator(Algorithm); 
    DHParametersGenerator aliceGenerator = new DHParametersGenerator(); 
    aliceGenerator.Init(KeyBitSize, DefaultPrimeProbability, new SecureRandom()); 
    DHParameters aliceParameters = aliceGenerator.GenerateParameters(); 
    KeyGenerationParameters aliceKGP = new DHKeyGenerationParameters(new SecureRandom(), aliceParameters); 
    aliceKeyGen.Init(aliceKGP); 

    AsymmetricCipherKeyPair aliceKeyPair = aliceKeyGen.GenerateKeyPair(); 
    IBasicAgreement aliceKeyAgree = AgreementUtilities.GetBasicAgreement(Algorithm); 
    aliceKeyAgree.Init(aliceKeyPair.Private); 

    SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(aliceKeyPair.Public); 
    byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded(); 
    string serializedPublic = AsString(serializedPublicBytes); 

public static string AsString(byte[] bytes, bool keepDashes = false) 
    { 
     string hex = BitConverter.ToString(bytes); 
     return (keepDashes ? hex : hex.Replace("-", "")); 
    } 

가 나는 또한 나에게 더 큰 키를 제공하는 Mentalis.org DH 라이브러리를 시도했지만 여전히 머리 너무 짧은 :

90EA513583367977D5157B2F7FBF55661C9AE2DBAF09B1DC1EA8F193688C3C09501BEE326867ABCB41CA1029F66AF888649F0A6C0674D19670CF32461BA7B3867C1623D68829A7A9A7F1CFC6F5DB99E13C8D960AEF6F5CDAB5B3B62ED6CBEC7222C9F

다음은 탄력이 성 키를 생성하는 코드 그게 전부입니다. mentalis.org 라이브러리에서

// create a new DH instance 
DiffieHellman dh1 = new DiffieHellmanManaged(); 
// generate the public key of the first DH instance   
byte[] ke1 = dh1.CreateKeyExchange(); 
string publicKeyString = AsString(ke1); 

키 : decode한다면

5F4542F9A8F5636ECCBBAC38238C97ABE757B8F65E25B181BCF41C58985E699EFD6B9606B99F7074717E83F7AC1B5E97DFF6DBA94876F74645F25F0D7FAA1528898C1BD0BB568DF15A98724093766B213769893A05B47E40410B0F395C834F68F57B2EE01852895D912C1D56675A7D8C5367B5E06DE08AAA18CBB4C69F3AE142

+2

크기가 아니라 형식에 관한 내용입니다. Bouncycastle은 공개 키의 표준화 된 인코딩을 반환하지만 ECDiffieHellmanCng은 Microsoft 소유의 Blob입니다.Mentalis 결과는 ECDH 가치가 아닙니다. –

+0

흠, 어쨌든 ECDiffieHellmanCng 이외의 것을 사용하여 Microsoft 소유의 BLOB를 얻으 려니? 나는 그것에 접근 할 수 없다. – Snipe3000

+1

아, 그리고 크기 차이의 일부로 CNG에 NIST P-521 키가 있고 BouncyCastle에서 NIST P-256 키가 있습니다. (0x354B4345 == BCRYPT_ECDH_PUBLIC_P521_MAGIC) – bartonjs

답변

1

BouncyCastle 버전은 당신이

것을 볼 것
30 59 
SEQUENCE 
    30 13 
    SEQUENCE 
    06 07 2A 86 48 CE 3D 02 01 
    OBJECT IDENTIFIER 1.2.840.10045.2.1 (id-ecPublicKey) 
    06 08 2A 86 48 CE 3D 03 01 07 
    OBJECT IDENTIFIER 1.2.840.10045.3.1.7 (id-secp256r1) 
    03 42 00 
    BIT STRING 
    04 27 2F 71 C1 D8 B3 DC 0A 7F CB 1E 96 50 EE F6 
    4E A8 F6 39 BE C9 7D 49 F8 84 84 55 C2 F5 86 9F 
    73 24 33 2D 18 81 29 C8 47 27 F8 34 EE 7E E7 D8 
    EB 7D FC 8D 40 CD 4E D2 19 A4 FB CE F6 C1 52 00 
    F3 

BIT STRING의 페이로드는 곡선이 secp256r1 인 ecPublicKey의 인코딩 된 값입니다. SEC-1 paper에서 2.3.3 타원 곡선 포인트 - 투 - 옥 테트 문자열 변환을 다음 다음

, 우리는 우리가 동등한 CNG blob 것을 볼 수있는 .NET Core import/export ECC feature의 논리에 따라

04 
Uncompressed Point 
    X = 27 2F 71 C1 D8 B3 DC 0A 7F CB 1E 96 50 EE F6 4E 
     A8 F6 39 BE C9 7D 49 F8 84 84 55 C2 F5 86 9F 73 
    Y = 24 33 2D 18 81 29 C8 47 27 F8 34 EE 7E E7 D8 EB 
     7D FC 8D 40 CD 4E D2 19 A4 FB CE F6 C1 52 00 F3 

로 인코딩 된 것을 볼 수 은 (는)

// BCRYPT_ECDH_PUBLIC_P256_MAGIC (little-endian) 
45 43 B4 31 
// cbKey=(DWORD)32 (little-endian) 
20 00 00 00 
// The X bytes (big-endian): 
27 2F 71 C1 D8 B3 DC 0A 7F CB 1E 96 50 EE F6 4E 
A8 F6 39 BE C9 7D 49 F8 84 84 55 C2 F5 86 9F 73 
// The Y bytes (big-endian): 
27 2F 71 C1 D8 B3 DC 0A 7F CB 1E 96 50 EE F6 4E 
A8 F6 39 BE C9 7D 49 F8 84 84 55 C2 F5 86 9F 73 
+0

BouncyCastle의 공개 키 BLOB를 ECDiffieHellmanCng 공개 키 BLOB로 변환하는 방법이있는 것 같습니다. – Snipe3000

+0

Bcrypt.net에서 필요한 결과를 얻을 수 있는지 궁금합니다. – Snipe3000

관련 문제