首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用PolarSSL库标记字符数组

用PolarSSL库标记字符数组
EN

Code Review用户
提问于 2021-06-15 20:00:22
回答 1查看 41关注 0票数 1

我试着用RSA执行解密操作。我正在使用PolarSSl库。我有一个char数组key[],其中包含RSA私钥,如下所示,

代码语言:javascript
复制
N = D0C2ACDCF780B1E4846054BDA700F18D567247FE8BC5BA4FBCAB814E619DA63A20F65A58EE89FC0824DC9367C5725BDDC596065F1C8868E99C896F3A0CF7D7F0A785E668F2568F19BAFB8FF3BA5CDF487544EFE71010BEDB4EE16EDC3AF0A71391AD3194B42D3FD40B4E0DE12A22D8188AF03FF4E36D37BA1DA1F3C57188E60DA38C25329E48805FC7FF524761A6F010E737B927D8F67383274F8E600167A52A042E1DCA3335150C090803F9D96F6E63BEBFB153516E863F5B4CB02104077834FC5EC31A47451783931D643CE736DD1BAB40C5523858BB067FB9E490DCB5FDBBB03B9D68A8998C1347E237C477AA14B0997A84708CED05A9E24C7072B838F753
E = 010001
D = 21AFE07431CE47269083F8F8B7ABCBCEDA6DCB975457BE6662942C64091586FEE755C9A3832EAA0868665DB507A41A15F1EDF12E44ECF03D0E61111D457D730FA700D0FB0B6C13607C0F5F1DDDEB61AE9019E53A9C998F2AD5924430EEA3E9DA1B0E5F2B575DDBE86C4096B5C87661F7A7E7F7F21D0701509BBA881B4AE463F6F18C7F04AB742319E2D7319EECA136EEB0CF7B2BFA87E3A0E69FBC0E5FDC7EE6271EB2CA09DDBF7C8B57D951762708D76890E62858C1D5FC5B7E40D50913CE7797BD80F6A398FB92703FBDD33FBCB129B86E54F13EC14DA68BE139634DD1E9C01F01751C427B029AF629EED23C99726F0A0C3CEA1229E4099B588CE676975D25
P = FD1120F3E183DF72779B9B4A29FF9157C89FF8204988B6FB1211642B4D59B6A1BB306E81C040F0F822B41765FC4435A46B5090700E72B9720481EACF3624885D7A263CAC0CA559954E9382FCC7D57221CD9394C64585653664976174CAE2E7DC6A7B03DE09599B5D9501927ACC4EED5F5CBC5870E31A051AF9842945A0168E35
Q = D32E15E032B256C7DE0BDB585379EB897343ABFB8C7A86A3D798C13AE3E3F048A50DA9D7C31EB65A588CF6B9911F7B41D6F154F99B4F64839E110C30BA4B79286A4A3A3F7F0169A1D3A21F0D084CFA423E04C90C5966AC391A47F10E823C71B9716856B05BC12160DF0BA96300F8ADDC0D59E54E9CBDC7AC0EA6747DBA46C067
DP = 2004DECA7CAA16C780E2AB4F42E91716A847B53940948FB24CA2EEAD9BE7D1F7BC9B701FF29744E5E05E30E7B2775EE222C1DAC492CF692F47EAB82EE786CFCA23FE5A86DA42C186E69E3B608858354C999A26A4BF7F1543408EF6C1B439E9643604C2848162590A0A245CC834B977C72D10979010EBE5E177D884F04E450C51
DQ = 9A035E48E8305041EB9AD21994A7B233C8306E59429689632C7567573FA4993521CAD93756422BD3B008FE574F939A1CE659931387455B94F1CE950964946E841F208B628B89C83411588734C5FCFDF719ABFBC459DF1B7379CB45EEC2E4BA3BF88D93CB82DF532C86FEC646420B1B21054BAE84AAA36DDFF9BF43EDFDD063B9
QP = E7A5BC150E6A20E52920C6F24FC872B1893ED9268AA506D86EC3AA6E3B377E5F6AE0D686751CE40F684435C6F64F31888861389CE430FB271EE81D0067ED8A1BD8096FB3E4AF5839383F26F99916EED4D80CFA9B5901350A9C0AAD4E348EBCC559F92434C71DA864C13371626D9F29998748BB3C47BED31471B73ABF2E27B983

我标记char数组并使用以下代码块将每个令牌读入rsa_context,

代码语言:javascript
复制
// tokenize key and read into rsa context
const char s[3] = "= ";
char *token;
int k=0, size;

// get the first token
token = strtok(key, s);

// walk through other tokens
while( token != NULL ) {
    size = strlen(token);

    switch (k) {
        case 1:
            token[size-1]='\0';
            mpi_read_string(&rsaContext->N, 16, token);
            break;

        case 3:
            token[size-1]='\0';
            mpi_read_string(&rsaContext->E, 16, token);
            break;

        case 5:
            token[size-1]='\0';
            mpi_read_string(&rsaContext->D, 16, token);
            break;

        case 7:
            token[size-1]='\0';
            mpi_read_string(&rsaContext->P, 16, token);
            break;

        case 9:
            token[size-1]='\0';
            mpi_read_string(&rsaContext->Q, 16, token);
            break;

        case 11:
            token[size-1]='\0';
            mpi_read_string(&rsaContext->DP, 16, token);
            break;

        case 13:
            token[size-1]='\0';
            mpi_read_string(&rsaContext->DQ, 16, token);
            break;

        case 15:          
            token[size-1]='\0';                
            mpi_read_string(&rsaContext->QP, 16, token);                
            break;
    }
    k=k+1;
    token = strtok(NULL, "= \n");
}

以上代码块工作。如何才能实现相同的目标:将char数组标记化并在速度和最小步骤方面更有效地将每个令牌读入rsa_context?

EN

回答 1

Code Review用户

回答已采纳

发布于 2021-06-16 08:49:31

我不知道这个库是如何工作的,但一般说来,用查找表替换switch对可读性/维护和性能都有帮助。因为只有15项,所以我们不需要为这样的表使用太多的内存,并且可以在其中保留空项。

定义一些结构,使其包含不同情况之间的所有内容,如以下伪代码所示:

代码语言:javascript
复制
typedef struct
{
  something* rsaContext;
} context_t;

然后分配一个查找表并使用指定的初始化器进行初始化:

代码语言:javascript
复制
const context_t context [16] = 
{
  [1] = { &rsaContext->N },
  [3] = { &rsaContext->E },
  ... // and so on
};

这个表需要放在本地作用域中,因为rsaContext不是一个常量表达式,而是另一个变量。

在C中初始化的方式,这意味着表中没有显式初始化的所有context项都将被设置为所有零,或者在指针的情况下为NULL。因此,所有未初始化的"rsaContext“成员都将是空指针。

现在,您可以用一个表查找来替换整个开关:

代码语言:javascript
复制
something* dst = context[k].rsaContext;
if(dst != NULL)
{
  token[size-1]='\0';
  mpi_read_string(dst, 16, token);
}
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/263085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档