そのため、RSA キー ペアを作成するための独自の実装を持つ独自のライブラリを使用しています。公開鍵の構造体は次のようになります。
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
検証スキームの一部として指数とモジュールの両方をサーバーに送信できるように、指数とモジュールの両方を抽出する方法を見つける必要があります。これはかなり標準的な手順だと思います(またはそう願っています)。私はすでにこれらの2つの同様の質問を読みました:
しかし、これまでのところ、私は運がありませんでした。また、必要に応じて「ビット」フィールドを使用してモジュラスを抽出する方法もわかりません。つまり、私がしなければならないことは、この公開鍵を 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