openssl生成的私钥不满足n = p * q [英] Private key generated by openssl does not satisfy n = p * q

查看:219
本文介绍了openssl生成的私钥不满足n = p * q的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用以下命令生成了一个包含openssl的密钥

I've generated a key with openssl by using the following command

openssl genrsa 1024

我有以下结果

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC2Lh4HLcCR76Wv3oXl6sZ7pv8l9b/66H+I6Bb86tz8RhWCmTCG
xPVgtZ+w9WutU/rqBHHZOpotX4QDksRD8dRFh6a3HwkIFQdTcDoiD39yNP8F02Gd
dAl8p/URC5jNCLMSfUK38wMocmoI1I5vqdMNrzUnOup18rl4089Z+faMKQIDAQAB
AoGBAJrL4z5iWiengxqV8yETBeU8WcJft+n0dapXzHDNAUo8Izr+AIYEBp1Ot4se
f4igu6zuae80JJ45c2u14p/5dWzN9/URmhTP8xLGjGCjltOJLLyhBPP+ZsLjqu6l
57MNV6jDqDLdRC66w4NMRCN3FACxcldIC5L6B9OA7UvO1ugBAkEA8s1o6BvufTeD
ktyOMfW0ZeLGk/6EXp8nf7BIzYhAAPtSt8DegnfYFx2XDgKnYSB15dTDIDMe/KaA
GcuUb/ZjiQJBAMATb1fFdl7PGccVPgeTaupJayHPySc9PSsACV6VIAnpcU/3NZzd
MkdIL/JsOsD+1M9uQJqvRZO4qQdjcR5Om6ECQEJGgYlB/pJdcePHomTOvcRF55CE
G9u8M8rt8qFvvJDICWcxFUulrO16XT4syUWA1825it2iNqYeSL9By63YIokCQBnm
RPw71xM/r8UleyDAYwlGbxi3EPOmkUnsDldfmltby/ixZ9xIA1CTTkvNBjsh4YY6
4qE5AxPBMaGaahVhGiECQHyQvXUNE2IUco+ZwmmLnb2ey1s5tBg7i0lEZG47G7GV
o+yKdJHpToJD8eRJA/2D+pMhQIZm8X/XDIoi1AQ/TRY=
-----END RSA PRIVATE KEY-----

使用 http://lapo.it/asn1js/ 我在上面反编译了 pem ,发现

By using http://lapo.it/asn1js/ I've decompiled above pem and found out that

p = 12716592588957205057720227362856602359162165918588008158928004904780617816265357754968000322907349867949577092305558696339499022301055839537975977118688137

q = 10059832080410675679274931119486090017360564066559599189867309386706046720813347145402059918876964980032136051476889631968099168811652389989474036177869729

但在平均时间模量

n = 127931248913253271289716500205639992466284651287857358177145251825312810367993147780821624164062592337708505486275588028025122128928225266601591073331803580493341719724935049328478344297205955905466581637169109448199715137939448946445804542355907923908845024638480376219852266194827768486624319018352514599977

当它应该等于:

N = 127926786079904340486324750015310657558743663036816604629670248604945247855865212421871439992814824964459404054462886419168595224468110358113599485755243718536935880977456835036272916419632947427885989469252242704342884476060911074859116149906854382812141105735147419775039435625802885168567201322191763704873

凭啥 N 不等于 p * q

下面是一串由生成的密钥我的openssl,我使用Mac OS X小牛,第一个键有正确的N,第二个不正确,我没有检查其他,但无论如何这个问题似乎是再现,我使用下面的openssl版本 OpenSSL 0.9.8y 2013年2月5日:

Here is bunch of keys generated by my openssl, I'm using Mac OS X Mavericks, the first key has correct N, the second one incorrect, I haven't checked the others, but anyway this issue seems to be reproducing, I'm using the following openssl version "OpenSSL 0.9.8y 5 Feb 2013":

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDb4ZTDCASpFV+89RzD8MYR/xASV/piyXB3+qVq+PueDqq+45EL
Xt5UE2jXanfOh3uE3G3Fi76rm08XUC0CvFB7DxFJAMvchr5LbE9x2EMDmfpuZPOI
bDI+r+XZ+KJF++h296TOnncgnXILoD1gihkld7MS9g49TwsBPOtsMJzDRQIDAQAB
AoGBAMpGFfTormjhacZJcqHqIDwz+RP27TbtetJUuNHUpJw9f+PFMwxTxJFxnZP1
tKtAxWdu5GjDaq8xW6vlrNKEbD9jg2WU/myYffNeHxNVjivzypeQzBSmcE5LKFpM
objHkvXbBkkyX8Oh6ZF/3+NOhxOVZMH7CaZ90a+xPf7ENXJBAkEA+Zx/rwrx81+D
s79thCAUU4EnMVROGFPr/V7mt9AFXjAXHRuvg49Aon23bt48jdroakV5vk0ltKO8
Z5xnRWlGNQJBAOGCSOL+zFJd6zTM+CkbgGtml+DIunr7Avfu2mZyaMv4mLo+GTRN
ctZEKhknYfydewhORLKg51WdLThoe9VG6tECQCUyIvzMnr1rkE6qygEUXrMK3fJF
49VQPCxnhe4CO6qLdAZMZ90s7a7JGRqWV2O0KUoczEWFbYb7l0nBTspTI7kCQGmT
L0BmfY3KPoWXuE62e2bMvyoTj4pn3bnpbwIrafikSAxZaj9cSvkZLIReNbeomqMG
0Y63WdZxIWyZLfBppSECQQCEIkbINrQPJHoLtD57AbptUeyaE5lQBurzXMVf84FA
OJjd5OKmEX+LYbLguzOjvkcysNEZBRphz4L07shvscBC
-----END RSA PRIVATE KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDTzIPHUoq9I+Fmdc8kdpuu6BSzLAmLsXv1FKXdHSYSmqI3HRTs
ZcYDSM1Vp/Svf6jdt2uNuNt0UaXzFowT9fi+sIFE2Zlpl8nEM66YZYHJfHQXy6GR
h2ybiNcDEigasc1wBvbkdSR9RNLUnLzX6YNY+197CY6vgW0R0pzuRRR/JQIDAQAB
AoGBAKAeu3mTM4QufhdB9WoxqR0gI5YZMtZDRd1Q0NxLTx89fGmCOPFHN93/ygx5
v4h2UKneIxevq2lS2MzgPOJSUMwn14/19iujT2+jC6vHKpwcjkGrnLXdsdjowrHJ
X3tnbZC4pS/2UU8r/QKzwX957+Idn4Mt2v2sDzQj5ZoPRtfBAkEA/GLl6BXQQp/4
ymsytyM6gleLdaIklCESUc6yZpY48HJqqg3lJwy/3bgb9fYlok/DPbyiEK/p+cXL
lXycbdA6HQJBANbU2MAwpBprkyliEvb+WAvyIGuf3xCVJq3CicuWfJphtMdUEsQm
cpGbQp/0bXUuFkks/xOFMKfBkAbn7Z5tCqkCQQCffcP56ScFo2AuUpXnA50q1zXr
LX7eGRQhnHRCvfXXhQaA1m0UQ0tQStNomJdpvewMrJLh5rj+PY+MtQWJo8fFAkBm
H5RR+E1qSc0RFRAS3eGY/CaxQrRVO7HBVAMRBp6A/QVk4/Bv0h8QXJAVXapS0+/A
JWW0L9JrTLZcsg/hCdDRAkEAmHZNomd/wptVccGwXtgXIL5ElQWLL/3WEggCqOIp
c+v9IRpKND9qn1zwu3tnBrrUbmC2M8CEOnuHP+lnumc2YQ==
-----END RSA PRIVATE KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCWVkOkNXkWd2QoWudAD8rrzioby2g8k1pruaclCMo2mSns++TG
S3lWgLqS2mPynNONVbqoOedLKKnGY9HYzLCOCuoq5loOYCtIcVyBVGhx4eQrZgmU
AwRqQChztrj09+omveQQF2+QW9DJZrYSsKB836iTt5oAEA3ER6fwcV3fLQIDAQAB
AoGAQKNife4H3CMFS1yaZS7lHrIL5Nt2O+VXUU4HkaLP3t3H6v77BE9bIlhC3/VK
V/wZ8YDUupP64JPhO02b4k1P83oG5SAFTb0zZwmHI1+wVnNomq0DoRPw2710a2P4
Ya09nLbuRlm6SzsAkuwmyv+fPDas8b/m15kWSP/HTKMbAPkCQQDEUaTQUg/8sPH+
jDraHpjGtVRqjkysAZhNgMH+NGWLbk3nujZj4oMfid+4Xg4/Sr5EADqr0HrSlMnV
hhlwBCxjAkEAxAodCSmu9khiuRzMzXAc/gvqdtq+fF6Zx+rTUF5HYeD7l1u3SXes
whDku23Pp41+A4axWHXHTsDlKv49m9YzLwJBAJWIEl9SgjbYmBpouVL2RyvjZf8b
kC7bsCQoVJrJUicXx2MfpNoD6BgXrj4B9hwjVDT7b7T6wPKwveNTlwCJTT0CQGNJ
W/tQCTTi5F0soO1LYuOn1U/s6ZzDrM77t5p0pWKFN+copGOpIO4I8E+dBhauKqxO
g3Nx80eHmolzynAqxDECQEmyZq1mFEpB6buwNhRmj/kyOGmA88IbovZhBT+Un/6o
heaaMVl7Hst7nhihxQ081c3mFuwnH/mjixKKkpVens8=
-----END RSA PRIVATE KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCm7mMUqExF5Nq2qzQ8gLVfq5AqKQlKm47Df4H/XqH9msGNCoIx
tnH4Tbe38tzA9TDRxxYQ6oCmTRUlKqstxb0j8NK7KV63vrxhLUlCIinMk9qcTL/T
tLm7/rBSZ7M6OjupzjjQ8Idu7Jd7HVITvFDYbDtd0uDh7Hd1GCrqrHnAoQIDAQAB
AoGABjMgVuoROx9OyC3/mKenFNCIYCh6Ad1ZJgWcTGG1Xnfa7GQRhcsi3Hf2dMx+
SmRQ1dmxBhvPf12phWHaTa7kYVvyXWVbp4OYPsU24/WuVfXysmA1FhO4OJMoTEqQ
FtNGmC05vhwNge+zuyiyj+4Rvhe4CRWeAlWQT9ucOZStoAECQQDdM7qny+KGMysi
sUttOal551Ow1GsM6vo990tZP5jKD/lYkLhi4GBtib66pdqyizUhQoS5stFgvUk9
ztc8cUKBAkEAwTEOaypn6oUtDZMAiIW8a0m0bNtkXRnSb6UaG6n3VEEz8wkjg2Kx
ZJWIl+vk1JZKlJUOWrH2FhJexEOMt20uIQJBAJWVS5341ABoTb0yI42DNsYG1qN3
ocSkigCpYDzEMvBBiR6JDwdeMBci1OWnDpM6a/1H3DUvZUOD/Slc3FQ1SwECQHfO
93UoWEeNjbIkXylLXt1eWSFFMcm3ENUiG73aO0MqKJBpM3fwhbiuL4afyUq5Zckd
Y0iFoupvPAwVJDhA4mECQQCG/UmJG+N0Stt3nn16QzJwwGu7djFXFgSYn8LGIrRM
E3pfC6OMcJ3exAR5t78Bth1VLbST2S2AWNaT0d0fsSA/
-----END RSA PRIVATE KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC0n8+Te4265j0QqqTyV0QnGbU/v9YWqTWAbfvNwXE5nZuJoLuP
yzL4wjcZknBjQCBLsO64a9rxZx5fmL3R+kHjcF6S8OBB9NEXRk70D+vFgHjexGR9
mOk/SXRjfFfaC/pMiSmbuJMFvGCEcii/9tpm03xYWMvpkjn1UEX69BE+TwIDAQAB
AoGADkEebJEvmjRZVVtiMQ3Z/wv0VdeZ2af45O3JFW/Ss61QfQgGRU7P8vnAx2/b
FroU0mRgMoWwfaSZrQms0UlisaI5lEQu7LbhQZqwV+Bz9h784RAHyHLoTTcHRJ/+
TvRT/naCcwzXzHoSQrXmruIbMh6w0KeqVveA9ZI7RMaAZkECQQDpv0ZWZln4ZXD0
nK96Pv78b7GwRxsBrT3qHFEMEK60B6lMK61shJxFMehb6Nh4UXVth6J295WmphsK
me53CPf5AkEAxdHcdE3ofZwiEKjV3or9aSinZA+AjUw8AqlDxkIS3EGx9qkdQWv+
2tVHJDzlRv68PmkpFotWZyBfKbbKEwzKhwJBALt5ON3FG3X5Tl4yaR9f9TzcDKS4
cvWmUBk7etl1a9lip6s7AM4fkgKBY76Lg0sE8mzVsz09l95gLSIUkckQ/WkCQQC7
BpvAFfxt7ZTDXWy+d3f42SfRUVq/vEisV22tXsDIHxBrXR48wSb1rFkTaMN4aNR+
yRvApcHtxExUeu34Lsq3AkB3HOVsRBj1UlZluiScIEfk1PX2gd84/NBbxT/mhrqi
/wb8sw7ltPobNN7vxlSu5bZG3EfjgEyCCv4EcLNB/uY6
-----END RSA PRIVATE KEY-----

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDqvM6BgcFGPrwR2A8tnphtH30ruwvE3RBPZk0CUzuqh7BQrPsr
oGNxP0D6ulWg/yWn25ovWjm3ksZ2TaD1PA7PVb3FbzYI3kIQIPFDX6przLwC+faH
J9tqFL1tiMUhjV7Mu8HXx44hTCA8vVbe/GwHn8y1sIZ3FIZnqAlpaFE75QIDAQAB
AoGBAJCHBWKpoHV+pM8bx2SgNFtjuu7U8I8aSTOJ2jpnQuJhPwa9KryWuQN+HaUC
WzyQPAAY7tre45CKd1VZwJOdkcOam4gdRUqrLVSXfYojDCOwn7O7Fwql26v2z42G
YNu/6umdQhsnVCpfked43d/sLuZH4keO2BQVZIS7wxUMMlm1AkEA/CEZ2RuL3Sc5
70+cGyDZ3OOfD3k/Szzz4OTA7yVFoqq6cpepWYYeJKGpno53qeg+WxHusq9TbWBS
1T3UoFz+fwJBAO5XWpiMwAKYg1GtAxkgszIDnkj9Vhe/AL81fvc9KnYFScQQAiZl
PN7MopH0n/oQM8jnXmkusQOmzpVlYBB0W5sCQQCDv7BIGPLfH45QlSMXsfTmTjNh
3JPMdw9hZ2fCD5HxzJEdLE8cLs81iRyfdAbnzCo5YIeA68kGkJz4PRUMr0t1AkBC
hfcvZPmiv9bHUTbwKIRbjU78qFkDP7iBpfjOITBcyJUSODWhadhXh15IxrJwJV2O
0aU0Tmfx0PkQEb+CWDfJAkEAzJPemI3yVYqXG2POBolG5gK2VkHEw7QCQOmMK60Z
+3H7U9F/AvoM3zpRujHBdRxdZlPSrCvbxhyavYhNXDqnjg==
-----END RSA PRIVATE KEY-----


推荐答案


为什么地狱N不等于p * q?

Why the hell N is not equal to p * q ?

使用提供的键确认。然而,产生我自己的的OpenSSL genrsa 1024 键,当我不能复制的。

Confirmed with the key provided. However, I could not duplicate when generating my own key with openssl genrsa 1024.

$ ./test-rsa.exe

***** P *****
12716592588957205057720227362856602359162165918588008158928004904780617816265357
754968000322907349867949577092305558696339499022301055839537975977118688137

***** Q *****
10059832080410675679274931119486090017360564066559599189867309386706046720813347
145402059918876964980032136051476889631968099168811652389989474036177869729

***** N *****
12793124891325327128971650020563999246628465128785735817714525182531281036799314
77808216241640625923377085054862755880280251221289282252666015910733318035804933
41719724935049328478344297205955905466581637169109448199715137939448946445804542
355907923908845024638480376219852266194827768486624319018352514599977

*** Calc N ***
12792678607990434048632475001531065755874366303681660462967024860494524785586521
24218714399928148249644594040544628864191685952244681103581135994857552437185369
35880977456835036272916419632947427885989469252242704342884476060911074859116149
906854382812141105735147419775039435625802885168567201322191763704873







$ cat test-rsa.c

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

#include <openssl/bn.h>
#include <openssl/evp.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>

const char s_key[] = "-----BEGIN RSA PRIVATE KEY-----\n"
"MIICXAIBAAKBgQC2Lh4HLcCR76Wv3oXl6sZ7pv8l9b/66H+I6Bb86tz8RhWCmTCG\n"
"xPVgtZ+w9WutU/rqBHHZOpotX4QDksRD8dRFh6a3HwkIFQdTcDoiD39yNP8F02Gd\n"
"dAl8p/URC5jNCLMSfUK38wMocmoI1I5vqdMNrzUnOup18rl4089Z+faMKQIDAQAB\n"
"AoGBAJrL4z5iWiengxqV8yETBeU8WcJft+n0dapXzHDNAUo8Izr+AIYEBp1Ot4se\n"
"f4igu6zuae80JJ45c2u14p/5dWzN9/URmhTP8xLGjGCjltOJLLyhBPP+ZsLjqu6l\n"
"57MNV6jDqDLdRC66w4NMRCN3FACxcldIC5L6B9OA7UvO1ugBAkEA8s1o6BvufTeD\n"
"ktyOMfW0ZeLGk/6EXp8nf7BIzYhAAPtSt8DegnfYFx2XDgKnYSB15dTDIDMe/KaA\n"
"GcuUb/ZjiQJBAMATb1fFdl7PGccVPgeTaupJayHPySc9PSsACV6VIAnpcU/3NZzd\n"
"MkdIL/JsOsD+1M9uQJqvRZO4qQdjcR5Om6ECQEJGgYlB/pJdcePHomTOvcRF55CE\n"
"G9u8M8rt8qFvvJDICWcxFUulrO16XT4syUWA1825it2iNqYeSL9By63YIokCQBnm\n"
"RPw71xM/r8UleyDAYwlGbxi3EPOmkUnsDldfmltby/ixZ9xIA1CTTkvNBjsh4YY6\n"
"4qE5AxPBMaGaahVhGiECQHyQvXUNE2IUco+ZwmmLnb2ey1s5tBg7i0lEZG47G7GV\n"
"o+yKdJHpToJD8eRJA/2D+pMhQIZm8X/XDIoi1AQ/TRY=\n"
"-----END RSA PRIVATE KEY-----\n";

int main(int argc, char* argv[])
{
    UNUSED(argc), UNUSED(argv);

    int rc;
    FILE* fd = NULL;
    EVP_PKEY* pkey = NULL;
    RSA* rsa = NULL;
    BIGNUM* n = NULL;
    BN_CTX* ctx = NULL;

    fd = fopen("./key.pem", "w+");
    if(fd == NULL) exit(1);

    rc = fwrite(s_key, 1, sizeof(s_key), fd);
    if(rc != sizeof(s_key)) exit(2);

    rc = fseek(fd, 0, SEEK_SET);
    if(rc != 0) exit(3);

    pkey = PEM_read_PrivateKey(fd, NULL, NULL, NULL);
    if(pkey == NULL) exit(4);

    rsa = EVP_PKEY_get1_RSA(pkey);
    if(rsa == NULL) exit(5);

#if 0
    fprintf(stdout, "\n***** RSA *****\n");
    RSA_print_fp(stdout, rsa, 0);
#endif

    fprintf(stdout, "\n***** P *****\n");
    fprintf(stdout, "%s\n", BN_bn2dec(rsa->p));

    fprintf(stdout, "\n***** Q *****\n");
    fprintf(stdout, "%s\n", BN_bn2dec(rsa->q));

    fprintf(stdout, "\n***** N *****\n");
    fprintf(stdout, "%s\n", BN_bn2dec(rsa->n));

    n = BN_new();
    if(!n) exit(6);

    ctx = BN_CTX_new();
    if(ctx == NULL) exit(7);

    rc = BN_mul(n, rsa->p, rsa->q, ctx);
    if(rc != 1) exit(8);

    fprintf(stdout, "\n*** Calc N ***\n");
    fprintf(stdout, "%s\n", BN_bn2dec(n));

    BN_CTX_free(ctx);
    BN_free(n);
    RSA_free(rsa);
    EVP_PKEY_free(pkey);
    fclose(fd);

    return 0;
}

这篇关于openssl生成的私钥不满足n = p * q的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆