我和OpenSSL一起玩。我看到不同的openssl类型使用BIGNUM类型。
例如:
typedef struct DSA_SIG_st {
BIGNUM *r;
BIGNUM *s;
} DSA_SIG;typedef struct ECDSA_SIG_st {
BIGNUM *r;
BIGNUM *s;
} ECDSA_SIG;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 */ ;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;
};BIGNUM in OpenSSL是:
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;
};我不明白如何为特定的算法选择大数,以及大数组的大小如何?
发布于 2020-03-03 06:38:25
首先,您不自己分配实际的bn->d值;BN_*例程为您分配它,并根据需要重做/更改它。对于OpenSSL的非过时版本,这些结构(以及几乎所有其他结构)都是不透明的,您根本无法直接访问它们,尽管我能够理解想要了解它们。
对于使用数字(而不仅仅是位模式)的密码算法,您使用的数字取决于算法。如果维基百科文章实验室的PKCS1链接不再工作(post EMC和Dell),则使用稳定的IETF复制RFCs 2313、2437、4347、8047。ANSI/X9和ISO对RSA还有其他的标准,但它们的使用较少,没有明显的差别。有关数字减影技术,请参阅再一次维基百科和(免费) FIPS。对于ECDSA,您可以看到付费的X9.62或免费的SEC1从SECG,但实际上,这只是简单的适应数字减影技术,以一个(大型)类魏尔斯特拉斯形式的椭圆曲线。对于DSA和ECDSA,出现在签名中的值都是计算出来的,从来没有被选中过,尽管它们受到每个操作的影响,每个操作都可以并且通常是随机的,一致地在1,n-1中,其中n是子群的阶(大小)。注意,对于ECDSA最常用的“素数”曲线,如P-256和P-384,曲线的设计使得子群阶等于曲线的阶数,而曲线阶又接近但不等于下素数场的模数。然而,这是这些特殊曲线的性质,而不是ECDSA或ECC的一般特性。
实际上,所有算法的密钥要么通过直接调用或使用OpenSSL API调用适当的密钥生成函数来生成(在EVP_PKEY_*中),要么通过一个正确实现的过程从其他软件或系统中导入。类似地,应该通过直接或通过EVP调用用于签名的函数来创建签名,或者从其他正确创建签名的地方接收签名。所有的OpenSSL代码都是免费的(包括言论和啤酒),所以你可以看看它做了什么;有些人(包括我)发现,至少有时候在一个有一个好的源代码级调试器的系统中编译这样的代码是有帮助的,并逐步了解它所做的事情。
标准警告:如果您只想玩密码,或者像OpenSSL这样的特定实现,那么请自便。如果您要编写旨在提供安全性的软件,不要通过猜测或尝试和错误来完成;要么使用(现有的)由知道自己在做什么的人编写的软件,要么雇用或咨询这些人。编写看似有效并通过测试但实际上不安全的“安全”软件是非常容易的,而那些真正理解这个主题并知道如何发现这些缺陷的人将是您或您的用户的敌人。
https://stackoverflow.com/questions/60491290
复制相似问题