是什么决定了不同密码算法中BIGNUM的大小?

问题描述 投票:0回答:1

我使用OpenSSL。我看到不同的openssl类型使用BIGNUM类型。

例如:

  1. DSA签名
typedef struct DSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} DSA_SIG;
  1. ECDSA签名
typedef struct ECDSA_SIG_st {
    BIGNUM *r;
    BIGNUM *s;
} ECDSA_SIG;
  1. 椭圆曲线私钥
struct ec_key_st {
    int version;
    EC_GROUP *group;
    EC_POINT *pub_key;
    BIGNUM *priv_key;
    unsigned int enc_flag;
    point_conversion_form_t conv_form;
    int references;
    int flags;
    EC_EXTRA_DATA *method_data;
} /* EC_KEY */ ;
  1. RSA结构
struct rsa_st {
    /*
     * The first parameter is used to pickup errors where this is passed
     * instead of aEVP_PKEY, it is set to 0
     */
    int pad;
    long version;
    const RSA_METHOD *meth;
    /* functional reference if 'meth' is ENGINE-provided */
    ENGINE *engine;
    BIGNUM *n;
    BIGNUM *e;
    BIGNUM *d;
    BIGNUM *p;
    BIGNUM *q;
    BIGNUM *dmp1;
    BIGNUM *dmq1;
    BIGNUM *iqmp;
    /* be careful using this if the RSA structure is shared */
    CRYPTO_EX_DATA ex_data;
    int references;
    int flags;
    /* Used to cache montgomery values */
    BN_MONT_CTX *_method_mod_n;
    BN_MONT_CTX *_method_mod_p;
    BN_MONT_CTX *_method_mod_q;
    /*
     * all BIGNUM values are actually in the following data, if it is not
     * NULL
     */
    char *bignum_data;
    BN_BLINDING *blinding;
    BN_BLINDING *mt_blinding;
};

OpenSSL中的[BIGNUM是:

struct bignum_st {
    BN_ULONG *d;                /* Pointer to an array of 'BN_BITS2' bit
                                 * chunks. */
    int top;                    /* Index of last used d +1. */
    /* The next are internal book keeping for bn_expand. */
    int dmax;                   /* Size of the d array. */
    int neg;                    /* one if the number is negative */
    int flags;
};

我不明白如何为特定算法选择bignum,bignum数组的大小又如何呢?

openssl bignum
1个回答
0
投票

首先,您自己不会分配实际的bn-> d值; BN_*例程会为您执行此操作,并根据需要重做/更改它。对于非过时版本的OpenSSL,这些结构(以及几乎所有其他结构)都是不透明的,尽管我可以理解想要了解它们,但是您根本无法直接访问它们。

对于使用数字(而不只是位模式)的密码算法,您使用的数字取决于算法。对于RSA,请参见the wikipedia article,并且如果到RSA Labs的PKCS1链接不再起作用(在EMC和Dell之后),请使用稳定的IETF重复RFC 2313、2437、4347、8047。 ANSI / X9和ISO还提供了其他有关RSA的标准,但是它们使用较少并且没有显着差异。有关DSA,请参阅again wikipedia和(免费)FIPS。对于ECDSA,您可以从SECG中看到已付费的X9.62或免费的SEC1,但实际上,这仅仅是DSA对(大)类Weierstrass形式的椭圆曲线的直接适应。对于DSA和ECDSA,签名中出现的值都是经过计算的,但从未选择过,尽管它们受到每次操作随机数的影响,后者通常可以在[1,n- 1],其中n是子组顺序(大小)。请注意,对于ECDSA最常用的“原始”曲线,例如P-256和P-384,设计该曲线时要使子组的阶次等于曲线的阶次,而该阶次又接近但不等于模数的模数。基础质数字段。但是,这是这些特定曲线的属性,而不是通常的ECDSA或ECC。实际上,所有算法的密钥要么通过直接调用适当的密钥生成函数(或使用EVP_PKEY_* API来生成(在OpenSSL中),要么从其他软件或系统中导入,而这些软件或系统是通过正确地生成它们的实现的过程。类似地,应该通过直接或通过EVP调用签名函数来创建签名,或者从正确创建签名的其他地方接收签名。所有的OpenSSL代码都是免费的(语音和啤酒),因此您可以查看它并查看其作用;一些人(包括我在内)发现,至少有时在具有良好源代码级调试器的系统中编译此类代码并逐步查看它的作用会很有帮助。

[标准警告:如果您只想使用加密货币或像OpenSSL这样的特定实现,请把自己踢出去。如果要编写旨在提供安全性的软件,请不要通过猜测或反复试验来做到;使用由知道自己在做什么的人编写的(现有)软件,或者雇用或咨询此类人。编写似乎可以运行并通过测试但实际上不安全的“安全”软件很容易,并且(与您不同)真正了解主题并知道如何发现这些缺陷的人将是您或您的用户的敌人。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.