因此,我使用的是一个专有库,它有自己的实现来创建 RSA key 对。公钥结构如下所示:
typedef struct
{
unsigned int bits; //Length of modulus in bits
unsigned char modulus[MAX_RSA_MOD_LEN]; //Modulus
unsigned char exponent[MAX_RSA_MOD_LEN]; //Exponent
} RSA_PUB_KEY
我需要找到一种方法来提取指数和模块,以便我可以将它们发送到服务器作为验证方案的一部分。我想这是一个非常标准的程序(或者我希望如此)。我已经读过这两个类似的问题:
但到目前为止我还没有运气。我也不确定如果有必要的话如何使用“位”字段来提取模数。简而言之,我要做的就是能够在 Java 中重新创建这个公钥:
BigInteger m = new BigInteger(MODULUS);
BigInteger e = new BigInteger(EXPONENT);
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e);
KeyFactory fact = KeyFactory.getInstance("RSA");
PublicKey pubKey = fact.generatePublic(keySpec);
return pubKey;
编辑:
这就是我现在正在做的事情:(RSAPublic 是如上所述的 RSA_PUB_KEY 结构)。
//RSAPublic.bits = length of modulus in bits
log("Modulus length: "+std::to_string(RSAPublic.bits));
log("Key length: "+std::to_string(keyLengthInBits));
//Calculating buffer size for converted hexadec. representations
int modulusLengthInBytes = (RSAPublic.bits+7)/8 ;
int exponentLengthInBytes = (keyLengthInBits+7)/8;
char convertedMod[modulusLengthInBytes*2+1];
char convertedExp[exponentLengthInBytes*2+1];
//Conversion
int i;
for(i=0; i<modulusLengthInBytes ; i++){
sprintf(&convertedMod[i*2], "%02X", RSAPublic.modulus[i]);
}
for(i=0; i<exponentLengthInBytes ; i++){
sprintf(&convertedExp[i*2], "%02X", RSAPublic.exponent[i]);
}
//Print results
printf("Modulus: %s\n", convertedMod);
printf("Exponent: %s\n", convertedExp);
这是输出:
Modulus length: 16
Key length: 512
Modulus: 0000
Exponent: 0A000200FFFFFFFFFFFF0000600007004DDA0100B01D0000AEC642017A4513000000000000000000000000000000000000000000000000000000000000000000
最佳答案
我假设您不能只发送二进制数据,因为您提到了十六进制转换。以文本形式发送数据的最紧凑方式是使用基数 64,但这比十六进制更复杂。
客户端
使用您拥有的链接中的方法将无符号字符数组转换为十六进制字符串。 bits
字段将确定要使用 (bits+7)/8
给出的数组中的多少字节。
根据实现,您可能必须显式选择溢出位,否则其余部分可能会被清零,这也取决于字节顺序,因此,由于您不确定实现细节,您可能需要稍微修改一下。
获得编码字符串后,将它们发送到服务器。
服务器端
从连接中读取编码字符串,然后将它们传递给 BigInteger(String val, int radix)
使用十六进制基数 (16) 的构造函数。
然后您将得到一个包含您需要的值的 BigInteger
。
关于java - 提取存储在 unsigned char 数组中的 RSA 公钥模数和指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18154643/