我正在使用带有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.这是我在做错的地方吗?生成的公钥的长度?
答案 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。