Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.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++ 加密++;和压缩的EC密钥_C++_Crypto++ - Fatal编程技术网

C++ 加密++;和压缩的EC密钥

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

如何在Crypto++中生成压缩的ECDSA密钥

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.