关于密钥文件及密钥数据的结构和存储

关于密钥文件及密钥数据的结构和存储

关于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

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值