关于密钥文件及密钥数据的结构和存储
关于BCD、ASCII和BINARAY储存示例:2015
BCD:0x20 0x15
BINARY:0x14 0x0f
ACSII:0x320x300x310x35
关于hash值
使用公司提供的SHA256对文件计算hash值,得到的是一个32位的16进制数
工具生成的密钥文件数据结构:
typedef struct{
unsigned short BitLen; // 表示模长度
unsigned char n[1024/8]; // 公钥模
unsigned char e[4]; // 高位在前,前补0
}RSA_PUBLIC_KEY_1024;
typedef struct {
unsigned short BitLen; // 表示模长度
unsigned char n[1024/8]; // 公钥模
unsigned char e[4]; // 高位在前,前补0
unsigned char d[1024/8]; // 私钥
unsigned char p[1024/8];
unsigned char q[1024/8];
unsigned char dmp1[1024/8];
unsigned char dmq1[1024/8];
unsigned char iqmp[1024/8];
}RSA_PRIVATE_KEY_1024;
typedef struct{
unsigned short BitLen; // 表示模长度
unsigned char n[2048/8]; // 公钥模
unsigned char e[4]; // 高位在前,前补0}RSA_PUBLIC_KEY_2048;
typedef struct {unsigned short BitLen; // 表示模长度
unsigned char n[2048/8]; // 公钥模
unsigned char e[4]; // 高位在前,前补0
unsigned char d[2048/8]; // 私钥
unsigned char p[2048/8];
unsigned char q[2048/8];
unsigned char dmp1[2048/8];
unsigned char dmq1[2048/8];
unsigned char iqmp[2048/8];
}RSA_PRIVATE_KEY_2048;
RSA库使用的格式,0x4B表示4 Byte (1 Byte = 8 bits)
privateKey->bits 0x4B length in bits of modulus 4
privateKey->modulus 0X80B modulus 256
privateKey->exponent 0X80B public exponent 256
privateKey->prime[0] 0X40B private exponent 128
privateKey->prime[1] 0X40B prime factors 128
privateKey->primeExponent[0] 0X40B exponents for CRT 128
privateKey->primeExponent[1] 0X40B exponents for CRT 128
privateKey->coefficient 0X40B CRT coefficient 128
publicKey-> bits; /* length in bits of modulus 模长度*/
privateKey->modulus 0X80B modulus 256
privateKey->exponent 0X80B public exponent 256
卢建兴补充:typedef struct {
unsigned short BitLen; //表示模长度
unsigned char n[2048/8]; // 公钥模
unsigned char e[4]; // 高位在前,前补0
unsigned char d[2048/8]; // 私钥
unsigned char p[2048/8];
unsigned char q[2048/8];
unsigned char dmp1[2048/8];
unsigned char dmq1[2048/8];
unsigned char iqmp[2048/8];
}RSA_PRIVATE_KEY_2048;
typedef struct {
unsigned int bits;/* length in bits of modulus */
unsigned char modulus[MAX_RSA_MODULUS_LEN]; /* modulus */
unsigned char publicExponent[MAX_RSA_MODULUS_LEN]; /* public exponent */
unsigned char exponent[MAX_RSA_MODULUS_LEN]; /* private exponent */
unsigned char prime[2][MAX_RSA_PRIME_LEN]; /* prime factors */
unsigned char primeExponent[2][MAX_RSA_PRIME_LEN]; /* exponents for CRT */
unsigned char coefficient[MAX_RSA_PRIME_LEN]; /* CRT coefficient */
} R_RSA_PRIVATE_KEY;
static void InputSK(R_RSA_PRIVATE_KEY *privateKey, unsigned char *SK, unsigned int skLen)
{
unsigned char *tmp;
int modulusLen;
int primeLen;
RSA_PRIVATE_KEY_2048 *pPriKey_2048;
pPriKey_2048 = (RSA_PRIVATE_KEY_2048 *)SK;
privateKey->bits = pPriKey_2048->BitLen;
memcpy(privateKey->modulus, pPriKey_2048->n, 256); // n
memcpy(privateKey->publicExponent+256-4, pPriKey_2048->e, 4); // e
memcpy(privateKey->exponent, pPriKey_2048->d, 256); // d
memcpy(privateKey->prime[0], pPriKey_2048->p, 128);
memcpy(privateKey->prime[1], pPriKey_2048->q, 128);
memcpy(privateKey->primeExponent[0], pPriKey_2048->dmp1, 128);
memcpy(privateKey->primeExponent[1], pPriKey_2048->dmq1, 128);
memcpy(privateKey->coefficient, pPriKey_2048->iqmp, 128);
私钥文件中的 密钥数据 部分解析:
/* BitLen 0x0800 = 2048 转换成rsa使用格式时,后补0,即0x00080000;在InputSK中执行P2DW(x, p)后,得到0x00000800 */0008/* n[2048/8] */
a9c40a368d9a7f0fb261e597834784194705728a74f453ad10476a77cba01e76af849a945671e1d05e0031ec2326a1e8537a0e36190fb899977ac794627cd55e1a5d9877ca2fd8ab1ddb49ce68b055fdbe0f2a5768ebccad069419864c21e33fd469d340be94076a853f652526408efa76bca29e65b870320ddce6da42a82542090c4040c5b238056fd09192ad6a45c64a4a663f2ca937a2b9ff2c5d055b62fa687ac3c9b355c99eb7253339db03874c796f63d658f87805f53cadf6a2fb0f1addaafb59af8436f091fe74852f19fd85b13ffbe695479bf84c6d954f504ae3ced5b61206e06515a66f03684c7909b3c66e4b63dfe8decc7fa37958d55b794dc5
/* e[4] */00010001/* d[2048/8]*/
16ded735643c4513db473f03fb669e103db6292927fa666f713afdc7e7c1c978d9ca767cb76c9e2c510d9bac214c2a11bf753906e6b76c7a1ca328d1ffb6ab9402df4b14104403df81a5323b41754810681368f3dfa9aca83eb3a300a9af030b6d55586567874fbc74f9066a4bcdf4b51f5be8588881a173ccd44eb166bb7a5143d743720727ff488f2bb36a57c5f0cbcee7d67e314663950e9f2e78f9224be05e5b6106ee658e4919861fe65937d0958e489f0211b50ede22fecc77d376bf1c10d38f5b990b9250fb7d899e5470fbd23bb511a04476902fb4583d409f37a8881cd9c42cc65f64a82fba836ebd64c503f8c31f41d4a6eb8f3010a982f2a7c4a1
/* p[2048/8] */
de5c4b30bdbece7db1a65f23374334cf3f463a485dfeb566c99870d2bc7aa7d216d2611b566c81749e40d8b3e89e1322da5b085d6dc55bed0a342acc0067f1fd5d6ceb4bd506d76a035e1ca668afecaff1705a61b5cb83141b59a1fcd896c4ab7b1b569160c2572ed8e3c700e54429add76be5b10028fc766d7122972cdad7190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
/* q[2048/8] */
c372d3a6ca1a5e865debf4bb6518595faabba48e0dc5a70b990f742d991239d1a524884ede72c97e646b1c9abbad65a00ad235dfd4de99c1ef9dcbc823ca55504d7b7f9fa8d0d71d8aa38efe85f2d4494f369cdeba1d59bf0883daf0e9e1125b980524fc839a6be68a5c325a059f2341cc5675d57d6f42c47955abb6e28b1d8d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
/* dmp1[2048/8] */
d3206abc22cd529e81d8e82835c67813f78e24b4a59abc7e961749b8ae00ffeb38841473b28160016c6941d8c09ba6abc70bfc4b4978c4a9b2b0899a1d2094e1ee9d06648025f8cecdd7c3f8351a24ef819d1e13fc5af96053ffad10b84d9efafaeea02974e7d183c7a7ae42296da8ed48c747d5e1c308c32172f456f9dde7b10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
/* dmq1[2048/8] */
29fa73b3131d6ec7f54c44982b327b9fac8ff8dbf9e145eb9bc851efa93cdce6464dfe68d2265d58a440cd37feaf5370786285e7b954c6397d39ab172578c3b227b22acb23fb16f8e55a13d05efcb4d3ba0bc4cda1b3c41edfb95241043aaf32b50805d5a67e78465fd945874845d1d0c40e9de868b488e6a218e074bb5b9dd10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
/* iqmp[2048/8] */
dc2a76512d32e673b1f9286a45aa194f6b8aaa0b98c6768e63881b68a61abded2a930992aab2ccef5a54495bfb4aecc02412ef8486556e31bf89f4b2861c7b359b2e51ee4511b69c6319dcbfd4e4aaa78d276fc145b6764a96832b464f2ae8496a68dee37e03ea5cdec84d1f13893bce653a272c41f910b0a59c0bdd525e6d1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
公钥文件(2048) 密钥数据 分析:
//unsigned short BitLen; // 表示模长度 /*
BitLen 0x0800 = 2048 转换成rsa使用格式时,后补0,即0x00080000;在InputSK中执行P2DW(x, p)后,得到0x00000800 */
0008
//unsigned char n[2048/8]; // 公钥模A9C40A368D9A7F0FB261E597834784194705728A74F453AD10476A77CBA01E76AF849A945671E1D05E0031EC2326A1E8537A0E36190FB899977AC794627CD55E1A5D9877CA2FD8AB1DDB49CE68B055FDBE0F2A5768EBCCAD069419864C21E33FD469D340BE94076A853F652526408EFA76BCA29E65B870320DDCE6DA42A82542090C4040C5B238056FD09192AD6A45C64A4A663F2CA937A2B9FF2C5D055B62FA687AC3C9B355C99EB7253339DB03874C796F63D658F87805F53CADF6A2FB0F1ADDAAFB59AF8436F091FE74852F19FD85B13FFBE695479BF84C6D954F504AE3CED5B61206E06515A66F03684C7909B3C66E4B63DFE8DECC7FA37958D55B794DC5
//unsigned char e[4]; // 高位在前,前补
000010001
//CRC
5C242A2700000000