gpt4 book ai didi

c++ - 如何解码非关键 ASN1 数据?

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:10 25 4
gpt4 key购买 nike

是否可以使用 crypto++ 库来解码我在字节数组中的任意 ASN1 数据(具有几个序列和整数)。 ash.h 包含的方法都将 BufferedTransformation 作为输入,但该类是不同密码和哈希的接口(interface),这似乎与我的简单案例完全无关。我还在 cryptlib.h 中找到了 ASN1Object,但它是另一个接口(interface),我还没有设法找到任何实现类。

我是否认为这对我自己来说太复杂了,或者解码任意 ASN1 数据实际上很难吗?

我实际上是在 Swift/objective-c iOS 应用程序中使用它,所以如果有人有任何其他工具的简单解决方案,请告诉我。

编辑:添加数据的示例结构

SEQUENCE
SEQUENCE
INTEGER
INTEGER
SEQUENCE
INTEGER
INTEGER

总是有包含 1 到 n 个序列的父序列,每个序列包含 2 个整数(elgamal 加密对 (g^r, mh^r))。

最佳答案

SEQUENCE
SEQUENCE
INTEGER
INTEGER
SEQUENCE
INTEGER
INTEGER

为此,你会想要这样的东西:

ArraySource as(data, size);    
Integer i1, i2, i3, i4;

BERSequenceDecoder d1(as);
BERSequenceDecoder d2(d1);
i1.BERDecode(d2);
i2.BERDecode(d2);
d2.MessageEnd();
BERSequenceDecoder d3(d2);
i3.BERDecode(d3);
i4.BERDecode(d3);
d3.MessageEnd();
d1.MessageEnd();

which contain 2 integers (elgamal encryption pair (g^r, mh^r)) each.

获得参数后(见下文),您应该使用参数调用其中一个 Initialize 函数。 不要调用那些采用 PRNG 的方法,因为它们会创建参数和 key 。

参见 gfpcrypt.h对于一些相关的类定义。另见 ElGamal - Crypto++ Wiki .


这是一个示例,它生成整数对并将它们打包成您想要的 ASN.1 结构。然后它会读回它们并在没有任何东西可供使用时停止(即,内部整数对是可选的)。

您可以像 ./asn1-test.exe./asn1-test.exe 3./asn1-test.exe 6 那样运行它./asn1-test.exe 128。大小仅为 48 位,因此您不会浪费时间生成不需要的整数。

static const unsigned int BIT_COUNT = 48;

int main(int argc, char* argv[])
{
unsigned int count = 2;
if(argc >= 2 && argv[1] != NULL)
{
istringstream iss(argv[1]);
iss >> count;

if(iss.fail()) count = 2;
}

cout << "Testing " << count << " integer pairs" << endl;

// Count to pairs
count *= 2;

try
{
AutoSeededRandomPool prng;

vector<Integer> vv;
vv.resize(count);

for(unsigned int i = 0; i < count; i += 2)
{
vv[i] = Integer(prng, BIT_COUNT);
vv[i + 1] = Integer(prng, BIT_COUNT);
}

// Scratch for holding ASN.1 encoded structures in Crypto++
ByteQueue queue;

// Encode them
{
DERSequenceEncoder outer(queue);

for(unsigned int i = 0; i < count; i += 2)
{
DERSequenceEncoder inner(outer);

vv[i].DEREncode(inner);
vv[i + 1].DEREncode(inner);

inner.MessageEnd();
}

outer.MessageEnd();
}

// Save it to file (use dumpasn1 to view it)
FileSink fs("sequences.der", true);
queue.CopyTo(fs);
fs.MessageEnd();

// Decode them
{
BERSequenceDecoder outer(queue);

// Ensure we break from the loop based on EndReached()
for( ; ; )
{
if(outer.EndReached()) break;

BERSequenceDecoder inner(outer);

Integer i1, i2;

i1.BERDecode(inner);
i2.BERDecode(inner);

cout << "Pair" << endl;
cout << std::hex << " Integer: " << i1 << endl;
cout << std::hex << " Integer: " << i2 << endl;

inner.MessageEnd();
}

outer.MessageEnd();
}

} catch (const Exception& ex) {
cerr << std::dec << ex.what() << endl;
exit (1);
}

return 0;
}

这是运行和转储的样子:

$ ./asn1-test.exe 3
Testing 3 integer pairs
Pair
Integer: 301818b3c631h
Integer: 1ff0ebf1ca4bh
Pair
Integer: f97e9d28e9cah
Integer: 94813cab125fh
Pair
Integer: 8a146ea68e7ch
Integer: 60d48ef2462fh

$ dumpasn1 sequences.der
0 57: SEQUENCE {
2 16: SEQUENCE {
4 6: INTEGER 30 18 18 B3 C6 31
12 6: INTEGER 1F F0 EB F1 CA 4B
: }
20 18: SEQUENCE {
22 7: INTEGER 00 F9 7E 9D 28 E9 CA
31 7: INTEGER 00 94 81 3C AB 12 5F
: }
40 17: SEQUENCE {
42 7: INTEGER 00 8A 14 6E A6 8E 7C
51 6: INTEGER 60 D4 8E F2 46 2F
: }
: }

0 warnings, 0 errors.

这里有一些 includes 可以省去你查找它们的麻烦:

#include <iostream>
using std::ostream;
using std::cin;
using std::cout;
using std::cerr;
using std::endl;

#include <string>
using std::string;

#include <vector>
using std::vector;

#include <sstream>
using std::istringstream;

#include <cryptopp/cryptlib.h>
using CryptoPP::Exception;

#include <cryptopp/filters.h>
using CryptoPP::StringSource;
using CryptoPP::StringSink;

#include <cryptopp/files.h>
using CryptoPP::FileSink;

#include <cryptopp/integer.h>
using CryptoPP::Integer;

#include <cryptopp/osrng.h>
using CryptoPP::AutoSeededRandomPool;

#include <cryptopp/asn.h>
#include <cryptopp/oids.h>
namespace ASN1 = CryptoPP::ASN1;
using CryptoPP::DERSequenceEncoder;
using CryptoPP::BERSequenceDecoder;

#include <cryptopp/queue.h>
using CryptoPP::ByteQueue;

关于c++ - 如何解码非关键 ASN1 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29652055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com