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
크기가 아니라 형식에 관한 내용입니다. Bouncycastle은 공개 키의 표준화 된 인코딩을 반환하지만 ECDiffieHellmanCng은 Microsoft 소유의 Blob입니다.Mentalis 결과는 ECDH 가치가 아닙니다. –
흠, 어쨌든 ECDiffieHellmanCng 이외의 것을 사용하여 Microsoft 소유의 BLOB를 얻으 려니? 나는 그것에 접근 할 수 없다. – Snipe3000
아, 그리고 크기 차이의 일부로 CNG에 NIST P-521 키가 있고 BouncyCastle에서 NIST P-256 키가 있습니다. (0x354B4345 == BCRYPT_ECDH_PUBLIC_P521_MAGIC) – bartonjs