RSA为一个非对称加密算法,基本包含的数据类型为
struct rsa_st {
BIGNUM *n;
BIGNUM *e;
BIGNUM *d;
BIGNUM *p;
BIGNUM *q;
BIGNUM *dmp1;
BIGNUM *dmq1;
BIGNUM *iqmp;
};
typedef struct rsa_st RSA;
下面只对秘钥生成的过程以及各个数值之间的关系进行验证
当我们生成一个对应的RSA结构体时候,其中对应数值之间的关系为
一. 各个结构体元素之间的数学关系
1. p和q为两个不相等的随机生成的质数
2. n为p和q的乘积
3. 计算出来n的欧拉函数φ(n),这个φ(n)虽然没有在结构体里面体现出来但是其实是作为一个核心数据存在的。
4. 随机选择一个整数e,条件是1< e <φ(n),且e与φ(n)互质。
这个在openssl里面一般都使用给定的预定义宏
#define RSA_3 0x3L
#define RSA_F4 0x10001L
5. 计算e对于φ(n)的模反元素d
ed ≡ 1 (modφ(n))
e和d之间的乘积除以φ(n)余1
最终的公钥为n 和e; 私钥为n 和d。
二.使用上述结构加密的过程
1. 加密的过程
me ≡ c (mod n)
m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
所谓"加密",就是算出下式的c:
me ≡ c (mod n)
2. 解密过程
cd ≡ m (mod n)
通过这个公式我们可以计算出来对应的m.这样就完成