Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么BouncyCastle生成的密钥小于.Net';埃克迪菲耶尔曼酒店_C#_Unity3d_Cryptography_.net 3.5_Bouncycastle - Fatal编程技术网

C# 为什么BouncyCastle生成的密钥小于.Net';埃克迪菲耶尔曼酒店

C# 为什么BouncyCastle生成的密钥小于.Net';埃克迪菲耶尔曼酒店,c#,unity3d,cryptography,.net-3.5,bouncycastle,C#,Unity3d,Cryptography,.net 3.5,Bouncycastle,我试图用BouncyCastle生成一个公钥(因为我使用的是Unity,没有访问ECDiffieHellmancG的权限),然后我将公钥传输到使用ECDiffieHellmancG进行密钥处理的服务器。 服务器拒绝了我的密钥,因为它的长度很小。ECDiffieHellmancing生成的公钥比Bouncy castle生成的公钥大得多 有没有办法在bouncy castle中生成更大的密钥 我尝试更改密钥位大小,但得到一个错误:InvalidParameterException:未知密钥大小 B

我试图用BouncyCastle生成一个公钥(因为我使用的是Unity,没有访问ECDiffieHellmancG的权限),然后我将公钥传输到使用ECDiffieHellmancG进行密钥处理的服务器。 服务器拒绝了我的密钥,因为它的长度很小。ECDiffieHellmancing生成的公钥比Bouncy castle生成的公钥大得多

有没有办法在bouncy castle中生成更大的密钥

我尝试更改密钥位大小,但得到一个错误:InvalidParameterException:未知密钥大小

BouncyCastle生成的关键帧:

305930301306072A8648CE3D0200106082A8648CE3D03010703420004272F71C1D8B3DC0A7FCB1E9650EEF64EA8F639BEC97D49F88455C2F5869F7324332D188129C84727F834EE7EE7D8EB7DFC8D40CD4ED219A4FBCEF6C15200F3

ECDiffieHellmancing生成的密钥:

45434B35420000055CC8665A66A7CDF2E9BF7C69A25B322C72CDBDB1EA8F348050B0A7CF32F9AAD890EA51358336797D5157B2F7FBF55661C9AEF09B1DC1EA8F193688C3C09501是326867ABCB41CA1029F66AF888649F0A6674D19670CF32467B367C1623D688A7A7CF7F566F5DB99E13C8D960AEF56CD5B6CB627C9CF7B7CF7B9CF7B9CF7B6CF7B9B9B9B9B9B9B9B9B9B9C

以下是生成弹性城堡密钥的代码:

    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库,它给了我一个更大的键,但仍然只是头发太短

// 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库中的密钥:

5F4542F9A8F5636ECCBAC38238C97ABE757B8F65E25B181BCF41C589855E699EFD6B9606B99F70717E83F7AC1B5E97DFF6DBA94876F74645F25F0D7FAA15288C1BD0BB568DF15A987240936B213769893A05B47E40410B0F395C834F68F7B2E01852895D912C1D56675A7D8C5367E06DE08AA8CBB49F3142

如果你使用的是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
位字符串的有效载荷是曲线为secp256r1的ecPublicKey的编码值

然后,在2.3.3椭圆曲线点到八进制字符串的转换之后,我们看到它被编码为

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
按照来自的逻辑,我们看到等价物是


它不是关于大小,而是关于格式。Bouncycastle返回公钥的标准化编码,但您的ECDiffieHellmancing是Microsoft专有blob。Mentalis结果根本不是ECDH值。嗯,除了ECDiffieHellmancing之外,还有什么方法可以获取Microsoft专有的blob吗?我没有权限。哦,部分尺寸差异是你有一把NIST P-521 CNG钥匙和一把BouncyCastle的NIST P-256钥匙。(0x354B4345==BCRYPT_ECDH_PUBLIC_P521_MAGIC)Snipe3000:dunno,但您可能会发现其中一些代码很有用:另外,请查看此问题的答案,这样听起来可能有一种方法可以将BouncyCastle的公钥blob转换为ECDiffieHellmancing公钥blob?
// 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