C++ 加密++;和压缩的EC密钥
如何在Crypto++中生成压缩的ECDSA密钥C++ 加密++;和压缩的EC密钥,c++,crypto++,C++,Crypto++,如何在Crypto++中生成压缩的ECDSA密钥 AutoSeededRandomPool prng; ECDSA<ECP, SHA1>::PrivateKey privateKey; ECDSA<ECP, SHA1>::PublicKey publicKey; privateKey.Initialize( prng, CryptoPP::ASN1::secp256r1()); const Integer& x1 = privateKey.GetPrivateE
AutoSeededRandomPool prng;
ECDSA<ECP, SHA1>::PrivateKey privateKey;
ECDSA<ECP, SHA1>::PublicKey publicKey;
privateKey.Initialize( prng, CryptoPP::ASN1::secp256r1());
const Integer& x1 = privateKey.GetPrivateExponent();
cout << "priv: " << std::hex << x1 << endl;
privateKey.MakePublicKey( publicKey );
const ECP::Point& q = publicKey.GetPublicElement();
const Integer& qx = q.x;
const Integer& qy = q.y;
cout << "pub x: " << std::hex << qx << endl;
cout << "pub y: " << std::hex << qy << endl;
autoseedrandompool-prng;
ECDSA::PrivateKey PrivateKey;
ECDSA::公钥公钥;
privateKey.Initialize(prng,CryptoPP::ASN1::secp256r1());
常量整数&x1=privateKey.GetPrivateExponent();
库特
如何在CryptoPP中生成压缩的ECDSA密钥
您不会创建压缩密钥。您生成一个公钥,然后压缩它(如果需要的话)。从Crpyto++用户组上的:
ECDSA<ECP, SHA1>::Verifier verifier(...);
verifier.AccessKey().AccessGroupParameters().SetPointCompression(true);
因为verifier.AccessKey()
返回ECDSA公钥
我需要知道是否有办法打印压缩密钥的Y分量
压缩是一种表示格式选项或优化。您不能在带有压缩的序列化键上打印Y组件,因为它不在那里(请参阅下面的ASN.1转储)
启用压缩后,Y“速记”将为1或-1,具体取决于组件的符号(符号表示点所在的象限)。这个想法是有人给你一个{1,X}对或{1,X}对,你可以解Y,因为你知道它应该在哪个象限。如果只允许Y为正,则只需序列化{X}(而不是{1,X}或{1,X})。(我没有深入阅读书籍或标准,因此这里可能有一些勘误)
。。。或者如果我需要从未压缩的y组件生成它。如果我需要生成它,有人能给我一个关于如何使用Integer类的好解释吗
我不知道你在这里说什么。点压缩会影响表示。如果打开点压缩并提取Y,仍然会提取Y。你不能在压缩点上计算。你需要X和Y坐标
将以下内容添加到您的程序中:
publicKey.AccessGroupParameters().SetPointCompression(false);
ByteQueue q1;
publicKey.Save(q1);
cout << "Uncompressed size: " << dec << q1.MaxRetrievable() << endl;
publicKey.AccessGroupParameters().SetPointCompression(true);
ByteQueue q2;
publicKey.Save(q2);
cout << "Compressed size: " << dec << q2.MaxRetrievable() << endl;
如果在启用点压缩后获取Y,仍然会获得4ad39ffb79c402063a99ecbc0cac8fde606db6764ace90933feee5f8d65937a2h,因为压缩会影响显示
现在,添加以下内容以转储未压缩和压缩密钥:
FileSink fs1("key-1.der", true);
q1.TransferTo(fs1);
FileSink fs2("key-2.der", true);
q2.TransferTo(fs2);
密钥以ASN.1的DER编码方式转储,并符合Certicom的要求(在较小程度上,和-见下文关于字段元素的八位字符串
vs位字符串
)
你可以在他们身上运行Peter Gutmann的:
请注意区别:
# key-1.der
243 66: BIT STRING
: 04 41 A9 BC 93 6B 6D 1D D3 A1 DE D9 97 D7 DA 08
: F1 DF 99 0E 9B 50 F9 B5 8E 9E 4F D9 31 97 58 EA
: 34 4A D3 9F FB 79 C4 02 06 3A 99 EC BC 0C AC 8F
: DE 60 6D B6 76 4A CE 90 93 3F EE E5 F8 D6 59 37
: A2
与:
# key-2.der
210 34: BIT STRING
: 02 41 A9 BC 93 6B 6D 1D D3 A1 DE D9 97 D7 DA 08
: F1 DF 99 0E 9B 50 F9 B5 8E 9E 4F D9 31 97 58 EA
: 34
: }
第一个有两个整数编码,而第二个有一个整数编码。通用值是41a9bc93。。。97 58 EA 34
,这是您的pub x
上面的内容。键-2中缺少的字符串是4A D3 9F FB。。。D6 59 37 A2
,这是上面的pub y
。为了完整性,值被编码为{X,Y}或{X},而不是ASN.1的整数编码
最后一个差异是位字符串的第一个八位字节:02与04(或03)。04表示它是未压缩的点。来自RFC 5480,第2.2节:
在查看了标准和第2.2节之后,Crypto++可能有一个bug:它编写了一个位字符串
,但该标准显然在讨论一个八位字符串
编辑1:这似乎也是下一个Crypto++错误。第6.2节,有限域元素和椭圆曲线点的语法(第20页)
编辑2:Crypto++使用Certicom指定的格式。附录C(第77页)规定:
如何在CryptoPP中生成压缩的ECDSA密钥
您不会创建压缩密钥。您生成一个公钥,然后压缩它(如果需要的话)。从Crpyto++用户组上的:
ECDSA<ECP, SHA1>::Verifier verifier(...);
verifier.AccessKey().AccessGroupParameters().SetPointCompression(true);
因为verifier.AccessKey()
返回ECDSA公钥
我需要知道是否有办法打印压缩密钥的Y分量
压缩是一种表示格式选项或优化。您不能在带有压缩的序列化键上打印Y组件,因为它不在那里(请参阅下面的ASN.1转储)
启用压缩后,Y“速记”将为1或-1,具体取决于组件的符号(符号表示点所在的象限)。这个想法是有人给你一个{1,X}对或{1,X}对,你可以解Y,因为你知道它应该在哪个象限。如果只允许Y为正,则只需序列化{X}(而不是{1,X}或{1,X})。(我没有深入阅读书籍或标准,因此这里可能有一些勘误)
。。。或者如果我需要从未压缩的y组件生成它。如果我需要生成它,有人能给我一个关于如何使用Integer类的好解释吗
我不知道你在这里说什么。点压缩会影响表示。如果打开点压缩并提取Y,仍然会提取Y。你不能在压缩点上计算。你需要X和Y坐标
将以下内容添加到您的程序中:
publicKey.AccessGroupParameters().SetPointCompression(false);
ByteQueue q1;
publicKey.Save(q1);
cout << "Uncompressed size: " << dec << q1.MaxRetrievable() << endl;
publicKey.AccessGroupParameters().SetPointCompression(true);
ByteQueue q2;
publicKey.Save(q2);
cout << "Compressed size: " << dec << q2.MaxRetrievable() << endl;
如果在启用点压缩后获取Y,仍然会获得4ad39ffb79c402063a99ecbc0cac8fde606db6764ace90933feee5f8d65937a2h,因为压缩会影响显示
现在,添加以下内容以转储未压缩和压缩密钥:
FileSink fs1("key-1.der", true);
q1.TransferTo(fs1);
FileSink fs2("key-2.der", true);
q2.TransferTo(fs2);
密钥以ASN.1的DER编码方式转储,并符合Certicom的要求(在较小程度上,和-见下文关于字段元素的八位字符串
vs位字符串
)
你可以在他们身上运行Peter Gutmann的:
请注意区别:
# key-1.der
243 66: BIT STRING
: 04 41 A9 BC 93 6B 6D 1D D3 A1 DE D9 97 D7 DA 08
: F1 DF 99 0E 9B 50 F9 B5 8E 9E 4F D9 31 97 58 EA
: 34 4A D3 9F FB 79 C4 02 06 3A 99 EC BC 0C AC 8F
: DE 60 6D B6 76 4A CE 90 93 3F EE E5 F8 D6 59 37
: A2
与:
# key-2.der
210 34: BIT STRING
: 02 41 A9 BC 93 6B 6D 1D D3 A1 DE D9 97 D7 DA 08
: F1 DF 99 0E 9B 50 F9 B5 8E 9E 4F D9 31 97 58 EA
: 34
: }
第一个有两个整数编码,而第二个有一个整数编码。通用值是41a9bc93。。。97 58 EA 34
,这是您的pub x
上面的内容。键-2中缺少的字符串是4A D3 9F FB。。。D6 59 37 A2
,这是上面的pub y
。为了完整性,值被编码为{X,Y}或{X},而不是ASN.1的整数编码
最后一个差异是位的第一个八位字节
Finally, a specific field element is represented by the following type
FieldElement ::= OCTET STRING
whose value is the octet string obtained from the conversion routines
given in Section 2.3.5.