cryptographicexception参数不正确

时间:2016-03-31 20:10:15

标签: c# php ecdsa

我正在使用带有SHA1加密的ECDSA,因为我正在尝试为桌面应用程序进行许可激活。为此,我使用PHP服务器向其提供PC信息,服务器向我公开密钥,然后我想在C#中验证数据。

我在PHP中生成了这个公钥:

"-----BEGIN PUBLIC KEY-----
MDIwEAYHKoZIzj0CAQYFK4EEAAYDHgAEKzL3PFVVo3IWftdEYmwiSO/4zULGM/wB
8BrLjQ==
-----END PUBLIC KEY-----";

我使用了http://securitydriven.net/inferno/中的代码来实现此目的

byte[] thePublicKeyToBytes = GetBytesFromPEM(thePublicKey2, "PUBLIC KEY");
CngKey dsaKeyPublic2 = thePublicKeyToBytes.ToPublicKeyFromBlob();

byte[] theRestToBytes = GetBytes(theRestInBinary);
byte[] meinData = GetBytes("Blabla");

using (var ecdsa = new ECDsaCng(dsaKeyPublic2) { HashAlgorithm = CngAlgorithm.Sha1 }) // verify DSA signature with public key
{
    if (ecdsa.VerifyData(meinData, theRestToBytes)) MessageBox.Show("Signature verified.");
    else MessageBox.Show("Signature verification failed.");
}

程序是:

byte[] GetBytesFromPEM(string pemString, string section)
{
    var header = String.Format("-----BEGIN {0}-----", section);
    var footer = String.Format("-----END {0}-----", section);

    var start = pemString.IndexOf(header, StringComparison.Ordinal) + header.Length;
    var end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start;

    if (start < 0 || end < 0)
    {
        return null;
    }

    return Convert.FromBase64String(pemString.Substring(start, end));
}

问题是我在这一行得到了“cryptographicexception参数不正确”的异常:

CngKey dsaKeyPublic2 = thePublicKeyToBytes.ToPublicKeyFromBlob();

我无法显示地狱的公钥,但是我看到他们的钥匙的长度是384.这是我在做错的地方吗?生成的公钥的长度?

2 个答案:

答案 0 :(得分:1)

您的公钥长度为52个字节 - 太短了。你是怎么生成它的? ToPublicKeyFromBlob()方法是return CngKey.Import(byteArray, CngKeyBlobFormat.EccPublicBlob)的快捷方式 - 它仅适用于基于Ecc的密钥和.NET生成的密钥。 Inferno在P384曲线上使用ECC密钥,这意味着每个公钥将具有48 * 2 = 96个字节,加上8个头字节(如here所述),总共104个字节。

答案 1 :(得分:0)

Andrei,http://penandpants.com/2014/09/05/performance-of-pandas-series-vs-numpy-arrays/仅使用NIST P-384曲线。更重要的是,.NET框架支持的唯一曲线(开箱即用)是P-256,P-384和P-521。