Cryptography openssl生成的私钥不满足n=p*q

Cryptography openssl生成的私钥不满足n=p*q,cryptography,openssl,rsa,Cryptography,Openssl,Rsa,我已经通过使用以下命令使用openssl生成了一个密钥 openssl genrsa 1024 我得到了以下结果 -----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQC2Lh4HLcCR76Wv3oXl6sZ7pv8l9b/66H+I6Bb86tz8RhWCmTCG xPVgtZ+w9WutU/rqBHHZOpotX4QDksRD8dRFh6a3HwkIFQdTcDoiD39yNP8F02Gd dAl8p/URC5jNCLMSfUK38wMocmoI1I

我已经通过使用以下命令使用openssl生成了一个密钥

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-----
通过使用我已经反编译了上面的pem

p = 12716592588957205057720227362856602359162165918588008158928004904780617816265357754968000322907349867949577092305558696339499022301055839537975977118688137

q = 10059832080410675679274931119486090017360564066559599189867309386706046720813347145402059918876964980032136051476889631968099168811652389989474036177869729
但同时,模量

n = 127931248913253271289716500205639992466284651287857358177145251825312810367993147780821624164062592337708505486275588028025122128928225266601591073331803580493341719724935049328478344297205955905466581637169109448199715137939448946445804542355907923908845024638480376219852266194827768486624319018352514599977
当其应等于:

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


编辑: 这是我的openssl生成的一组密钥,我使用的是Mac OS X Mavericks,第一个密钥有正确的N,第二个不正确,我没有检查其他密钥,但无论如何,这个问题似乎正在重现,我使用的是以下openssl版本“openssl 0.9.8y 2013年2月5日”:

为什么N不等于p*q

用提供的钥匙确认。但是,使用
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
#包括
#包括
#包括
#包括
#包括
#包括
#包括
const char s_key[]=“----开始RSA私钥------\n”
“MIICXAIBAKBGQC2LH4HLCCR76WV3OXL6SZ7PV8L9B/66H+I6Bb86tz8RhWCmTCG\n”
“xPVgtZ+w9WutU/RQBHHZOPOTX4QDKSRD8DRFH6A3WKIFFQDTCDOID39YNP8F02GD\n”
“dAl8p/URC5JNCLMSFUK38WMOCMOI5VQDMNRZUNOUP18RL4089Z+faMKQIDAQAB\n”
“AOGBAJRL4Z5IWINGXQV8YETBEU8WCJFT+N0DAPXZHDNAU8IZR+AIYEBp1Ot4se\n”
“f4igu6zuae80JJ45c2u14p/5dWzN9/urmhtp8xlggjgcjltojllyhbpp+ZsLjqu6l\n”
“57MNV6JDQDLDRC66W4NMRCN3FACLDIC5L6B9OA7UVO1GBAKEA8S1O6BVUTED\n”
“ktyOMfW0ZeLGk/6EXp8nf7BIzYhAAPtSt8DegnfYFx2XDgKnYSB15dTDIDMe/KaA\n”
“GcuUb/ZjiQJBAMATb1fFdl7PGccVPgeTaupJayHPySc9PSsACV6VIAnpcU/3NZzd\n”
“MkdIL/JsOsD+1M9uqjqvrzo4qdjcr5om6ecqejggylb/pJdcePHomTOvcRF55CE\n”
“G9U8M8RT8QFVVJDICWCXFUULRO16XT4SYUWA1825IT2INQYESL9BYIOKCQBNM\n”
“RPw71xM/r8UleyDAYwlGbxi3EPOmkUnsDldfmltby/IXZ9XIA1CTKVNBJSH4YY6\n”
“4QE5AXPBMAGAAHGHGIECQHYQVxUNE2UCO+ZwmmLnb2ey1s5tBg7i0lEZG47G7GV\n”
“o+yKdJHpToJD8eRJA/2D+pMhQIZm8X/XDIoi1AQ/TRY=\n”
“----结束RSA私钥------\n”;
int main(int argc,char*argv[])
{
未使用(argc),未使用(argv);
int rc;
FILE*fd=NULL;
EVP_PKEY*PKEY=NULL;
RSA*RSA=NULL;
BIGNUM*n=NULL;
BN_CTX*CTX=NULL;
fd=fopen(“/键.pem”,“w+”);
如果(fd==NULL)退出(1);
rc=fwrite(s_键,1,sizeof(s_键),fd);
如果(rc!=sizeof(s_键))退出(2);
rc=fseek(fd,0,SEEK_集);
如果(rc!=0)退出(3);
pkey=PEM_read_PrivateKey(fd,NULL,NULL,NULL);
如果(pkey==NULL)退出(4);
rsa=EVP_PKEY_get1_rsa(PKEY);
如果(rsa==NULL)退出(5);
#如果0
fprintf(stdout,“\n*******RSA******\n”);
RSA_print_fp(标准输出,RSA,0);
#恩迪夫
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();
如果(!n)退出(6);
ctx=BN_ctx_new();
如果(ctx==NULL)退出(7);
rc=BN_mul(n,rsa->p,rsa->q,ctx);
如果(rc!=1)出口(8);
fprintf(标准值,“\n***计算n***\n”);
fprintf(stdout,“%s\n”,BN_bn2dec(n));
BN_-CTX_-free(CTX);
无BN_(n);
RSA_-free(RSA);
免费执行副总裁(PKEY);
fclose(fd);
返回0;
}

您好,我已经用这个命令测试了您在编辑中提供的所有6个私钥

$ openssl rsa -check -in privkey
它们都返回
RSA密钥ok
。除了第一个,它返回
RSA密钥错误:n不等于pq

我对你问题的回答

为什么N不等于p*q

是:N不可能不等于p*q。第一个密钥可能已被修改,或者在传输过程中已被更改,因此无法通过rsa检查测试。深入研究openssl源代码,我们可以看到
openssl genrsa
命令是由

int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
/crypto/rsa/rsa\u gen.c
中。在ln:289时,模量
n
通过以下公式计算:

/* calculate n */
if (!BN_mul(rsa->n,rsa->p,rsa->q,ctx)) goto err;

这意味着n=p*q。您应该寻找导致问题的其他可能性,而不是对genrsa命令产生怀疑。

bug??看起来输出文件中有几个高阶的N位出错了。指数与p和q是一致的。现在这真的很奇怪,它看起来不像一个bug,如果我用
p*q
作为模手工签名一条消息,我会得到与opensslIf生成的结果相同的结果,如果它只是
n
被破坏,那么OpenSSL应该仍然能够成功解密/签名,因为在这个过程中它实际上没有使用
n
,而是利用了一种更快的算法,使用私钥中包含的其他字段(请参阅:)是的,我已经知道CRT需要所有其他字段,但无论如何,
n
等于什么?当使用
openssl rsa-check
时,您发布的所有其他密钥似乎都正常,您确定这不仅仅是一个一次性问题(您生成的第一个密钥可能存在某种磁盘损坏?)不确定你的观点是什么-OP已经给出了预期的模量,这就是你在这里计算的全部。问题是存储在PEM密钥中的模不是
p*q
(通过
openssl rsa-check
运行它可以很容易地进行检查,它返回:
rsa-key error:n不等于p q
)。“问题是存储在PEM密钥中的模不是
p*q
”-好的,谢谢。这还不清楚。我觉得脚本在执行乘法
p*q
。为什么n!=p*q?“为什么n!=p*q”-对不起,我不知道。你能复制它吗?我无法在我的测试运行中运行。您使用的是什么版本的OpenSSL?@Lu4,损坏的内存可以修改存储在其中的数据(运行memtest?)。应该有ECC保护的内存来存储所有未修改的数据。
int rsa_builtin_keygen(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
/* calculate n */
if (!BN_mul(rsa->n,rsa->p,rsa->q,ctx)) goto err;