如何解码非关键ASN1数据?

凯洛

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

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

我实际上是在Swift / objective-c iOS应用程序中使用此功能的,因此,如果有人对其他工具有简单的解决方案,请告诉我。

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

SEQUENCE
    SEQUENCE
        INTEGER
        INTEGER
    SEQUENCE
        INTEGER
        INTEGER

总有一个父序列,其中包含1到n个序列,每个序列包含2个整数(符号加密对(g ^ r,mh ^ r))。

w
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();

其中每个包含2个整数(符号加密对(g ^ r,mh ^ r))。

一旦有了参数(见下文),就应该Initialize使用参数调用其中一个函数。不要调用采用PRNG的程序,因为它们会创建参数和键。

有关某些相关的类定义,请参见gfpcrypt.h另请参见ElGamal-Crypto ++ Wiki


这是一个生成整数对并将其打包为ASN.1结构的示例,如您所愿。然后,它将它们读回,并在没有剩余可使用的东西时停止(即,内部Integer对是可选的)。

您将像./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.

以下是一些包含项,可避免您查找它们的麻烦:

#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;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ASN1 OBJECT_IDENTIFIER解码

来自分类Dev

由asn1c编译的ASN1模块无法解码?

来自分类Dev

如何从asn1数据文件中提取数据并将其加载到数据帧中?

来自分类Dev

使用Java将ASN1序列解码为RSA公钥

来自分类Dev

ASN1 UTF-8字符串解码

来自分类Dev

Ruby OpenSSL嵌套asn1错误

来自分类Dev

Ruby OpenSSL嵌套asn1错误

来自分类Dev

ASN1结构准入语法

来自分类Dev

ASN1结构采购语法

来自分类Dev

phpseclib asn1 编码结构

来自分类Dev

如何使用PyASN INTEGER(1..MAX)在python中编写ASN1编码?

来自分类Dev

如何解码本编码的torrent数据

来自分类Dev

如何解码记录的/ dev / input数据

来自分类Dev

如何解码JSON数据数组

来自分类Dev

如何解密ASN / BER数据包

来自分类Dev

如何解密ASN / BER数据包

来自分类Dev

从DER获取ASN1声明

来自分类Dev

我对ASN1 der的解释在哪里错?

来自分类Dev

Google提供的asn1定义有效吗?

来自分类Dev

造成原因:java.lang.NoClassDefFoundError:org / bouncycastle / asn1 / ASN1ObjectIdentifier

来自分类Dev

如何解码SessionSecurityToken

来自分类Dev

使用ASN.1进行解码,其中基材包含一些不透明的数据

来自分类Dev

Go-解码/编码asn.1

来自分类Dev

ASN.1 REAL-BER解码

来自分类Dev

解码ASN.1 X2AP消息-如何在Nokalva ASN.1编译器中配置部分解码?

来自分类Dev

CSR失败:遇到错误的解析请求ASN1错误标签值(ASN:267 CRYPT_E_ASN1_BADTAG)

来自分类Dev

如何解码INE / IFE墨西哥护照数据

来自分类Dev

如何解码svg数据uri(不是base64)

来自分类Dev

如何解码二进制音频数据?