java - 提取存储在 unsigned char 数组中的 RSA 公钥模数和指数

标签 java c++ cryptography rsa

因此,我使用的是一个专有库,它有自己的实现来创建 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/

相关文章:

java - 显示日历以在java中选择日期

cryptography - 使用 PBKDF2 key 派生通过 rust-crypto 正确创建用户可读的盐

java - 使用 AES 加密/解密并将信息存储在文本文件中

java - 返回 ArrayList 时出错 - 方法的返回类型不兼容(初学者)

java - 任务队列Java API

java - 在 Java 中运行动态数量的线程并返回值

c++ - 人们可以推荐任何好的 C++ 金融(最好是高频交易)书籍吗?

C++ - 是否可以在单元测试中实现内存泄漏测试?

c++ - 将 C 按位​​语句转换为 vb.net

linux - 如何使用 openssl 识别证书的 RSA 签名中使用的填充方案?