2017-02-24 1 views
1

私はBouncyCastleで公開鍵を生成しようとしています(私はUnityを使用しており、ECDiffieHellmanCngへのアクセス権を持っていないため) ECDiffieHellmanCngをキー処理に使用しています。 サーバーは、鍵の長さが小さいため、鍵が拒否されています。 ECDiffieHellmanCngは、Bouncy castleが生成するものに比べてサイズがはるかに大きい公開鍵を生成します。なぜBouncyCastleが.NetのECDiffieHellmanCngより小さい鍵を生成するのですか

弾力のある城に大きな鍵を生成する方法はありますか?

私はキービットサイズを変更しようとしましたが、エラーが発生しました:InvalidParameterException:不明なキーサイズです。

はBouncyCastleが生成するキー:ECDiffieHellmanCngが生成する

3059301306072A8648CE3D020106082A8648CE3D03010703420004272F71C1D8B3DC0A7FCB1E9650EEF64EA8F639BEC97D49F8848455C2F5869F7324332D188129C84727F834EE7EE7D8EB7DFC8D40CD4ED219A4FBCEF6C15200F3

キー:

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

はここで弾む城の鍵を生成するコードのthatsです。

// 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); 

mentalis.orgライブラリからキー:

5F4542F9A8F5636ECCBBAC38238C97ABE757B8F65E25B181BCF41C58985E699EFD6B9606B99F7074717E83F7AC1B5E97DFF6DBA94876F74645F25F0D7FAA1528898C1BD0BB568DF15A98724093766B213769893A05B47E40410B0F395C834F68F57B2EE01852895D912C1D56675A7D8C5367B5E06DE08AAA18CBB4C69F3AE142

+2

それほどサイズではなくフォーマットについてです。 Bouncycastleは公開鍵の標準化されたエンコードを返しますが、ECDiffieHellmanCngはMicrosoft独自のブロブです。Mentalisの結果は、ECDHの価値ではありません。 –

+0

Hmmmm、ECDiffieHellmanCng以外のものを使用してMicrosoft独自のBLOBを取得するにはどうしてですか?私はそれにアクセスできない。 – Snipe3000

+1

ああ、サイズの違いの一部はCNGのNIST P-521キーとBouncyCastleのNIST P-256キーです。 (0x354B4345 == BCRYPT_ECDH_PUBLIC_P521_MAGIC) – bartonjs

答えて

1

あなたははBouncyCastleバージョンをdecodeした場合、あなたはそれが

であることを参照してくださいね
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

関連する問題